diff --git a/.github/workflows/build_and_test_debug.yml b/.github/workflows/build_and_test_debug_client.yml similarity index 88% rename from .github/workflows/build_and_test_debug.yml rename to .github/workflows/build_and_test_debug_client.yml index f2c98cc8c0..0574cf4f26 100644 --- a/.github/workflows/build_and_test_debug.yml +++ b/.github/workflows/build_and_test_debug_client.yml @@ -1,7 +1,7 @@ -name: Build and Test +name: Build and Test / Client concurrency: - group: ${{ github.head_ref || github.ref }} + group: '${{ github.head_ref || github.ref }} Client' cancel-in-progress: true on: @@ -26,11 +26,12 @@ jobs: - name: Install Node uses: actions/setup-node@v3 with: - node-version: 18 + node-version-file: .nvmrc cache: npm + cache-dependency-path: ./package-lock.json - name: Install NPM Dependencies - run: npm ci + run: npm set cache .npm && npm ci - name: Run Linter run: npm run action lint @@ -58,8 +59,9 @@ jobs: - name: Install Node uses: actions/setup-node@v3 with: - node-version: 18 + node-version-file: .nvmrc cache: npm + cache-dependency-path: ./package-lock.json - name: Install NPM Dependencies run: npm ci @@ -87,8 +89,9 @@ jobs: - name: Install Node uses: actions/setup-node@v3 with: - node-version: 18 + node-version-file: .nvmrc cache: npm + cache-dependency-path: ./package-lock.json - name: Install NPM Dependencies run: npm ci @@ -116,8 +119,9 @@ jobs: - name: Install Node uses: actions/setup-node@v3 with: - node-version: 18 + node-version-file: .nvmrc cache: npm + cache-dependency-path: ./package-lock.json - name: Install NPM Dependencies run: npm ci @@ -157,8 +161,9 @@ jobs: - name: Install Node uses: actions/setup-node@v3 with: - node-version: 18 + node-version-file: .nvmrc cache: npm + cache-dependency-path: ./package-lock.json - name: Install NPM Dependencies run: npm ci @@ -198,8 +203,9 @@ jobs: - name: Install Node uses: actions/setup-node@v3 with: - node-version: 18 + node-version-file: .nvmrc cache: npm + cache-dependency-path: ./package-lock.json - name: Install NPM Dependencies run: npm ci @@ -236,8 +242,9 @@ jobs: - name: Install Node uses: actions/setup-node@v3 with: - node-version: 18 + node-version-file: .nvmrc cache: npm + cache-dependency-path: ./package-lock.json - name: Install NPM Dependencies run: npm ci diff --git a/.github/workflows/build_and_test_debug_manager.yml b/.github/workflows/build_and_test_debug_manager.yml new file mode 100644 index 0000000000..dd5f8401cf --- /dev/null +++ b/.github/workflows/build_and_test_debug_manager.yml @@ -0,0 +1,129 @@ +name: Build and Test / Manager + +concurrency: + group: '${{ github.head_ref || github.ref }} Manager' + cancel-in-progress: true + +on: + pull_request: + types: + - opened + - synchronize + push: + branches: + - master + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version-file: .nvmrc + cache: npm + cache-dependency-path: ./server_manager/package.json + + - name: Install NPM Dependencies + run: npm ci + + - name: Lint + run: npm run lint + + web_test: + name: Web Test + runs-on: ubuntu-latest + needs: lint + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version-file: .nvmrc + cache: npm + cache-dependency-path: ./server_manager/package.json + + - name: Install NPM Dependencies + run: npm ci + + - name: Manager Web Test + run: npm run action server_manager/test + + linux_debug_build: + name: Linux Debug Build + runs-on: ubuntu-latest + needs: web_test + env: + SENTRY_DSN: debug + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version-file: .nvmrc + cache: npm + cache-dependency-path: ./server_manager/package.json + + - name: Install NPM Dependencies + run: npm ci + + - name: Build Linux Manager + run: npm run action server_manager/electron_app/build linux + + windows_debug_build: + name: Windows Debug Build + # TODO(daniellacosse): port bash scripts to windows so we can build the manager on windows + runs-on: ubuntu-latest + needs: web_test + env: + SENTRY_DSN: debug + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version-file: .nvmrc + cache: npm + cache-dependency-path: ./server_manager/package.json + + - name: Install NPM Dependencies + run: npm ci + + - name: Build Windows Manager + run: npm run action server_manager/electron_app/build windows + + mac_debug_build: + name: MacOS Debug Build + runs-on: macos-11 + needs: web_test + env: + SENTRY_DSN: debug + steps: + - name: Checkout + uses: actions/checkout@v2.3.4 + + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version-file: .nvmrc + cache: npm + cache-dependency-path: ./server_manager/package.json + + - name: Install NPM Dependencies + run: npm ci + + - name: Set XCode Version + run: sudo xcode-select -switch /Applications/Xcode_13.2.app + + - name: Build MacOS Manager + run: npm run action server_manager/electron_app/build macos diff --git a/.gitignore b/.gitignore index db795c141d..ca0be6c62a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ *.pdb *.sw? /node_modules +/server_manager/node_modules +/server_manager/do_install_script.ts +/server_manager/gcp_install_script.ts /build /output /platforms diff --git a/Makefile b/Makefile index a6dbb2e11c..e7da6e6b70 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ $(BUILDDIR)/android/tun2socks.aar: $(GOMOBILE) $(BUILDDIR)/ios/Tun2socks.xcframework: $(GOMOBILE) # -iosversion should match what outline-client supports. - $(GOBIND) -iosversion=11.0 -target=ios,iossimulator -o $@ -ldflags '-w' -bundleid org.outline.tun2socks $(IMPORT_PATH)/$(ROOT_PKG)/outline/tun2socks $(IMPORT_PATH)/$(ROOT_PKG)/outline/shadowsocks + $(GOBIND) -iosversion=12.0 -target=ios,iossimulator -o $@ -ldflags '-w' -bundleid org.outline.tun2socks $(IMPORT_PATH)/$(ROOT_PKG)/outline/tun2socks $(IMPORT_PATH)/$(ROOT_PKG)/outline/shadowsocks $(BUILDDIR)/macos/Tun2socks.xcframework: $(GOMOBILE) # MACOSX_DEPLOYMENT_TARGET and -iosversion should match what outline-client supports. diff --git a/README.md b/README.md index 92ab8b7146..a545ffc9e0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Outline Client -![Build and Test](https://github.com/Jigsaw-Code/outline-client/actions/workflows/build_and_test_debug.yml/badge.svg?branch=master) [![Mattermost](https://badgen.net/badge/Mattermost/Outline%20Community/blue)](https://community.internetfreedomfestival.org/community/channels/outline-community) [![Reddit](https://badgen.net/badge/Reddit/r%2Foutlinevpn/orange)](https://www.reddit.com/r/outlinevpn/) +![Build and Test](https://github.com/Jigsaw-Code/outline-client/actions/workflows/build_and_test_debug_client.yml/badge.svg?branch=master) [![Mattermost](https://badgen.net/badge/Mattermost/Outline%20Community/blue)](https://community.internetfreedomfestival.org/community/channels/outline-community) [![Reddit](https://badgen.net/badge/Reddit/r%2Foutlinevpn/orange)](https://www.reddit.com/r/outlinevpn/) > **Test coverage currently only tracks the Apple Libraries and core web view code:** > diff --git a/commitlint.config.js b/commitlint.config.js index a123704e62..b04e929554 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -6,20 +6,24 @@ module.exports = { 'always', [ 'build', - 'cordova', - 'cordova/android', - 'cordova/apple', - 'cordova/apple/ios', - 'cordova/apple/macos', + 'client/cordova', + 'client/cordova/android', + 'client/cordova/apple', + 'client/cordova/apple/ios', + 'client/cordova/apple/macos', + 'client/electron', + 'client/electron/linux', + 'client/electron/windows', 'devtools', 'docs', - 'electron', - 'electron/linux', - 'electron/windows', - 'www', + 'manager', + 'manager/linux', + 'manager/mac', + 'manager/windows', 'service', 'service/linux', 'service/windows', + 'www', ], ], 'type-enum': [ diff --git a/package-lock.json b/package-lock.json index 6c79a084d2..414135f124 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,8 @@ "name": "outline-client", "version": "0.0.0", "workspaces": [ - "src/cordova/plugin" + "src/cordova/plugin", + "server_manager" ], "dependencies": { "@material/mwc-button": "^0.25.3", @@ -115,7 +116,7 @@ "outline-i18n": "Jigsaw-Code/outline-i18n#v0.0.7", "postcss": "^7.0.39", "postcss-rtl": "^1.7.3", - "prettier": "2.8", + "prettier": "^2.8.0", "pretty-quick": "^2.0.1", "puppeteer": "^13.1.2", "replace-in-file": "^6.3.5", @@ -133,8 +134,7 @@ "xmlbuilder2": "^3.1.1" }, "engines": { - "node": "^18.16.0", - "npm": "^9.5.1" + "node": "18.x.x" }, "optionalDependencies": { "ios-deploy": "^1.11.4" @@ -1810,6 +1810,23 @@ "node": ">=10.0.0" } }, + "node_modules/@electron/asar": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", + "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/@electron/get": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", @@ -1864,6 +1881,55 @@ "node": ">= 4.0.0" } }, + "node_modules/@electron/notarize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", + "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@electron/universal": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.2.1.tgz", @@ -1979,11 +2045,78 @@ "tslib": "^2.1.0" } }, + "node_modules/@formatjs/intl-unified-numberformat": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@formatjs/intl-unified-numberformat/-/intl-unified-numberformat-3.3.7.tgz", + "integrity": "sha512-KnWgLRHzCAgT9eyt3OS34RHoyD7dPDYhRcuKn+/6Kv2knDF8Im43J6vlSW6Hm1w63fNq3ZIT1cFk7RuVO3Psag==", + "deprecated": "We have renamed the package to @formatjs/intl-numberformat", + "dependencies": { + "@formatjs/intl-utils": "^2.3.0" + } + }, + "node_modules/@formatjs/intl-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-utils/-/intl-utils-2.3.0.tgz", + "integrity": "sha512-KWk80UPIzPmUg+P0rKh6TqspRw0G6eux1PuJr+zz47ftMaZ9QDwbGzHZbtzWkl5hgayM/qrKRutllRC7D/vVXQ==", + "deprecated": "the package is rather renamed to @formatjs/ecma-abstract with some changes in functionality (primarily selectUnit is removed and we don't plan to make any further changes to this package" + }, "node_modules/@gar/promisify": { "version": "1.1.3", "dev": true, "license": "MIT" }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'", + "dev": true + }, + "node_modules/@hapi/formula": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", + "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", + "deprecated": "Moved to 'npm install @sideway/formula'", + "dev": true + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/joi": { + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", + "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "deprecated": "Switch to 'npm install joi'", + "dev": true, + "dependencies": { + "@hapi/address": "^2.1.2", + "@hapi/formula": "^1.2.0", + "@hapi/hoek": "^8.2.4", + "@hapi/pinpoint": "^1.0.2", + "@hapi/topo": "^3.1.3" + } + }, + "node_modules/@hapi/pinpoint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", + "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", + "deprecated": "Moved to 'npm install @sideway/pinpoint'", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.4", "dev": true, @@ -2566,18 +2699,20 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2593,12 +2728,13 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsdevtools/coverage-istanbul-loader": { @@ -2650,9 +2786,9 @@ } }, "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", - "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", + "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==" }, "node_modules/@lit/reactive-element": { "version": "1.0.0-rc.4", @@ -4734,7 +4870,8 @@ }, "node_modules/@polymer/app-layout": { "version": "3.1.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/app-layout/-/app-layout-3.1.0.tgz", + "integrity": "sha512-+jf5/TtUDj/la9Vi59ooGNjnTN8JTkyIUK8gxAms0N3MmyeqrmcNLlJKDVyE6IIGKz0WfFeGKqKtmtTLHrZIlg==", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/iron-media-query": "^3.0.0-pre.26", @@ -4745,7 +4882,8 @@ }, "node_modules/@polymer/app-localize-behavior": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/app-localize-behavior/-/app-localize-behavior-3.0.1.tgz", + "integrity": "sha512-0OZuUIMlfYvSJbB+clU+UaEuSDsvyu997xM3aRW33mGWijgUFMprWUQIP12RM8Ob/2i7WXJPn5ew3ir+rwTARg==", "dependencies": { "@polymer/iron-ajax": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0", @@ -4776,7 +4914,8 @@ }, "node_modules/@polymer/font-roboto": { "version": "3.0.2", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.2.tgz", + "integrity": "sha512-tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==" }, "node_modules/@polymer/iron-a11y-announcer": { "version": "3.2.0", @@ -4801,7 +4940,8 @@ }, "node_modules/@polymer/iron-autogrow-textarea": { "version": "3.0.3", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.3.tgz", + "integrity": "sha512-5r0VkWrIlm0JIp5E5wlnvkw7slK72lFRZXncmrsLZF+6n1dg2rI8jt7xpFzSmUWrqpcyXwyKaGaDvUjl3j4JLA==", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -4826,6 +4966,15 @@ "@polymer/polymer": "^3.0.0" } }, + "node_modules/@polymer/iron-collapse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-collapse/-/iron-collapse-3.0.1.tgz", + "integrity": "sha512-yg6q5ZyckQR9VL9VmLrSTkSFXWy9AcJC8KtnD5cg0EHRPbakE8I9S/gVAgeP4nMWV2a/BjLLC4IBygcCMDhAGw==", + "dependencies": { + "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "node_modules/@polymer/iron-dropdown": { "version": "3.0.1", "license": "BSD-3-Clause", @@ -4838,7 +4987,8 @@ }, "node_modules/@polymer/iron-fit-behavior": { "version": "3.1.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.1.0.tgz", + "integrity": "sha512-ABcgIYqrjhmUT8tiuolqeGttF/8pd3sEymUDrO1vXbZu4FWIvoLNndrMDFvs++AGd12Mjf5pYy84NJc6dB8Vig==", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -4859,7 +5009,8 @@ }, "node_modules/@polymer/iron-icon": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/iron-icon/-/iron-icon-3.0.1.tgz", + "integrity": "sha512-QLPwirk+UPZNaLnMew9VludXA4CWUCenRewgEcGYwdzVgDPCDbXxy6vRJjmweZobMQv/oVLppT2JZtJFnPxX6g==", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/iron-meta": "^3.0.0-pre.26", @@ -4868,7 +5019,8 @@ }, "node_modules/@polymer/iron-icons": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/iron-icons/-/iron-icons-3.0.1.tgz", + "integrity": "sha512-xtEI8erH2GIBiF3QxEMyW81XuVjguu6Le5WjEEpX67qd9z7jjmc4T/ke3zRUlnDydex9p8ytcwVpMIKcyvjYAQ==", "dependencies": { "@polymer/iron-icon": "^3.0.0-pre.26", "@polymer/iron-iconset-svg": "^3.0.0-pre.26", @@ -4942,13 +5094,22 @@ }, "node_modules/@polymer/iron-pages": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/iron-pages/-/iron-pages-3.0.1.tgz", + "integrity": "sha512-PQe8S1JKHPcsIvFOaQP+9+AXmqUIL9fPqC6xT63OAZQxYCeZJDKgT9GKBx+VRryYBUlj2FLEXkUVpG+PTotdjg==", "dependencies": { "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", "@polymer/iron-selector": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" } }, + "node_modules/@polymer/iron-range-behavior": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-range-behavior/-/iron-range-behavior-3.0.1.tgz", + "integrity": "sha512-+jtL9v45M/T1RJleWyQaNH84S9/mIIR+AjNbYIttbKGp1eG+98j8MDWe7LXNtg79V2LQnE/+VS82cBeELyGVeg==", + "dependencies": { + "@polymer/polymer": "^3.0.0" + } + }, "node_modules/@polymer/iron-resizable-behavior": { "version": "3.0.1", "license": "BSD-3-Clause", @@ -4999,7 +5160,8 @@ }, "node_modules/@polymer/paper-button": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-button/-/paper-button-3.0.1.tgz", + "integrity": "sha512-JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/paper-behaviors": "^3.0.0-pre.27", @@ -5017,9 +5179,23 @@ "@polymer/polymer": "^3.0.0" } }, + "node_modules/@polymer/paper-checkbox": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@polymer/paper-checkbox/-/paper-checkbox-3.1.0.tgz", + "integrity": "sha512-kXm6yDG1tT8if0XuJ2cc9NF+g8Ev4wG+rnf0a+Sx+O7J6fn1jcnBlYn72FlrfjVjDQZDBFmT6nynhD5PvFw8iQ==", + "dependencies": { + "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", + "@polymer/iron-checked-element-behavior": "^3.0.0-pre.26", + "@polymer/paper-behaviors": "^3.0.0-pre.27", + "@polymer/paper-ripple": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "node_modules/@polymer/paper-dialog": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-dialog/-/paper-dialog-3.0.1.tgz", + "integrity": "sha512-KvglYbEq7AWJvui2j6WKLnOvgVMeGjovAydGrPRj7kVzCiD49Eq/hpYFJTRV5iDcalWH+mORUpw+jrFnG9+Kgw==", "dependencies": { "@polymer/iron-overlay-behavior": "^3.0.0-pre.27", "@polymer/neon-animation": "^3.0.0-pre.26", @@ -5036,9 +5212,21 @@ "@polymer/polymer": "^3.0.0" } }, + "node_modules/@polymer/paper-dialog-scrollable": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-dialog-scrollable/-/paper-dialog-scrollable-3.0.1.tgz", + "integrity": "sha512-1E8B9kNdL58jUrJ/BwqJeOoNVcxNrB559z//d1V0rVHWT5bWCCZegwS3G06iFK5MjxWFbIKzleVTLrT0opiZkA==", + "dependencies": { + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/paper-dialog-behavior": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "node_modules/@polymer/paper-dropdown-menu": { "version": "3.2.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-dropdown-menu/-/paper-dropdown-menu-3.2.0.tgz", + "integrity": "sha512-2ohwSHF+RLSK6kA0UkkMiMQF6EZcaEYWAA25kfisI6DWie7yozKrpQNsqvwfOEHU6DdDMIotrOtH1TM88YS8Zg==", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-form-element-behavior": "^3.0.0-pre.26", @@ -5055,7 +5243,8 @@ }, "node_modules/@polymer/paper-icon-button": { "version": "3.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-icon-button/-/paper-icon-button-3.0.2.tgz", + "integrity": "sha512-kOdxQgnKL097bggFF6PWvsBYuWg+MCcoHoTHX6bh/MuZoWFZNjrFntFqwuB4oEbpjCpfm4moA33muPJFj7CihQ==", "dependencies": { "@polymer/iron-icon": "^3.0.0-pre.26", "@polymer/paper-behaviors": "^3.0.0-pre.27", @@ -5065,7 +5254,8 @@ }, "node_modules/@polymer/paper-input": { "version": "3.2.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-input/-/paper-input-3.2.1.tgz", + "integrity": "sha512-6ghgwQKM6mS0hAQxQqj+tkeEY1VUBqAsrasAm8V5RpNcfSWQC/hhRFxU0beGuKTAhndzezDzWYP6Zz4b8fExGg==", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-autogrow-textarea": "^3.0.0-pre.26", @@ -5078,7 +5268,8 @@ }, "node_modules/@polymer/paper-item": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-item/-/paper-item-3.0.1.tgz", + "integrity": "sha512-KTk2N+GsYiI/HuubL3sxebZ6tteQbBOAp4QVLAnbjSPmwl+mJSDWk+omuadesU0bpkCwaWVs3fHuQsmXxy4pkw==", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -5088,7 +5279,8 @@ }, "node_modules/@polymer/paper-listbox": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-listbox/-/paper-listbox-3.0.1.tgz", + "integrity": "sha512-vMLWFpYcggAPmEDBmK+96fFefacOG3GLB1EguTn8+ZkqI+328hNfw1MzHjH68rgCIIUtjmm+9qgB1Sy/MN0a/A==", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-menu-behavior": "^3.0.0-pre.26", @@ -5109,6 +5301,17 @@ "@polymer/polymer": "^3.0.0" } }, + "node_modules/@polymer/paper-progress": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-progress/-/paper-progress-3.0.1.tgz", + "integrity": "sha512-5nguG+tmnyoaWKVNG8Smtno2uLSPBgEsT3f20JY8yJTjUBYWaqa8E3l5RLkTRXgA4x9OnvLb8/CdlQWXQIogBg==", + "dependencies": { + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/iron-range-behavior": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "node_modules/@polymer/paper-ripple": { "version": "3.0.2", "license": "BSD-3-Clause", @@ -5126,9 +5329,27 @@ "@polymer/polymer": "^3.0.0" } }, + "node_modules/@polymer/paper-tabs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@polymer/paper-tabs/-/paper-tabs-3.1.0.tgz", + "integrity": "sha512-t8G+3CiyI0R+wA077UNQXR/oG9GlsqRRO1KMsFHHjBSsYqWXghNsqxUG827wEj+PafI5u9tZ3vVt1S++Lg4B2g==", + "dependencies": { + "@polymer/iron-behaviors": "^3.0.0-pre.26", + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/iron-icon": "^3.0.0-pre.26", + "@polymer/iron-iconset-svg": "^3.0.0-pre.26", + "@polymer/iron-menu-behavior": "^3.0.0-pre.26", + "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", + "@polymer/paper-behaviors": "^3.0.0-pre.27", + "@polymer/paper-icon-button": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "node_modules/@polymer/paper-toast": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@polymer/paper-toast/-/paper-toast-3.0.1.tgz", + "integrity": "sha512-pizuogzObniDdICUc6dSLrnDt2VzzoRne1gCmbD6sfOATVv5tc8UfrqhA2iHngbNBEbniBiciS3iogdp5KTVUQ==", "dependencies": { "@polymer/iron-a11y-announcer": "^3.0.0-pre.26", "@polymer/iron-fit-behavior": "^3.0.0-pre.26", @@ -5136,6 +5357,15 @@ "@polymer/polymer": "^3.0.0" } }, + "node_modules/@polymer/paper-tooltip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz", + "integrity": "sha512-yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==", + "dependencies": { + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "node_modules/@polymer/polymer": { "version": "3.5.1", "license": "BSD-3-Clause", @@ -5215,233 +5445,130 @@ "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/@sentry/browser": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.31.1.tgz", - "integrity": "sha512-Rg9F61S1tz1Dv3iUyyGP26bxoi7WJAG2+f2fBbSmFuJ+JTH4Jvu2/F1bBig8Dz01ejzVhbNSUUCfoDhSvksIsQ==", + "node_modules/@sentry-internal/feedback": { + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.92.0.tgz", + "integrity": "sha512-/jEALRtVqboxB9kcK2tag8QCO6XANTlGBb9RV3oeGXJe0DDNJXRq6wVZbfgztXJRrfgx4XVDcNt1pRVoGGG++g==", "dependencies": { - "@sentry/core": "7.31.1", - "@sentry/replay": "7.31.1", - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1", - "tslib": "^1.9.3" + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@sentry/browser/node_modules/@sentry/core": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.31.1.tgz", - "integrity": "sha512-quaNU6z8jabmatBTDi28Wpff2yzfWIp/IU4bbi2QOtEiCNT+TQJXqlRTRMu9xLrX7YzyKCL5X2gbit/85lyWUg==", + "node_modules/@sentry-internal/tracing": { + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.92.0.tgz", + "integrity": "sha512-ur55vPcUUUWFUX4eVLNP71ohswK7ZZpleNZw9Y1GfLqyI+0ILQUwjtzqItJrdClvVsdRZJMRmDV40Hp9Lbb9mA==", "dependencies": { - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1", - "tslib": "^1.9.3" + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/browser/node_modules/@sentry/types": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.31.1.tgz", - "integrity": "sha512-1uzr2l0AxEnxUX/S0EdmXUQ15/kDsam8Nbdw4Gai8SU764XwQgA/TTjoewVP597CDI/AHKan67Y630/Ylmkx9w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/browser/node_modules/@sentry/utils": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.31.1.tgz", - "integrity": "sha512-ZsIPq29aNdP9q3R7qIzJhZ9WW+4DzE9g5SfGwx3UjTIxoRRBfdUJUbf7S+LKEdvCkKbyoDt6FLt5MiSJV43xBA==", + "node_modules/@sentry/browser": { + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.92.0.tgz", + "integrity": "sha512-loMr02/zQ38u8aQhYLtIBg0i5n3ps2e3GUXrt3CdsJQdkRYfa62gcrE7SzvoEpMVHTk7VOI4fWGht8cWw/1k3A==", "dependencies": { - "@sentry/types": "7.31.1", - "tslib": "^1.9.3" + "@sentry-internal/feedback": "7.92.0", + "@sentry-internal/tracing": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/replay": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sentry/core": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.30.0.tgz", - "integrity": "sha512-NeLigkBlpcK63ymM63GoIHurml6V3BUe1Vi+trwm4/qqOTzT7PQhvdJCX+o3+atzRBH+zdb6kd4VWx44Oye3KA==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.92.0.tgz", + "integrity": "sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ==", "dependencies": { - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "tslib": "^1.9.3" + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sentry/electron": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-4.2.0.tgz", - "integrity": "sha512-9r7Kb4BOPXNClsYvzWJ1Nppf5cL8sck9Li4KIAgCq/ofogPiE54fbUdJtx5Fkagon5sBSjy0gu74xuhnPexhoA==", - "dependencies": { - "@sentry/browser": "7.30.0", - "@sentry/core": "7.30.0", - "@sentry/node": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "deepmerge": "4.2.2", - "tslib": "^2.3.1" - } - }, - "node_modules/@sentry/electron/node_modules/@sentry/browser": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.30.0.tgz", - "integrity": "sha512-9hpaNAqIBDLdnrZ51iWkqenRotqqweE1f2AlHO56nyT/UE+u+GdmAiBrgRNqdFQQM13JtTG/gu4HGOyLWb9HEA==", - "dependencies": { - "@sentry/core": "7.30.0", - "@sentry/replay": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/electron/node_modules/@sentry/browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/electron/node_modules/@sentry/replay": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.30.0.tgz", - "integrity": "sha512-qJgz1tG0uStqMF5V7gN7KqxZuZY0MMQQY7siwPcSQVYj7X3AQswHjmvD4npEKbIa+jP6aQ6fFjoBjl3c0t3Mmg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-4.17.0.tgz", + "integrity": "sha512-1ThTHtn80E6h6mtt+V7tH03YW/vxwNfWrT8CxWSEUmtPQ/CPDpGZ8NN86lUwOPHjlSGBIYF4N33WVsGNhl+iAg==", "dependencies": { - "@sentry/core": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@sentry/browser": ">=7.24.0" + "@sentry/browser": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/node": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0", + "deepmerge": "4.3.0", + "tslib": "^2.5.0" } }, "node_modules/@sentry/electron/node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", "engines": { "node": ">=0.10.0" } }, "node_modules/@sentry/node": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.30.0.tgz", - "integrity": "sha512-YYasu6C3I0HBP4N1oc/ed2nunxhGJgtAWaKwq3lo8uk3uF6cB1A8+2e0CpjzU5ejhbaFPUBxHyj4th39Bvku/w==", - "dependencies": { - "@sentry/core": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.92.0.tgz", + "integrity": "sha512-LZeQL1r6kikEoOzA9K61OmMl32/lK/6PzmFNDH6z7UYwQopCZgVA6IP+CZuln8K2ys5c9hCyF7ICQMysXfpNJA==", + "dependencies": { + "@sentry-internal/tracing": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0", + "https-proxy-agent": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sentry/replay": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.31.1.tgz", - "integrity": "sha512-sLArvwZn6IwA/bASctyhxN7LhdCXJvMmyTynRfmk7pzuNzBMc5CNlHeIsDpHrfQuH53IKicvl6cHnHyclu5DSA==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.92.0.tgz", + "integrity": "sha512-G1t9Uvc9cR8VpNkElwvHIMGzykjIKikb10n0tfVd3e+rBPMCCjCPWOduwG6jZYxcvCjTpqmJh6NSLXxL/Mt4JA==", "dependencies": { - "@sentry/core": "7.31.1", - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1" + "@sentry-internal/tracing": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" }, "engines": { "node": ">=12" } }, - "node_modules/@sentry/replay/node_modules/@sentry/core": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.31.1.tgz", - "integrity": "sha512-quaNU6z8jabmatBTDi28Wpff2yzfWIp/IU4bbi2QOtEiCNT+TQJXqlRTRMu9xLrX7YzyKCL5X2gbit/85lyWUg==", - "dependencies": { - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/replay/node_modules/@sentry/types": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.31.1.tgz", - "integrity": "sha512-1uzr2l0AxEnxUX/S0EdmXUQ15/kDsam8Nbdw4Gai8SU764XwQgA/TTjoewVP597CDI/AHKan67Y630/Ylmkx9w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/replay/node_modules/@sentry/utils": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.31.1.tgz", - "integrity": "sha512-ZsIPq29aNdP9q3R7qIzJhZ9WW+4DzE9g5SfGwx3UjTIxoRRBfdUJUbf7S+LKEdvCkKbyoDt6FLt5MiSJV43xBA==", - "dependencies": { - "@sentry/types": "7.31.1", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/replay/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sentry/types": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.30.0.tgz", - "integrity": "sha512-l4A86typvt/SfWh5JffpdxNGkg5EEA8m35BzpIcKmCAQZUDmnb4b478r8jdD2uuOjLmPNmZr1tifdRW4NCLuxQ==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz", + "integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.30.0.tgz", - "integrity": "sha512-tSlBhr5u/LdE2emxIDTDmjmyRr99GnZGIAh5GwRxUgeDQ3VEfNUFlyFodBCbZ6yeYTYd6PWNih5xoHn1+Rf3Sw==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz", + "integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==", "dependencies": { - "@sentry/types": "7.30.0", - "tslib": "^1.9.3" + "@sentry/types": "7.92.0" }, "engines": { "node": ">=8" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -5651,6 +5778,12 @@ "integrity": "sha512-nOcaDp0Qa1i5T0IUeW5y8jiGD2VaOj9RV5FzfV5fpMBJ0vkPIC+NV9ELKHwooxBVEN2+mI0J+v6NC7oiEXpnLQ==", "dev": true }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "dev": true + }, "node_modules/@types/chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", @@ -5793,6 +5926,12 @@ "@types/node": "*" } }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, "node_modules/@types/express": { "version": "4.17.13", "dev": true, @@ -5834,6 +5973,12 @@ "@types/node": "*" } }, + "node_modules/@types/hapi__joi": { + "version": "17.1.14", + "resolved": "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-17.1.14.tgz", + "integrity": "sha512-elV1VhwXUfA1sw59ij75HWyCH+3cA7xLbaOY9GQ+iQo/S+jSSf22LNZAmsXMdfV8DZwquCZaCT+F43Xf6/txrQ==", + "dev": true + }, "node_modules/@types/hast": { "version": "2.3.4", "dev": true, @@ -6161,6 +6306,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/parse5": { "version": "6.0.3", "dev": true, @@ -6197,6 +6351,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/puppeteer": { + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.7.tgz", + "integrity": "sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.7", "dev": true, @@ -6207,6 +6370,32 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "dev": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "dev": true, @@ -6274,6 +6463,12 @@ "@types/node": "*" } }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, "node_modules/@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", @@ -6296,6 +6491,16 @@ "dev": true, "optional": true }, + "node_modules/@types/vinyl": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.11.tgz", + "integrity": "sha512-vPXzCLmRp74e9LsP8oltnWKTH+jBwt86WgRUb4Pc9Lf3pkMVGyvIo2gm9bODeGfCay2DBB/hAWDuvf07JcK4rw==", + "dev": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, "node_modules/@types/webcomponents.js": { "version": "0.6.37", "dev": true, @@ -6912,133 +7117,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "dev": true, - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "dev": true, - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "dev": true, - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "dev": true, - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "dev": true, - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, - "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -7047,8 +7267,9 @@ "license": "BSD-3-Clause" }, "node_modules/@webcomponents/webcomponentsjs": { - "version": "2.6.0", - "license": "BSD-3-Clause" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz", + "integrity": "sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==" }, "node_modules/@webpack-cli/configtest": { "version": "1.2.0", @@ -7085,13 +7306,15 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, "node_modules/@xtuc/long": { "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, "node_modules/7zip-bin": { "version": "5.1.1", @@ -7111,7 +7334,6 @@ }, "node_modules/accepts": { "version": "1.3.8", - "dev": true, "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -7122,9 +7344,10 @@ } }, "node_modules/acorn": { - "version": "8.8.0", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -7133,9 +7356,10 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -7199,7 +7423,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -7330,6 +7553,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "dev": true, @@ -7363,6 +7598,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/any-base": { "version": "1.1.0", "dev": true, @@ -7471,6 +7715,18 @@ "node": ">=10" } }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/append-type": { "version": "1.0.2", "dev": true, @@ -7484,6 +7740,33 @@ "dev": true, "license": "ISC" }, + "node_modules/archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", + "dev": true, + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" @@ -7574,6 +7857,57 @@ "node": ">=0.8.0" } }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-back": { "version": "3.1.0", "dev": true, @@ -7603,9 +7937,26 @@ "node": ">=8" } }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", - "dev": true, "license": "MIT" }, "node_modules/array-ify": { @@ -7631,6 +7982,81 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-to-sentence": { "version": "1.1.0", "dev": true, @@ -7652,6 +8078,15 @@ "node": ">=0.10.0" } }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.0", "dev": true, @@ -7717,7 +8152,6 @@ }, "node_modules/arrify": { "version": "2.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7747,7 +8181,6 @@ }, "node_modules/asn1": { "version": "0.2.6", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" @@ -7755,7 +8188,6 @@ }, "node_modules/assert-plus": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8" @@ -7770,6 +8202,15 @@ "validate-glob-opts": "^1.0.0" } }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ast-metadata-inferer": { "version": "0.7.0", "dev": true, @@ -7798,6 +8239,33 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/async-exit-hook": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", @@ -7807,9 +8275,20 @@ "node": ">=0.12.0" } }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/asynckit": { "version": "0.4.0", - "dev": true, "license": "MIT" }, "node_modules/at-least-node": { @@ -7820,6 +8299,18 @@ "node": ">= 4.0.0" } }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/auto-launch": { "version": "5.0.5", "license": "MIT", @@ -7848,7 +8339,6 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", - "dev": true, "license": "Apache-2.0", "engines": { "node": "*" @@ -7856,7 +8346,6 @@ }, "node_modules/aws4": { "version": "1.11.0", - "dev": true, "license": "MIT" }, "node_modules/axe-core": { @@ -8133,6 +8622,26 @@ "dev": true, "license": "MIT" }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -8153,6 +8662,36 @@ "dev": true, "license": "MIT" }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/base64-arraybuffer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", @@ -8164,7 +8703,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "dev": true, "funding": [ { "type": "github", @@ -8196,7 +8734,6 @@ }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" @@ -8218,6 +8755,323 @@ "node": "*" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "dependencies": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/bin-build/node_modules/download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "dependencies": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "dependencies": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/is-plain-obj": { + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/bin-build/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", + "dev": true, + "dependencies": { + "p-timeout": "^1.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/path-key": { + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==", + "dev": true, + "dependencies": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dev": true, + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/bin-build/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, "node_modules/binary-extensions": { "version": "2.2.0", "dev": true, @@ -8226,6 +9080,28 @@ "node": ">=8" } }, + "node_modules/binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "dev": true, + "engines": { + "node": ">=0.8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/bl": { "version": "4.1.0", "dev": true, @@ -8275,9 +9151,9 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.0", - "dev": true, - "license": "MIT", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -8287,7 +9163,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -8299,7 +9175,6 @@ }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -8307,7 +9182,6 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -8315,7 +9189,6 @@ }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -8326,7 +9199,6 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/bonjour-service": { @@ -8403,7 +9275,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.3", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "funding": [ { "type": "opencollective", @@ -8412,14 +9286,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -8515,6 +9392,11 @@ "node": ">=0.4.0" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -8664,6 +9546,26 @@ "dev": true, "license": "ISC" }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cache-content-type": { "version": "1.0.1", "dev": true, @@ -8720,7 +9622,6 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.1", @@ -8796,6 +9697,28 @@ "node": ">= 6" } }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -8809,9 +9732,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", + "version": "1.0.30001585", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", + "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", "funding": [ { "type": "opencollective", @@ -8820,14 +9743,32 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/caseless": { "version": "0.12.0", - "dev": true, "license": "Apache-2.0" }, + "node_modules/caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "dependencies": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ccount": { "version": "1.1.0", "dev": true, @@ -8953,6 +9894,51 @@ "node": ">=8" } }, + "node_modules/circle-flags": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/HatScripts/circle-flags.git#7b0dc8acd3b1c5994281832b9f03cc7c537617c5", + "license": "MIT" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/clean-css": { "version": "4.2.4", "dev": true, @@ -9001,6 +9987,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clipboard-polyfill": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/clipboard-polyfill/-/clipboard-polyfill-2.8.6.tgz", + "integrity": "sha512-kz/1ov+PXsBpGnW9XJH3dLWdYj12FpXqO89Dngm/GRPoI36E/tnYs6N0YPTEhxM9WHAlFiN5eoyIVuv5nzKXvg==" + }, "node_modules/cliui": { "version": "7.0.4", "dev": true, @@ -9019,6 +10010,15 @@ "node": ">=0.8" } }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "dev": true, @@ -9044,6 +10044,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, "node_modules/co": { "version": "4.6.0", "dev": true, @@ -9082,6 +10099,33 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "dev": true, @@ -9098,6 +10142,15 @@ "dev": true, "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorette": { "version": "2.0.19", "dev": true, @@ -9114,7 +10167,6 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -9354,12 +10406,89 @@ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, - "optional": true, "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, + "node_modules/config-file-ts": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", + "dev": true, + "dependencies": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/config-file-ts/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/connect": { "version": "3.7.0", "dev": true, @@ -9444,7 +10573,6 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -9455,7 +10583,6 @@ }, "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", - "dev": true, "funding": [ { "type": "github", @@ -9474,7 +10601,6 @@ }, "node_modules/content-type": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9503,6 +10629,7 @@ }, "node_modules/cookie": { "version": "0.4.2", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9510,7 +10637,6 @@ }, "node_modules/cookie-signature": { "version": "1.0.6", - "dev": true, "license": "MIT" }, "node_modules/cookies": { @@ -9538,11 +10664,39 @@ "run-queue": "^1.0.0" } }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/copy-dir": { "version": "1.3.0", "dev": true, "license": "MIT" }, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/copy-webpack-plugin": { "version": "5.1.2", "dev": true, @@ -10879,6 +12033,18 @@ "node": ">=4" } }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/custom-event": { "version": "1.0.1", "dev": true, @@ -10889,9 +12055,18 @@ "dev": true, "license": "MIT" }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "node_modules/dashdash": { "version": "1.14.1", - "dev": true, "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -10945,6 +12120,34 @@ "node": ">=0.10.0" } }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -10957,6 +12160,208 @@ "node": ">=4" } }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-tar/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dedent": { "version": "0.7.0", "dev": true, @@ -10989,6 +12394,27 @@ "node": ">=0.10.0" } }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-gateway": { "version": "6.0.3", "dev": true, @@ -11000,6 +12426,15 @@ "node": ">= 10" } }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -11045,6 +12480,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/del": { "version": "3.0.0", "dev": true, @@ -11105,7 +12553,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -11129,7 +12576,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -11146,7 +12592,6 @@ }, "node_modules/destroy": { "version": "1.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8", @@ -11165,6 +12610,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detect-indent": { "version": "6.1.0", "dev": true, @@ -11461,6 +12915,236 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "node_modules/download": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", + "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", + "dev": true, + "dependencies": { + "archive-type": "^4.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.2.1", + "ext-name": "^5.0.0", + "file-type": "^11.1.0", + "filenamify": "^3.0.0", + "get-stream": "^4.1.0", + "got": "^8.3.1", + "make-dir": "^2.1.0", + "p-event": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/download/node_modules/@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", + "dev": true, + "dependencies": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } + }, + "node_modules/download/node_modules/cacheable-request/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/download/node_modules/file-type": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", + "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/download/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/download/node_modules/got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/got/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "node_modules/download/node_modules/is-plain-obj": { + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/download/node_modules/keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/download/node_modules/lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/download/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/download/node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/download/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/download/node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -11483,6 +13167,16 @@ "dev": true, "license": "MIT" }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -11491,16 +13185,22 @@ }, "node_modules/ecc-jsbn": { "version": "0.1.2", - "dev": true, "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", - "dev": true, "license": "MIT" }, "node_modules/ejs": { @@ -11617,6 +13317,20 @@ "electron-icon-maker": "index.js" } }, + "node_modules/electron-notarize": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.2.2.tgz", + "integrity": "sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw==", + "deprecated": "Please use @electron/notarize moving forward. There is no API change, just a package name change", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/electron-osx-sign": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz", @@ -11725,8 +13439,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.215", - "license": "ISC" + "version": "1.4.659", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.659.tgz", + "integrity": "sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==" }, "node_modules/electron-updater": { "version": "5.2.1", @@ -11804,7 +13519,6 @@ }, "node_modules/encodeurl": { "version": "1.0.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -11812,7 +13526,6 @@ }, "node_modules/encoding": { "version": "0.1.13", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -11954,9 +13667,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -12322,9 +14036,10 @@ "dev": true }, "node_modules/es-module-lexer": { - "version": "1.0.3", - "dev": true, - "license": "MIT" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true }, "node_modules/es-module-shims": { "version": "1.5.14", @@ -12369,6 +14084,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -12376,11 +14106,44 @@ "dev": true, "optional": true }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "node_modules/es6-promise": { "version": "4.2.8", "dev": true, "license": "MIT" }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "node_modules/esbuild": { "version": "0.12.29", "dev": true, @@ -12399,7 +14162,6 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { @@ -13035,7 +14797,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -13080,6 +14841,97 @@ "version": "0.1.12", "dev": true }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -13087,13 +14939,13 @@ "dev": true }, "node_modules/express": { - "version": "4.18.1", - "dev": true, - "license": "MIT", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -13112,7 +14964,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -13129,7 +14981,6 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -13137,7 +14988,6 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -13145,12 +14995,10 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", - "dev": true, "funding": [ { "type": "github", @@ -13167,11 +15015,115 @@ ], "license": "MIT" }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, "node_modules/extend": { "version": "3.0.2", - "dev": true, "license": "MIT" }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extract-zip": { "version": "1.7.0", "dev": true, @@ -13207,15 +15159,29 @@ ], "license": "MIT" }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -13235,7 +15201,6 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -13243,6 +15208,11 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "dev": true, @@ -13361,6 +15331,13 @@ "node": ">=6" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "node_modules/file-url": { "version": "2.0.2", "dev": true, @@ -13399,6 +15376,29 @@ "node": ">=10" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", + "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/fill-range": { "version": "7.0.1", "dev": true, @@ -13412,7 +15412,6 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -13429,7 +15428,6 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -13437,7 +15435,6 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/find-cache-dir": { @@ -13496,6 +15493,157 @@ "node": ">=0.6" } }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/findup-sync/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/findup/node_modules/colors": { "version": "0.6.2", "dev": true, @@ -13510,6 +15658,31 @@ "node": ">= 0.6.x" } }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/flat": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", @@ -13591,6 +15764,27 @@ "is-callable": "^1.1.3" } }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -13621,7 +15815,6 @@ }, "node_modules/forever-agent": { "version": "0.6.1", - "dev": true, "license": "Apache-2.0", "engines": { "node": "*" @@ -13655,15 +15848,25 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fresh": { "version": "0.5.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -13708,6 +15911,19 @@ "node": ">= 8" } }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/fs-monkey": { "version": "1.0.3", "dev": true, @@ -13742,9 +15958,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "license": "MIT" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -13778,6 +15997,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gaxios/node_modules/node-fetch": { + "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" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/gaxios/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/gaxios/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/gaxios/node_modules/whatwg-url": { + "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" + } + }, + "node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, @@ -13798,7 +16081,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -13809,6 +16091,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "dependencies": { + "npm-conf": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/get-stdin": { "version": "6.0.0", "dev": true, @@ -13851,9 +16145,17 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/getpass": { "version": "0.1.7", - "dev": true, "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" @@ -13916,11 +16218,329 @@ "node": ">= 6" } }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, "license": "BSD-2-Clause" }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/glob-watcher/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/glob-watcher/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/glob-watcher/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/glob-watcher/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/global": { "version": "4.4.0", "dev": true, @@ -13964,6 +16584,48 @@ "node": ">=10" } }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/global-tunnel-ng": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", @@ -14032,6 +16694,51 @@ "dev": true, "license": "MIT" }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -14102,6 +16809,266 @@ "node": ">=4.x" } }, + "node_modules/gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/ansi-regex": { + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/gulp-cli/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/gulp-cli/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/gulp-posthtml": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/gulp-posthtml/-/gulp-posthtml-3.0.5.tgz", + "integrity": "sha512-3+whkhaYkZyp7Tl97/laTxy+Q43tL1Nk07DAXcBK3jbkmLeRwBpq6pPT2UAkDaI1wgN6jfBfXSaGcX5nzET6Ww==", + "dev": true, + "dependencies": { + "plugin-error": "^1.0.1", + "posthtml": "^0.11.6", + "posthtml-load-config": "^1.0.0", + "through2": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-posthtml/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/gulp-replace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.4.tgz", + "integrity": "sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/vinyl": "^2.0.4", + "istextorbinary": "^3.0.0", + "replacestream": "^4.0.3", + "yargs-parser": ">=5.0.0-security.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "dev": true, @@ -14130,7 +17097,6 @@ }, "node_modules/har-schema": { "version": "2.0.0", - "dev": true, "license": "ISC", "engines": { "node": ">=4" @@ -14138,7 +17104,6 @@ }, "node_modules/har-validator": { "version": "5.1.5", - "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.3", @@ -14150,7 +17115,6 @@ }, "node_modules/has": { "version": "1.0.3", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.1" @@ -14230,7 +17194,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -14238,9 +17201,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/has-symbols": { "version": "1.0.3", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -14249,6 +17220,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/has-tostringtag": { "version": "1.0.0", "dev": true, @@ -14269,6 +17252,75 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hasha": { "version": "2.2.0", "dev": true, @@ -14289,6 +17341,18 @@ "node": ">=0.10.0" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-to-hyperscript": { "version": "9.0.1", "dev": true, @@ -14477,6 +17541,18 @@ "he": "bin/he" } }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "dev": true, @@ -14559,9 +17635,10 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, - "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -14577,7 +17654,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -14654,7 +17740,6 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "dev": true, "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -14735,7 +17820,6 @@ }, "node_modules/http-signature": { "version": "1.2.0", - "dev": true, "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", @@ -15042,7 +18126,7 @@ }, "node_modules/iconv-lite": { "version": "0.6.3", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -15076,9 +18160,10 @@ "license": "MIT" }, "node_modules/ignore": { - "version": "5.2.0", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -15192,15 +18277,13 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "optional": true + "dev": true }, "node_modules/init-package-json": { "version": "2.0.5", @@ -15273,6 +18356,11 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/intl-format-cache": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.3.1.tgz", + "integrity": "sha512-OEUYNA7D06agqPOYhbTkl0T8HA3QKSuwWh1HiClEnpd9vw7N+3XsQt5iZ0GUEchp5CW1fQk/tary+NsbF3yQ1Q==" + }, "node_modules/intl-messageformat": { "version": "9.13.0", "dev": true, @@ -15288,6 +18376,19 @@ "version": "1.4.0", "license": "BSD-3-Clause" }, + "node_modules/into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", + "dev": true, + "dependencies": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/invert-kv": { "version": "1.0.0", "dev": true, @@ -15345,14 +18446,47 @@ "version": "1.1.8", "license": "MIT" }, + "node_modules/ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha512-HjpCHTuxbR/6jWJroc/VN+npo5j0T4Vv2TAI5qdEHQx7hsL767MeccGFSsLtF694EiZKTSEqgoeU6DtGFCcuqQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" } }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-alphabetical": { "version": "1.0.4", "dev": true, @@ -15502,6 +18636,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "dev": true, @@ -15525,6 +18671,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/is-directory": { "version": "0.3.1", "dev": true, @@ -15547,6 +18706,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "dev": true, @@ -15555,6 +18726,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -15602,6 +18785,39 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "dev": true, + "dependencies": { + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "dev": true, @@ -15612,6 +18828,21 @@ "dev": true, "license": "MIT" }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -15653,6 +18884,15 @@ "node": ">=8" } }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-cwd": { "version": "1.0.0", "dev": true, @@ -15725,6 +18965,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "dev": true, @@ -15738,7 +18999,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15792,14 +19052,46 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "dev": true, "license": "MIT" }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-utf8": { "version": "0.2.1", "dev": true, "license": "MIT" }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", + "dev": true, + "dependencies": { + "is-invalid-path": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -15820,6 +19112,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-word-character": { "version": "1.0.4", "dev": true, @@ -15871,7 +19172,6 @@ }, "node_modules/isstream": { "version": "0.1.2", - "dev": true, "license": "MIT" }, "node_modules/istanbul": { @@ -16170,6 +19470,35 @@ "which": "bin/which" } }, + "node_modules/istextorbinary": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", + "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", + "dev": true, + "dependencies": { + "binaryextensions": "^2.2.0", + "textextensions": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/jackspeak": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", @@ -16286,7 +19615,6 @@ }, "node_modules/jsbn": { "version": "0.1.1", - "dev": true, "license": "MIT" }, "node_modules/jsesc": { @@ -16300,6 +19628,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -16318,12 +19654,10 @@ }, "node_modules/json-schema": { "version": "0.4.0", - "dev": true, "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -16333,7 +19667,6 @@ }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "dev": true, "license": "ISC" }, "node_modules/json5": { @@ -16358,6 +19691,11 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonic": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/jsonic/-/jsonic-0.3.1.tgz", + "integrity": "sha512-5Md4EK3vPAMvP2sXY6M3/vQEPeX3LxEQBJuF979uypddXjsUlEoAI9/Nojh8tbw+YU5FjMoqSElO6oyjrAuprw==" + }, "node_modules/jsonparse": { "version": "1.3.1", "dev": true, @@ -16368,7 +19706,6 @@ }, "node_modules/jsprim": { "version": "1.4.2", - "dev": true, "license": "MIT", "dependencies": { "assert-plus": "1.0.0", @@ -16382,12 +19719,10 @@ }, "node_modules/jsprim/node_modules/core-util-is": { "version": "1.0.2", - "dev": true, "license": "MIT" }, "node_modules/jsprim/node_modules/extsprintf": { "version": "1.3.0", - "dev": true, "engines": [ "node >=0.6.0" ], @@ -16395,7 +19730,6 @@ }, "node_modules/jsprim/node_modules/verror": { "version": "1.10.0", - "dev": true, "engines": [ "node >=0.6.0" ], @@ -16406,6 +19740,31 @@ "extsprintf": "^1.2.0" } }, + "node_modules/just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/karma": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", @@ -17141,10 +20500,51 @@ "node": ">= 0.6" } }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/launch-editor/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/lazy-val": { "version": "1.0.5", "license": "MIT" }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, "node_modules/lcid": { "version": "1.0.0", "dev": true, @@ -17156,6 +20556,18 @@ "node": ">=0.10.0" } }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/levn": { "version": "0.4.1", "dev": true, @@ -17168,6 +20580,37 @@ "node": ">= 0.8.0" } }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/lit": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", @@ -17550,6 +20993,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lower-case": { "version": "2.0.2", "dev": true, @@ -17567,11 +21023,6 @@ "node": ">=0.10.0" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, "node_modules/lru-cache": { "version": "6.0.0", "license": "ISC", @@ -17729,6 +21180,48 @@ "node": ">= 8" } }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/markdown-escapes": { "version": "1.0.4", "dev": true, @@ -17750,6 +21243,184 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/matchdep/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -17947,7 +21618,6 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -17964,9 +21634,56 @@ "node": ">= 4.0.0" } }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "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==", + "dev": true + }, + "node_modules/meow/node_modules/normalize-package-data": { + "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==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", - "dev": true, "license": "MIT" }, "node_modules/merge-source-map": { @@ -17993,7 +21710,6 @@ }, "node_modules/methods": { "version": "1.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -18117,7 +21833,6 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -18125,7 +21840,6 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -18298,6 +22012,19 @@ "node": ">=4.0.0" } }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "license": "MIT", @@ -18874,6 +22601,15 @@ "node": ">=8" } }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/mute-stream": { "version": "0.0.8", "dev": true, @@ -18890,15 +22626,29 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "dev": true, + "optional": true + }, "node_modules/nanocolors": { "version": "0.2.13", "dev": true, "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.4", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -18906,6 +22656,28 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -18913,7 +22685,6 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -18924,6 +22695,12 @@ "dev": true, "license": "MIT" }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, "node_modules/nice-try": { "version": "1.0.5", "dev": true, @@ -19003,8 +22780,8 @@ }, "node_modules/node-forge": { "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "engines": { "node": ">= 6.13.0" } @@ -19300,9 +23077,30 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/node-jq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/node-jq/-/node-jq-1.12.0.tgz", + "integrity": "sha512-WRFwaguXJ8PAA0s660eRrPoubSOyvu1YsbpXdIMiG8uhnf7g/QgwZPBjDgDBTFL8cptd3rsB5YzofQ8Ff9bTFw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@hapi/joi": "^16.1.7", + "@types/hapi__joi": "^17.1.0", + "bin-build": "^3.0.0", + "download": "^8.0.0", + "is-valid-path": "^0.1.1", + "strip-eof": "^1.0.0", + "strip-final-newline": "^2.0.0", + "tempfile": "^3.0.0" + }, + "engines": { + "npm": ">=6.0.0" + } + }, "node_modules/node-releases": { - "version": "2.0.6", - "license": "MIT" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/nopt": { "version": "5.0.0", @@ -19363,6 +23161,18 @@ "node": ">=8" } }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/npm-bundled": { "version": "1.1.2", "dev": true, @@ -19376,7 +23186,6 @@ "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", "dev": true, - "optional": true, "dependencies": { "config-chain": "^1.1.11", "pify": "^3.0.0" @@ -19390,7 +23199,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "optional": true, "engines": { "node": ">=4" } @@ -19542,7 +23350,6 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", - "dev": true, "license": "Apache-2.0", "engines": { "node": "*" @@ -19556,11 +23363,67 @@ "node": ">=0.10.0" } }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19573,6 +23436,18 @@ "node": ">= 0.4" } }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -19591,6 +23466,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object.getownpropertydescriptors": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", @@ -19610,6 +23500,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object.values": { "version": "1.1.5", "dev": true, @@ -19643,7 +23571,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "dev": true, "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -19737,6 +23664,15 @@ "node": ">= 0.8.0" } }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "dev": true, @@ -19779,6 +23715,10 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/outline-manager": { + "resolved": "server_manager", + "link": true + }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -19788,6 +23728,18 @@ "node": ">=6" } }, + "node_modules/p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/p-finally": { "version": "1.0.0", "dev": true, @@ -19796,6 +23748,15 @@ "node": ">=4" } }, + "node_modules/p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "2.3.0", "dev": true, @@ -19846,6 +23807,27 @@ "node": ">=4" } }, + "node_modules/p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==", + "dev": true, + "dependencies": { + "p-reduce": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/p-retry": { "version": "4.6.2", "dev": true, @@ -19866,6 +23848,18 @@ "node": ">= 4" } }, + "node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/p-try": { "version": "2.2.0", "dev": true, @@ -20063,6 +24057,20 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/parse-headers": { "version": "2.0.5", "dev": true, @@ -20080,6 +24088,24 @@ "node": ">=4" } }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse5": { "version": "6.0.1", "dev": true, @@ -20099,7 +24125,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -20114,6 +24139,15 @@ "tslib": "^2.0.3" } }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-dirname": { "version": "1.0.2", "dev": true, @@ -20152,6 +24186,27 @@ "dev": true, "license": "MIT" }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-scurry": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", @@ -20218,7 +24273,6 @@ }, "node_modules/path-to-regexp": { "version": "0.1.7", - "dev": true, "license": "MIT" }, "node_modules/path-type": { @@ -20236,7 +24290,6 @@ }, "node_modules/performance-now": { "version": "2.1.0", - "dev": true, "license": "MIT" }, "node_modules/phantomjs-prebuilt": { @@ -20430,6 +24483,33 @@ "node": ">=6" } }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/plugins-manager": { "version": "0.3.1", "dev": true, @@ -20556,6 +24636,15 @@ "ms": "^2.1.1" } }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/postcss": { "version": "7.0.39", "dev": true, @@ -20600,6 +24689,382 @@ "dev": true, "license": "MIT" }, + "node_modules/posthtml": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz", + "integrity": "sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.4.1", + "posthtml-render": "^1.1.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/posthtml-load-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/posthtml-load-config/-/posthtml-load-config-1.0.0.tgz", + "integrity": "sha512-GCgc8x9esPszRG/jt8Mswc0JAf4HS03Thm8P9Ks1IOa8CVvugT8C746SaBlSNhn890Bq7tZHHvTv4gvB4zkJUQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.0", + "posthtml-load-options": "^1.0.0" + }, + "engines": { + "node": ">=4", + "npm": ">=3" + } + }, + "node_modules/posthtml-load-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/posthtml-load-config/node_modules/cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "dependencies": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/posthtml-load-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/posthtml-load-config/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-load-config/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-load-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/posthtml-load-options": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/posthtml-load-options/-/posthtml-load-options-1.0.0.tgz", + "integrity": "sha512-PqHMD4MxlodWX0O3i/MvQpLCwL6MTM7FL5+Ami/827jKlPvE5doZl6NSk6E87aLtkrVxJAW0DH85+YSUuGIJZg==", + "dev": true, + "dependencies": { + "cosmiconfig": "^2.1.0" + }, + "engines": { + "node": ">=4", + "npm": ">=3" + } + }, + "node_modules/posthtml-load-options/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/posthtml-load-options/node_modules/cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "dependencies": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/posthtml-load-options/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/posthtml-load-options/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-load-options/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-load-options/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/posthtml-parser": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz", + "integrity": "sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.9.2" + } + }, + "node_modules/posthtml-parser/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/posthtml-parser/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/posthtml-parser/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/posthtml-parser/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/posthtml-parser/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/posthtml-parser/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "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" + } + }, + "node_modules/posthtml-parser/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/posthtml-postcss": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/posthtml-postcss/-/posthtml-postcss-0.2.6.tgz", + "integrity": "sha512-p2zrMw6tf9wnQZVe3IFiYtef+++6hC/Ab6e1RqVG7THdn8/y6i7Z/O3b/7j7PfoM0ygBkfq5ezcMU+OI7Y+MWQ==", + "dev": true, + "dependencies": { + "postcss": "^6.0.14" + } + }, + "node_modules/posthtml-postcss/node_modules/ansi-styles": { + "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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/posthtml-postcss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/posthtml-postcss/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/posthtml-postcss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/posthtml-postcss/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/posthtml-postcss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/posthtml-postcss/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/posthtml-postcss/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -20641,6 +25106,15 @@ "renderkid": "^3.0.0" } }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/pretty-quick": { "version": "2.0.2", "dev": true, @@ -20903,12 +25377,10 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "optional": true + "dev": true }, "node_modules/proxy-addr": { "version": "2.0.7", - "dev": true, "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -20931,7 +25403,6 @@ }, "node_modules/psl": { "version": "1.9.0", - "dev": true, "license": "MIT" }, "node_modules/pump": { @@ -21074,9 +25545,9 @@ } }, "node_modules/qs": { - "version": "6.10.3", - "dev": true, - "license": "BSD-3-Clause", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -21087,6 +25558,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/querystring": { "version": "0.2.0", "dev": true, @@ -21123,7 +25608,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -21131,7 +25615,6 @@ }, "node_modules/raw-body": { "version": "2.5.1", - "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -21145,7 +25628,6 @@ }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -21153,7 +25635,6 @@ }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -21409,6 +25890,31 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "dev": true, @@ -21446,6 +25952,19 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -21923,6 +26442,45 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-buffer/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, "node_modules/renderkid": { "version": "3.0.0", "dev": true, @@ -21935,6 +26493,15 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/repeat-string": { "version": "1.6.1", "dev": true, @@ -21943,6 +26510,18 @@ "node": ">=0.10" } }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -21952,6 +26531,20 @@ "node": ">= 0.10" } }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/replace-in-file": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz", @@ -21985,10 +26578,31 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/replacestream/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/request": { "version": "2.88.2", - "dev": true, - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -22025,7 +26639,6 @@ }, "node_modules/request/node_modules/form-data": { "version": "2.3.3", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -22038,7 +26651,6 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.6" @@ -22110,6 +26722,19 @@ "node": ">=8" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "dev": true, @@ -22118,6 +26743,18 @@ "node": ">=4" } }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/resolve-path": { "version": "1.4.0", "dev": true, @@ -22170,6 +26807,13 @@ "node": ">= 0.6" } }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -22192,6 +26836,15 @@ "node": ">=8" } }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, "node_modules/retry": { "version": "0.12.0", "dev": true, @@ -22458,9 +27111,17 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, "license": "MIT" }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -22477,7 +27138,6 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "dev": true, "license": "MIT" }, "node_modules/sanitize-filename": { @@ -22510,16 +27170,37 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/seek-bzip/node_modules/commander": { + "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==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.0.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "license": "MIT", "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -22539,9 +27220,20 @@ "dev": true, "license": "MIT" }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/send": { "version": "0.18.0", - "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -22564,7 +27256,6 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -22572,12 +27263,10 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/send/node_modules/mime": { "version": "1.6.0", - "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -22588,7 +27277,6 @@ }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "dev": true, "license": "MIT" }, "node_modules/serialize-error": { @@ -22687,7 +27375,6 @@ }, "node_modules/serve-static": { "version": "1.15.0", - "dev": true, "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", @@ -22718,9 +27405,44 @@ "node": ">= 0.4" } }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", - "dev": true, "license": "ISC" }, "node_modules/ShadowsocksConfig": { @@ -22776,6 +27498,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shelljs": { "version": "0.5.3", "dev": true, @@ -22789,7 +27520,6 @@ }, "node_modules/side-channel": { "version": "1.0.4", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.0", @@ -22922,6 +27652,151 @@ "npm": ">= 3.0.0" } }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/socket.io": { "version": "4.5.1", "dev": true, @@ -23076,6 +27951,39 @@ "npm": ">= 1.3.5" } }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "dev": true, @@ -23092,6 +28000,20 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "dev": true, @@ -23101,6 +28023,13 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, "node_modules/space-separated-tokens": { "version": "1.1.5", "dev": true, @@ -23110,6 +28039,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/spdx-correct": { "version": "3.1.1", "dev": true, @@ -23179,6 +28117,18 @@ "node": ">= 6" } }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", @@ -23188,7 +28138,6 @@ }, "node_modules/sshpk": { "version": "1.17.0", - "dev": true, "license": "MIT", "dependencies": { "asn1": "~0.2.3", @@ -23218,6 +28167,15 @@ "figgy-pudding": "^3.5.1" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/stat-mode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", @@ -23236,9 +28194,46 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/statuses": { "version": "2.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -23313,11 +28308,38 @@ "stream-shift": "^1.0.0" } }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, "node_modules/stream-shift": { "version": "1.0.1", "dev": true, "license": "MIT" }, + "node_modules/stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha512-Kg1BSDTwgGiVMtTCJNlo7kk/xzL33ZuZveEBRt6rXw+f1WLK/8kmz2NVCT/Qnv0JkV85JOHcLhD82mnXsR3kPw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha512-Da4WoKaZyu3nf+bIdIifh7IPkFjARBnBK+pYqn0EUJqksjV9afojjaCCHUemH30Jmu7T2qcKvlZm2ykN38uzaw==", + "dev": true, + "dependencies": { + "stream-to": "~0.2.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/streamroller": { "version": "3.1.2", "dev": true, @@ -23360,6 +28382,15 @@ "node": ">= 4.0.0" } }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "dev": true, @@ -23505,6 +28536,15 @@ "node": ">=8" } }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "dev": true, @@ -23521,6 +28561,30 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent/node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "dev": true, @@ -23532,6 +28596,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/style-loader": { "version": "2.0.0", "dev": true, @@ -23614,6 +28699,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, "node_modules/svg2png": { "version": "4.1.1", "dev": true, @@ -23805,19 +28900,20 @@ } }, "node_modules/tar": { - "version": "6.1.11", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, "node_modules/tar-fs": { @@ -23867,6 +28963,15 @@ "node": ">=10" } }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "dev": true, @@ -23878,6 +28983,15 @@ "node": ">=10" } }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", @@ -23902,13 +29016,27 @@ "node": ">=12" } }, + "node_modules/tempfile": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-3.0.0.tgz", + "integrity": "sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==", + "dev": true, + "dependencies": { + "temp-dir": "^2.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/terser": { - "version": "5.14.2", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -23920,15 +29048,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.3", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -23954,8 +29083,9 @@ }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -23966,9 +29096,10 @@ } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "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==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -23983,17 +29114,19 @@ } }, "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -24180,6 +29313,18 @@ "dev": true, "license": "MIT" }, + "node_modules/textextensions": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz", + "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -24220,11 +29365,39 @@ "xtend": "~4.0.1" } }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, "node_modules/thunky": { "version": "1.1.0", "dev": true, "license": "MIT" }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/timm": { "version": "1.7.1", "dev": true, @@ -24281,12 +29454,31 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", "dev": true }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "dev": true, @@ -24295,6 +29487,36 @@ "node": ">=4" } }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -24304,6 +29526,21 @@ "node": ">=6" } }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "dev": true, @@ -24315,9 +29552,20 @@ "node": ">=8.0" } }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/toidentifier": { "version": "1.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=0.6" @@ -24325,7 +29573,6 @@ }, "node_modules/tough-cookie": { "version": "2.5.0", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", @@ -24337,7 +29584,6 @@ }, "node_modules/tough-cookie/node_modules/punycode": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -24366,6 +29612,36 @@ "version": "0.0.1", "dev": true }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/trim-trailing-lines": { "version": "1.1.4", "dev": true, @@ -24402,14 +29678,16 @@ } }, "node_modules/ts-loader": { - "version": "9.3.1", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -24448,6 +29726,15 @@ "node": ">=10" } }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "dev": true, @@ -24480,8 +29767,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "license": "0BSD" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -24522,7 +29810,6 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", - "dev": true, "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -24533,9 +29820,14 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", - "dev": true, "license": "Unlicense" }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "dev": true, @@ -24562,7 +29854,6 @@ }, "node_modules/type-is": { "version": "1.6.18", - "dev": true, "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -24732,11 +30023,56 @@ "through": "^2.3.8" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/underscore": { "version": "1.13.4", "dev": true, "license": "MIT" }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker/node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", + "dev": true + }, "node_modules/unherit": { "version": "1.1.3", "dev": true, @@ -24803,6 +30139,30 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "dev": true, @@ -24819,6 +30179,16 @@ "imurmurhash": "^0.1.4" } }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, "node_modules/unist-builder": { "version": "2.0.3", "dev": true, @@ -24969,12 +30339,59 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/untildify": { "version": "3.0.3", "license": "MIT", @@ -24982,8 +30399,20 @@ "node": ">=4" } }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.5", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -24992,15 +30421,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -25008,11 +30440,11 @@ }, "node_modules/update-browserslist-db/node_modules/picocolors": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/uri-js": { "version": "4.4.1", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -25020,12 +30452,18 @@ }, "node_modules/uri-js/node_modules/punycode": { "version": "2.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, "node_modules/url": { "version": "0.11.0", "dev": true, @@ -25047,11 +30485,41 @@ "node": ">=4" } }, + "node_modules/url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha512-dQ9cJzMou5OKr6ZzfvwJkCq3rC72PNXhqz0v3EIhF4a3Np+ujr100AhUx2cKx5ei3iymoJpJrPB3sVSEMdqAeg==", + "dev": true, + "dependencies": { + "ip-regex": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "dev": true, "license": "MIT" }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/useragent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", @@ -25116,7 +30584,6 @@ }, "node_modules/utils-merge": { "version": "1.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -25124,7 +30591,6 @@ }, "node_modules/uuid": { "version": "3.4.0", - "dev": true, "license": "MIT", "bin": { "uuid": "bin/uuid" @@ -25149,6 +30615,18 @@ "dev": true, "license": "MIT" }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -25191,9 +30669,17 @@ "builtins": "^1.0.3" } }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -25258,6 +30744,81 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/void-elements": { "version": "2.0.1", "dev": true, @@ -25288,7 +30849,8 @@ }, "node_modules/web-animations-js": { "version": "2.3.2", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", + "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" }, "node_modules/web-namespaces": { "version": "1.1.4", @@ -25317,21 +30879,22 @@ } }, "node_modules/webpack": { - "version": "5.74.0", + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", + "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", "dev": true, - "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -25340,9 +30903,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -25488,9 +31051,10 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.10.0", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -25498,7 +31062,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -25511,16 +31075,17 @@ "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.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -25536,15 +31101,19 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } } }, "node_modules/webpack-dev-server/node_modules/@types/ws": { - "version": "8.5.3", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } @@ -25621,15 +31190,16 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.8.1", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -25664,6 +31234,15 @@ "node": ">=10.0.0" } }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/webpack-shell-plugin-next": { "version": "2.2.2", "dev": true, @@ -25681,19 +31260,16 @@ } }, "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/es-module-lexer": { - "version": "0.9.3", - "dev": true, - "license": "MIT" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true }, "node_modules/webpack/node_modules/schema-utils": { - "version": "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==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -25812,6 +31388,18 @@ "dev": true, "license": "MIT" }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "dev": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/winreg": { "version": "1.2.4", "license": "BSD-2-Clause" @@ -26092,17 +31680,18 @@ "dev": true }, "node_modules/yargs": { - "version": "17.5.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -26327,6 +31916,20 @@ "decamelize": "^1.2.0" } }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/yargs/node_modules/y18n": { "version": "5.0.8", "dev": true, @@ -26378,1832 +31981,3193 @@ "url": "https://github.com/sponsors/wooorm" } }, - "src/cordova/plugin": { - "name": "cordova-plugin-outline", - "version": "0.0.0" - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "server_manager": { + "name": "outline-manager", + "version": "0.0.0-debug", + "license": "Apache", + "dependencies": { + "@polymer/app-layout": "^3.1.0", + "@polymer/app-localize-behavior": "^3.0.1", + "@polymer/font-roboto": "^3.0.2", + "@polymer/iron-autogrow-textarea": "^3.0.3", + "@polymer/iron-collapse": "^3.0.1", + "@polymer/iron-fit-behavior": "^3.1.0", + "@polymer/iron-icon": "^3.0.1", + "@polymer/iron-icons": "^3.0.1", + "@polymer/iron-pages": "^3.0.1", + "@polymer/paper-button": "^3.0.1", + "@polymer/paper-checkbox": "^3.1.0", + "@polymer/paper-dialog": "^3.0.1", + "@polymer/paper-dialog-scrollable": "^3.0.1", + "@polymer/paper-dropdown-menu": "^3.2.0", + "@polymer/paper-icon-button": "^3.0.2", + "@polymer/paper-input": "^3.2.1", + "@polymer/paper-item": "^3.0.1", + "@polymer/paper-listbox": "^3.0.1", + "@polymer/paper-progress": "^3.0.1", + "@polymer/paper-tabs": "^3.1.0", + "@polymer/paper-toast": "^3.0.1", + "@polymer/paper-tooltip": "^3.0.1", + "@sentry/electron": "^4.17.0", + "@webcomponents/webcomponentsjs": "^2.8.0", + "circle-flags": "github:HatScripts/circle-flags", + "clipboard-polyfill": "^2.8.6", + "dotenv": "~8.2.0", + "electron-updater": "^4.6.5", + "express": "^4.18.2", + "google-auth-library": "^8.9.0", + "intl-messageformat": "^7.8.4", + "jsonic": "^0.3.1", + "lit": "^3.1.2", + "lit-element": "^2.5.1", + "node-forge": "^1.3.1", + "request": "^2.88.2", + "web-animations-js": "^2.3.2" + }, + "devDependencies": { + "@types/node": "^16.11.29", + "@types/node-forge": "^1.0.2", + "@types/polymer": "^1.2.9", + "@types/puppeteer": "^5.4.2", + "@types/request": "^2.47.1", + "@types/semver": "^5.5.0", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "electron": "19.1.9", + "electron-builder": "^24.9.1", + "electron-icon-maker": "^0.0.4", + "electron-notarize": "^1.2.1", + "electron-to-chromium": "^1.4.328", + "gulp": "^4.0.0", + "gulp-posthtml": "^3.0.4", + "gulp-replace": "^1.0.0", + "html-webpack-plugin": "^5.5.3", + "karma": "^6.3.16", + "karma-chrome-launcher": "^3.1.0", + "karma-jasmine": "^4.0.1", + "karma-webpack": "^5.0.0", + "node-jq": "^1.11.2", + "postcss": "^7.0.29", + "postcss-rtl": "^1.7.3", + "posthtml-postcss": "^0.2.6", + "puppeteer": "^13.6.0", + "style-loader": "^3.3.3", + "ts-loader": "^9.5.0", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-node-externals": "^3.0.0" } }, - "@babel/code-frame": { - "version": "7.18.6", + "server_manager/node_modules/@electron/universal": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", + "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" } }, - "@babel/compat-data": { - "version": "7.18.8", - "dev": true - }, - "@babel/core": { - "version": "7.18.10", + "server_manager/node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "@babel/generator": { - "version": "7.18.12", - "dev": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, + "server_manager/node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "@lit-labs/ssr-dom-shim": "^1.2.0" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } + "server_manager/node_modules/@types/node": { + "version": "16.18.79", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.79.tgz", + "integrity": "sha512-Qd7jdLR5zmnIyMhfDrfPqN5tUCvreVpP3Qrf2oSM+F7SNzlb/MwHISGUkdFHtevfkPJ3iAGyeQI/jsbh9EStgQ==", + "dev": true }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } + "server_manager/node_modules/@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", + "server_manager/node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.18.9", + "server_manager/node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", + "server_manager/node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.2", + "server_manager/node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "server_manager/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", + "server_manager/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "@babel/helper-function-name": { - "version": "7.18.9", + "server_manager/node_modules/ansi-regex": { + "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==", "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", + "server_manager/node_modules/app-builder-lib": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz", + "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.1.0", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.4.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "7zip-bin": "~5.2.0", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.8.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", + "server_manager/node_modules/app-builder-lib/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "requires": { - "@babel/types": "^7.18.9" + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "@babel/helper-module-imports": { - "version": "7.18.6", + "server_manager/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-module-transforms": { - "version": "7.18.9", + "server_manager/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", + "server_manager/node_modules/bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "engines": { + "node": "*" } }, - "@babel/helper-plugin-utils": { - "version": "7.18.9", + "server_manager/node_modules/bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha512-epsm3Z92j5xwek9p97pVw3KbsNc0F4QnbYh+N93SpbJYuHFQQ/UAh6K+bKFGyLePH3Hudtl/Sa95Quqp0gX8IQ==", "dev": true }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", + "server_manager/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "@babel/helper-replace-supers": { - "version": "7.18.9", + "server_manager/node_modules/builder-util": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz", + "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } }, - "@babel/helper-simple-access": { - "version": "7.18.6", + "server_manager/node_modules/builder-util-runtime": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz", + "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" } }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", + "server_manager/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", "dev": true, - "requires": { - "@babel/types": "^7.18.9" + "engines": { + "node": ">=0.10.0" } }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", + "server_manager/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz", - "integrity": "sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.18.11", + "server_manager/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dev": true, - "requires": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "@babel/helpers": { - "version": "7.18.9", + "server_manager/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "engines": { + "node": ">=14" } }, - "@babel/highlight": { - "version": "7.18.6", + "server_manager/node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "server_manager/node_modules/css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "dev": true + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true }, - "supports-color": { - "version": "5.5.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "webpack": { + "optional": true } } }, - "@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", + "server_manager/node_modules/css-loader/node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", + "server_manager/node_modules/css-loader/node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", + "server_manager/node_modules/css-loader/node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", + "server_manager/node_modules/css-loader/node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", + "server_manager/node_modules/css-loader/node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", + "server_manager/node_modules/css-loader/node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", + "server_manager/node_modules/del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "dependencies": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", + "server_manager/node_modules/del/node_modules/globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", + "server_manager/node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", + "server_manager/node_modules/dmg-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz", + "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "dependencies": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" } }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "server_manager/node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", + "server_manager/node_modules/electron-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz", + "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==", "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "dependencies": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "dmg-builder": "24.9.1", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", + "server_manager/node_modules/electron-icon-maker": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/electron-icon-maker/-/electron-icon-maker-0.0.4.tgz", + "integrity": "sha512-7Lp5VJH7T7jy0YoM5Qz/pEaJloshTYzb73+ra4Nxhvf7UUs/z/FZW1nJ1dC9vaZqVvzZZduYIa9ELQpiqPnLTg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "dependencies": { + "args": "^2.3.0", + "icon-gen": "1.0.7", + "jimp": "^0.2.27" + }, + "bin": { + "electron-icon-maker": "index.js" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", + "server_manager/node_modules/electron-publish": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", + "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" } }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "server_manager/node_modules/electron-updater": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.6.5.tgz", + "integrity": "sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==", + "dependencies": { + "@types/semver": "^7.3.6", + "builder-util-runtime": "8.9.2", + "fs-extra": "^10.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.5" } }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "server_manager/node_modules/electron-updater/node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" + }, + "server_manager/node_modules/electron-updater/node_modules/builder-util-runtime": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz", + "integrity": "sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==", + "dependencies": { + "debug": "^4.3.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", + "server_manager/node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "server_manager/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", + "server_manager/node_modules/file-url": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-1.1.0.tgz", + "integrity": "sha512-Kul2nDrif1KcPH8g8bynl3/NtzaDvm3oUY3jS1tJu4fzfb6bUt1HNQ6MmLcK+pU7/ixVWKBokjHQwb83d2ngHw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "meow": "^3.7.0" + }, + "bin": { + "file-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "server_manager/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", + "server_manager/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "server_manager/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", + "server_manager/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", + "server_manager/node_modules/icon-gen": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/icon-gen/-/icon-gen-1.0.7.tgz", + "integrity": "sha512-XIbSCmYszoYEfQVNW0Ep+xkZc4lKb/xT45nUPs8T2W/KlARjTKuWI2EpaW/GKox2dYEM6SvZGodGhndmKndUJw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "dependencies": { + "del": "^2.2.2", + "mkdirp": "^0.5.1", + "pngjs": "^3.0.0", + "svg2png": "4.1.0", + "uuid": "^3.0.0" + }, + "bin": { + "icon-gen": "bin/main.js" } }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", + "server_manager/node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "engines": { + "node": ">=10.13.0" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "server_manager/node_modules/intl-messageformat": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-7.8.4.tgz", + "integrity": "sha512-yS0cLESCKCYjseCOGXuV4pxJm/buTfyCJ1nzQjryHmSehlptbZbn9fnlk1I9peLopZGGbjj46yHHiTAEZ1qOTA==", + "dependencies": { + "intl-format-cache": "^4.2.21", + "intl-messageformat-parser": "^3.6.4" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "server_manager/node_modules/intl-messageformat-parser": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.6.4.tgz", + "integrity": "sha512-RgPGwue0mJtoX2Ax8EmMzJzttxjnva7gx0Q7mKJ4oALrTZvtmCeAw5Msz2PcjW4dtCh/h7vN/8GJCxZO1uv+OA==", + "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", + "dependencies": { + "@formatjs/intl-unified-numberformat": "^3.2.0" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.12.1", + "server_manager/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", + "server_manager/node_modules/isbinaryfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", + "server_manager/node_modules/jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha512-9HT7DA279xkTlry2oG30s6AtOUglNiY2UdyYpj0yNI4/NBv8PmdNC0gcldgMU4HqvbUlrM3+v+6GaHnTkH23JQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", + "server_manager/node_modules/jimp/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "server_manager/node_modules/jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g==", + "dev": true + }, + "server_manager/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "server_manager/node_modules/lit": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", + "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "dependencies": { + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", + "server_manager/node_modules/lit-element": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.5.1.tgz", + "integrity": "sha512-ogu7PiJTA33bEK0xGu1dmaX5vhcRjBXCFexPja0e7P7jqLhTpNKYRPmE+GmiCaRVAbiQKGkUgkh/i6+bh++dPQ==", + "dependencies": { + "lit-html": "^1.1.1" + } + }, + "server_manager/node_modules/lit-element/node_modules/lit-html": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.4.1.tgz", + "integrity": "sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA==" + }, + "server_manager/node_modules/lit-html": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", + "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "server_manager/node_modules/lit/node_modules/lit-element": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", + "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.1.2" + } + }, + "server_manager/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "server_manager/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", + "server_manager/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "server_manager/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", + "server_manager/node_modules/read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha512-5NLTTdX45dKFtG8CX5pKmvS9V5u9wBE+gkklN7xhDuhq3pA2I4O7ALfKxosCMcLHOhkxj6GNacZhfXtp5nlCdg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", + "server_manager/node_modules/read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" } }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", + "server_manager/node_modules/read-config-file/node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "engines": { + "node": ">=10" } }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", + "server_manager/node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", + "server_manager/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "@babel/plugin-transform-block-scoping": { - "version": "7.18.9", + "server_manager/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "server_manager/node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "dependencies": { + "randombytes": "^2.1.0" } }, - "@babel/plugin-transform-classes": { - "version": "7.18.9", + "server_manager/node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", + "server_manager/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.18.9", + "server_manager/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", + "server_manager/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", + "server_manager/node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", + "server_manager/node_modules/svg2png": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svg2png/-/svg2png-4.1.0.tgz", + "integrity": "sha512-OZUplzFrfjfzddYFX5zR7aPpY8jMiCUa/q8yR7+tiZ6tTqbTP2lEmAwG2lLU0/ysv95sqWAv2BxXV0P9ffUEyA==", "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "dependencies": { + "file-url": "^1.1.0", + "phantomjs-prebuilt": "^2.1.10", + "pn": "^1.0.0", + "yargs": "^5.0.0" + }, + "bin": { + "svg2png": "bin/svg2png-cli.js" } }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", + "server_manager/node_modules/svg2png/node_modules/yargs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-5.0.0.tgz", + "integrity": "sha512-krgVLGNhMWUVY1EJkM/bgbvn3yCIRrsZp6KaeX8hx8ztT+jBtX7/flTQcSHe5089xIDQRUsEr2mzlZVNe/7P5w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "dependencies": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.2.0", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^3.2.0" } }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", + "server_manager/node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", + "server_manager/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", + "server_manager/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "server_manager/node_modules/yargs-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-3.2.0.tgz", + "integrity": "sha512-eANlJIqYwhwS/asi4ybKxkeJYUIjNMZXL36C/KICV5jyudUZWp+/lEfBHM0PuJcQjBfs00HwqePEQjtLJd+Kyw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.1.0" } }, - "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", + "src/cordova/plugin": { + "name": "cordova-plugin-outline", + "version": "0.0.0" + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "@babel/plugin-transform-modules-commonjs": { + "@babel/code-frame": { "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/highlight": "^7.18.6" } }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", + "@babel/compat-data": { + "version": "7.18.8", + "dev": true + }, + "@babel/core": { + "version": "7.18.10", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.18.6", + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" } }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", + "@babel/generator": { + "version": "7.18.12", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, - "@babel/plugin-transform-named-capturing-groups-regex": { + "@babel/helper-annotate-as-pure": { "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.18.6" } }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" } }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", + "@babel/helper-compilation-targets": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" } }, - "@babel/plugin-transform-parameters": { - "version": "7.18.8", + "@babel/helper-create-class-features-plugin": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" } }, - "@babel/plugin-transform-property-literals": { + "@babel/helper-create-regexp-features-plugin": { "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" } }, - "@babel/plugin-transform-react-jsx": { - "version": "7.18.10", + "@babel/helper-define-polyfill-provider": { + "version": "0.3.2", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" - }, - "dependencies": { - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - } + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" } }, - "@babel/plugin-transform-regenerator": { + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/types": "^7.18.6" } }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", + "@babel/helper-function-name": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, - "@babel/plugin-transform-shorthand-properties": { + "@babel/helper-hoist-variables": { "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.18.6" } }, - "@babel/plugin-transform-spread": { + "@babel/helper-member-expression-to-functions": { "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/types": "^7.18.9" } }, - "@babel/plugin-transform-sticky-regex": { + "@babel/helper-module-imports": { "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.18.6" } }, - "@babel/plugin-transform-template-literals": { + "@babel/helper-module-transforms": { "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, - "@babel/plugin-transform-typeof-symbol": { + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.9", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", + "@babel/helper-replace-supers": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, - "@babel/plugin-transform-unicode-regex": { + "@babel/helper-simple-access": { "version": "7.18.6", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.18.6" } }, - "@babel/polyfill": { - "version": "7.12.1", + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", "dev": true, "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" + "@babel/types": "^7.18.9" } }, - "@babel/preset-env": { - "version": "7.18.10", + "@babel/helper-split-export-declaration": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@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/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.18.9", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.10", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/types": "^7.18.6" } }, - "@babel/traverse": { - "version": "7.18.11", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - } + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true }, - "@babel/types": { + "@babel/helper-validator-identifier": { "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz", + "integrity": "sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==", + "dev": true }, - "@colors/colors": { - "version": "1.5.0", + "@babel/helper-validator-option": { + "version": "7.18.6", "dev": true }, - "@commitlint/config-conventional": { - "version": "16.2.4", + "@babel/helper-wrap-function": { + "version": "7.18.11", "dev": true, "requires": { - "conventional-changelog-conventionalcommits": "^4.3.1" + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.11", + "@babel/types": "^7.18.10" } }, - "@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "@babel/helpers": { + "version": "7.18.9", "dev": true, "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "dev": true - }, - "@electron/get": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", - "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", + "@babel/highlight": { + "version": "7.18.6", "dev": true, "requires": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "global-agent": "^3.0.0", - "global-tunnel-ng": "^2.7.1", - "got": "^9.6.0", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "ansi-styles": { + "version": "3.2.1", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "color-convert": "^1.9.0" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "chalk": { + "version": "2.4.2", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "@electron/universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.2.1.tgz", - "integrity": "sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==", - "dev": true, - "requires": { - "@malept/cross-spawn-promise": "^1.1.0", - "asar": "^3.1.0", - "debug": "^4.3.1", - "dir-compare": "^2.4.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - } - }, - "@eslint/eslintrc": { - "version": "1.3.0", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "13.17.0", + "color-convert": { + "version": "1.9.3", "dev": true, "requires": { - "type-fest": "^0.20.2" + "color-name": "1.1.3" } }, - "type-fest": { - "version": "0.20.2", + "color-name": { + "version": "1.1.3", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "dev": true + }, + "has-flag": { + "version": "3.0.0", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "@esm-bundle/chai": { - "version": "4.3.4-fix.0", - "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz", - "integrity": "sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==", + "@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", "dev": true, "requires": { - "@types/chai": "^4.2.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@formatjs/ecma402-abstract": { - "version": "1.11.4", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", "dev": true, "requires": { - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, - "@formatjs/fast-memoize": { - "version": "1.2.1", + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.18.10", "dev": true, "requires": { - "tslib": "^2.1.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, - "@formatjs/icu-messageformat-parser": { - "version": "2.1.0", + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", "dev": true, "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/icu-skeleton-parser": "1.3.6", - "tslib": "^2.1.0" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@formatjs/icu-skeleton-parser": { - "version": "1.3.6", + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", "dev": true, "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "tslib": "^2.1.0" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, - "@formatjs/intl-localematcher": { - "version": "0.2.25", + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", "dev": true, "requires": { - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, - "@gar/promisify": { - "version": "1.1.3", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", "dev": true, "requires": { - "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" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jimp/bmp": { - "version": "0.14.0", + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0", - "bmp-js": "^0.1.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, - "@jimp/core": { - "version": "0.14.0", + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^9.0.0", - "load-bmfont": "^1.3.1", - "mkdirp": "^0.5.1", - "phin": "^2.9.1", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.4.1" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, - "@jimp/custom": { - "version": "0.14.0", + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/core": "^0.14.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, - "@jimp/gif": { - "version": "0.14.0", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0", - "gifwrap": "^0.9.2", - "omggif": "^1.0.9" + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" } }, - "@jimp/jpeg": { - "version": "0.14.0", + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0", - "jpeg-js": "^0.4.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, - "@jimp/plugin-blit": { - "version": "0.14.0", + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, - "@jimp/plugin-blur": { - "version": "0.14.0", + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@jimp/plugin-circle": { - "version": "0.14.0", + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, - "@jimp/plugin-color": { - "version": "0.14.0", + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0", - "tinycolor2": "^1.4.1" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@jimp/plugin-contain": { - "version": "0.14.0", + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jimp/plugin-cover": { - "version": "0.14.0", + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@jimp/plugin-crop": { - "version": "0.14.0", + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, - "@jimp/plugin-displace": { - "version": "0.14.0", + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jimp/plugin-dither": { - "version": "0.14.0", + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, - "@jimp/plugin-fisheye": { - "version": "0.14.0", + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@jimp/plugin-flip": { - "version": "0.14.0", + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@jimp/plugin-gaussian": { - "version": "0.14.0", + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jimp/plugin-invert": { - "version": "0.14.0", + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@jimp/plugin-mask": { - "version": "0.14.0", + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@jimp/plugin-normalize": { - "version": "0.14.0", + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jimp/plugin-print": { - "version": "0.14.0", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0", - "load-bmfont": "^1.4.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@jimp/plugin-resize": { - "version": "0.14.0", + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jimp/plugin-rotate": { - "version": "0.14.0", + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jimp/plugin-scale": { - "version": "0.14.0", + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jimp/plugin-shadow": { - "version": "0.14.0", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, - "@jimp/plugin-threshold": { - "version": "0.14.0", + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, - "@jimp/plugins": { - "version": "0.14.0", + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/plugin-blit": "^0.14.0", - "@jimp/plugin-blur": "^0.14.0", - "@jimp/plugin-circle": "^0.14.0", - "@jimp/plugin-color": "^0.14.0", - "@jimp/plugin-contain": "^0.14.0", - "@jimp/plugin-cover": "^0.14.0", - "@jimp/plugin-crop": "^0.14.0", - "@jimp/plugin-displace": "^0.14.0", - "@jimp/plugin-dither": "^0.14.0", - "@jimp/plugin-fisheye": "^0.14.0", - "@jimp/plugin-flip": "^0.14.0", - "@jimp/plugin-gaussian": "^0.14.0", - "@jimp/plugin-invert": "^0.14.0", - "@jimp/plugin-mask": "^0.14.0", - "@jimp/plugin-normalize": "^0.14.0", - "@jimp/plugin-print": "^0.14.0", - "@jimp/plugin-resize": "^0.14.0", - "@jimp/plugin-rotate": "^0.14.0", - "@jimp/plugin-scale": "^0.14.0", - "@jimp/plugin-shadow": "^0.14.0", - "@jimp/plugin-threshold": "^0.14.0", - "timm": "^1.6.1" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@jimp/png": { - "version": "0.14.0", + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/utils": "^0.14.0", - "pngjs": "^3.3.3" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" } }, - "@jimp/tiff": { - "version": "0.14.0", + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "utif": "^2.0.1" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@jimp/types": { - "version": "0.14.0", + "@babel/plugin-transform-block-scoping": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/bmp": "^0.14.0", - "@jimp/gif": "^0.14.0", - "@jimp/jpeg": "^0.14.0", - "@jimp/png": "^0.14.0", - "@jimp/tiff": "^0.14.0", - "timm": "^1.6.1" + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@jimp/utils": { - "version": "0.14.0", + "@babel/plugin-transform-classes": { + "version": "7.18.9", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "regenerator-runtime": "^0.13.3" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" } }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "dev": true + "@babel/plugin-transform-destructuring": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } }, - "@jridgewell/set-array": { - "version": "1.1.2", - "dev": true + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } }, - "@jridgewell/source-map": { - "version": "0.3.2", + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "dev": true + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", + "@babel/plugin-transform-for-of": { + "version": "7.18.8", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "@babel/plugin-transform-function-name": { + "version": "7.18.9", "dev": true, "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "^2.0.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@koa/cors": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-3.4.3.tgz", - "integrity": "sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==", + "@babel/plugin-transform-literals": { + "version": "7.18.9", "dev": true, "requires": { - "vary": "^1.1.2" + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } }, - "@lion/accordion": { - "version": "0.9.0", + "@babel/plugin-transform-modules-amd": { + "version": "7.18.6", "dev": true, "requires": { - "@lion/core": "^0.22.0" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@lion/core": { - "version": "0.22.0", + "@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", "dev": true, "requires": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@open-wc/scoped-elements": "^2.1.1", - "lit": "^2.0.2" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, - "@lit-labs/ssr-dom-shim": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", - "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" + "@babel/plugin-transform-modules-systemjs": { + "version": "7.18.9", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } }, - "@lit/reactive-element": { - "version": "1.0.0-rc.4", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.0.0-rc.4.tgz", - "integrity": "sha512-dJMha+4NFYdpnUJzRrWTFV5Hdp9QHWFuPnaoqonrKl4lGJVnYez9mu8ev9F/5KM47tjAjh22DuRHrdFDHfOijA==" + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } }, - "@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", "dev": true, "requires": { - "cross-spawn": "^7.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "@babel/plugin-transform-new-target": { + "version": "7.18.6", "dev": true, "requires": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@material/animation": { - "version": "14.0.0-canary.261f2db59.0", + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "dev": true, "requires": { - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } }, - "@material/base": { - "version": "14.0.0-canary.261f2db59.0", + "@babel/plugin-transform-parameters": { + "version": "7.18.8", + "dev": true, "requires": { - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@material/circular-progress": { - "version": "14.0.0-canary.53b3cad2f.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-14.0.0-canary.53b3cad2f.0.tgz", - "integrity": "sha512-4A+HMgp66b45Fvbcbh9qb1j0vRFjKESbE2fHFkSMMNDPqFiKcvq4tJFBxKG2szYzpAnXdWLYaB+DeQ2+wSu9hg==", + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "dev": true, "requires": { - "@material/animation": "14.0.0-canary.53b3cad2f.0", - "@material/base": "14.0.0-canary.53b3cad2f.0", - "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0", - "@material/progress-indicator": "14.0.0-canary.53b3cad2f.0", - "@material/rtl": "14.0.0-canary.53b3cad2f.0", - "@material/theme": "14.0.0-canary.53b3cad2f.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.18.10", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.10" }, "dependencies": { - "@material/animation": { - "version": "14.0.0-canary.53b3cad2f.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-14.0.0-canary.53b3cad2f.0.tgz", - "integrity": "sha512-GBuR4VmcTQW1D0lPXEosf5Giho72LLbyGIydWGtaEUtLJoive/D9kFkwTN4Fsyt9Kkl7hbhs35vrNe6QkAH4/Q==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/base": { - "version": "14.0.0-canary.53b3cad2f.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-14.0.0-canary.53b3cad2f.0.tgz", - "integrity": "sha512-UJKbXwZtkrA3sfQDmj8Zbw1Q3Tqtl6KdfVFws95Yf7TCUgTFzbZI/FSx1w7dVugQPOEnIBuZnzqZam/MtHkx4w==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/feature-targeting": { - "version": "14.0.0-canary.53b3cad2f.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-14.0.0-canary.53b3cad2f.0.tgz", - "integrity": "sha512-fn7Af3PRyARtNeYqtjxXmE3Y/dCpnpQVWWys57MqiGR/nvc6qpgOfJ6rOdcu/MrOysOE/oebTUDmDnTmwpe9Hw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/rtl": { - "version": "14.0.0-canary.53b3cad2f.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-14.0.0-canary.53b3cad2f.0.tgz", - "integrity": "sha512-f08LT0HSa0WYU+4Jz/tbm1TQ9Fcf2k+H6dPPYv0J1sZmX6hMgCEmNiUdUFLQFvszoXx2XrRi1/hIFjbz2e69Yg==", - "requires": { - "@material/theme": "14.0.0-canary.53b3cad2f.0", - "tslib": "^2.1.0" - } - }, - "@material/theme": { - "version": "14.0.0-canary.53b3cad2f.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-14.0.0-canary.53b3cad2f.0.tgz", - "integrity": "sha512-S06XAevDCDWMe+GgsEpITMS07imUidzadNaTbJsqssFajBLr53QWVZsG84BpjXKXoYvyEJvb0hX5U0lq6ip9UQ==", + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "dev": true, "requires": { - "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6" } } } }, - "@material/density": { - "version": "14.0.0-canary.261f2db59.0", + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "dev": true, "requires": { - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" } }, - "@material/dom": { - "version": "14.0.0-canary.261f2db59.0", + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "dev": true, "requires": { - "@material/feature-targeting": "14.0.0-canary.261f2db59.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@material/elevation": { - "version": "14.0.0-canary.261f2db59.0", + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "dev": true, "requires": { - "@material/animation": "14.0.0-canary.261f2db59.0", - "@material/base": "14.0.0-canary.261f2db59.0", - "@material/feature-targeting": "14.0.0-canary.261f2db59.0", - "@material/rtl": "14.0.0-canary.261f2db59.0", - "@material/theme": "14.0.0-canary.261f2db59.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@material/feature-targeting": { - "version": "14.0.0-canary.261f2db59.0", + "@babel/plugin-transform-spread": { + "version": "7.18.9", + "dev": true, "requires": { - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, - "@material/floating-label": { - "version": "14.0.0-canary.261f2db59.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-14.0.0-canary.261f2db59.0.tgz", - "integrity": "sha512-Cp0/LngkW6/uZWbEDTe3Ox143V4kYtxl9twiM3XLKd6a67JHCzneQWFzC0qSg90b3r5O+1zOkT3ZMF2Pbu2Vwg==", + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "dev": true, "requires": { - "@material/animation": "14.0.0-canary.261f2db59.0", - "@material/base": "14.0.0-canary.261f2db59.0", - "@material/dom": "14.0.0-canary.261f2db59.0", - "@material/feature-targeting": "14.0.0-canary.261f2db59.0", - "@material/rtl": "14.0.0-canary.261f2db59.0", - "@material/theme": "14.0.0-canary.261f2db59.0", - "@material/typography": "14.0.0-canary.261f2db59.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6" } }, - "@material/form-field": { - "version": "14.0.0-canary.261f2db59.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-14.0.0-canary.261f2db59.0.tgz", - "integrity": "sha512-NCc/o60gwuF28PVMgFkHrKcHxIaCMZK9JRVfoaD0sF2BINYrjaCkFZ+x6AhNjAWLUQMhJMfc+1WXAUE2T85Mug==", + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "dev": true, "requires": { - "@material/base": "14.0.0-canary.261f2db59.0", - "@material/feature-targeting": "14.0.0-canary.261f2db59.0", - "@material/ripple": "14.0.0-canary.261f2db59.0", - "@material/rtl": "14.0.0-canary.261f2db59.0", - "@material/theme": "14.0.0-canary.261f2db59.0", - "@material/typography": "14.0.0-canary.261f2db59.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@material/line-ripple": { - "version": "14.0.0-canary.261f2db59.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-14.0.0-canary.261f2db59.0.tgz", - "integrity": "sha512-LlyiyxpHNlFt0PZ8Q2tvOPbjNcgm3L7tUebXsM7iGyoKXfj0HwyDI31S0KgtU3Vs5DIK4U4mnRWtoAxtBW6Jfg==", + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "dev": true, "requires": { - "@material/animation": "14.0.0-canary.261f2db59.0", - "@material/base": "14.0.0-canary.261f2db59.0", - "@material/feature-targeting": "14.0.0-canary.261f2db59.0", - "@material/theme": "14.0.0-canary.261f2db59.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@material/list": { - "version": "14.0.0-canary.261f2db59.0", + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "dev": true, "requires": { - "@material/base": "14.0.0-canary.261f2db59.0", - "@material/density": "14.0.0-canary.261f2db59.0", - "@material/dom": "14.0.0-canary.261f2db59.0", - "@material/feature-targeting": "14.0.0-canary.261f2db59.0", - "@material/ripple": "14.0.0-canary.261f2db59.0", - "@material/rtl": "14.0.0-canary.261f2db59.0", - "@material/shape": "14.0.0-canary.261f2db59.0", - "@material/theme": "14.0.0-canary.261f2db59.0", - "@material/typography": "14.0.0-canary.261f2db59.0", - "tslib": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.9" } }, - "@material/menu": { - "version": "14.0.0-canary.261f2db59.0", - "requires": { + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/polyfill": { + "version": "7.12.1", + "dev": true, + "requires": { + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/preset-env": { + "version": "7.18.10", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.18.10", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@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/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.10", + "babel-plugin-polyfill-corejs2": "^0.3.2", + "babel-plugin-polyfill-corejs3": "^0.5.3", + "babel-plugin-polyfill-regenerator": "^0.4.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.18.9", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.18.11", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "dev": true + }, + "@commitlint/config-conventional": { + "version": "16.2.4", + "dev": true, + "requires": { + "conventional-changelog-conventionalcommits": "^4.3.1" + } + }, + "@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true + }, + "@electron/asar": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", + "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + } + }, + "@electron/get": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", + "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^3.0.0", + "global-tunnel-ng": "^2.7.1", + "got": "^9.6.0", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@electron/notarize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", + "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + } + }, + "@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "requires": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "@electron/universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.2.1.tgz", + "integrity": "sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==", + "dev": true, + "requires": { + "@malept/cross-spawn-promise": "^1.1.0", + "asar": "^3.1.0", + "debug": "^4.3.1", + "dir-compare": "^2.4.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + } + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.17.0", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "dev": true + } + } + }, + "@esm-bundle/chai": { + "version": "4.3.4-fix.0", + "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz", + "integrity": "sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==", + "dev": true, + "requires": { + "@types/chai": "^4.2.12" + } + }, + "@formatjs/ecma402-abstract": { + "version": "1.11.4", + "dev": true, + "requires": { + "@formatjs/intl-localematcher": "0.2.25", + "tslib": "^2.1.0" + } + }, + "@formatjs/fast-memoize": { + "version": "1.2.1", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@formatjs/icu-messageformat-parser": { + "version": "2.1.0", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "1.11.4", + "@formatjs/icu-skeleton-parser": "1.3.6", + "tslib": "^2.1.0" + } + }, + "@formatjs/icu-skeleton-parser": { + "version": "1.3.6", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "1.11.4", + "tslib": "^2.1.0" + } + }, + "@formatjs/intl-localematcher": { + "version": "0.2.25", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "@formatjs/intl-unified-numberformat": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@formatjs/intl-unified-numberformat/-/intl-unified-numberformat-3.3.7.tgz", + "integrity": "sha512-KnWgLRHzCAgT9eyt3OS34RHoyD7dPDYhRcuKn+/6Kv2knDF8Im43J6vlSW6Hm1w63fNq3ZIT1cFk7RuVO3Psag==", + "requires": { + "@formatjs/intl-utils": "^2.3.0" + } + }, + "@formatjs/intl-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@formatjs/intl-utils/-/intl-utils-2.3.0.tgz", + "integrity": "sha512-KWk80UPIzPmUg+P0rKh6TqspRw0G6eux1PuJr+zz47ftMaZ9QDwbGzHZbtzWkl5hgayM/qrKRutllRC7D/vVXQ==" + }, + "@gar/promisify": { + "version": "1.1.3", + "dev": true + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/formula": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", + "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", + "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "dev": true, + "requires": { + "@hapi/address": "^2.1.2", + "@hapi/formula": "^1.2.0", + "@hapi/hoek": "^8.2.4", + "@hapi/pinpoint": "^1.0.2", + "@hapi/topo": "^3.1.3" + } + }, + "@hapi/pinpoint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", + "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", + "dev": true + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "dev": true + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jimp/bmp": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "bmp-js": "^0.1.0" + } + }, + "@jimp/core": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/custom": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.14.0" + } + }, + "@jimp/gif": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + } + }, + "@jimp/jpeg": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "jpeg-js": "^0.4.0" + } + }, + "@jimp/plugin-blit": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-blur": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-circle": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-color": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/plugin-contain": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-cover": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-crop": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-displace": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-dither": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-fisheye": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-flip": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-gaussian": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-invert": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-mask": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-normalize": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-print": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "load-bmfont": "^1.4.0" + } + }, + "@jimp/plugin-resize": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-rotate": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-scale": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-shadow": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugin-threshold": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0" + } + }, + "@jimp/plugins": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.14.0", + "@jimp/plugin-blur": "^0.14.0", + "@jimp/plugin-circle": "^0.14.0", + "@jimp/plugin-color": "^0.14.0", + "@jimp/plugin-contain": "^0.14.0", + "@jimp/plugin-cover": "^0.14.0", + "@jimp/plugin-crop": "^0.14.0", + "@jimp/plugin-displace": "^0.14.0", + "@jimp/plugin-dither": "^0.14.0", + "@jimp/plugin-fisheye": "^0.14.0", + "@jimp/plugin-flip": "^0.14.0", + "@jimp/plugin-gaussian": "^0.14.0", + "@jimp/plugin-invert": "^0.14.0", + "@jimp/plugin-mask": "^0.14.0", + "@jimp/plugin-normalize": "^0.14.0", + "@jimp/plugin-print": "^0.14.0", + "@jimp/plugin-resize": "^0.14.0", + "@jimp/plugin-rotate": "^0.14.0", + "@jimp/plugin-scale": "^0.14.0", + "@jimp/plugin-shadow": "^0.14.0", + "@jimp/plugin-threshold": "^0.14.0", + "timm": "^1.6.1" + } + }, + "@jimp/png": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.14.0", + "pngjs": "^3.3.3" + } + }, + "@jimp/tiff": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + } + }, + "@jimp/types": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.14.0", + "@jimp/gif": "^0.14.0", + "@jimp/jpeg": "^0.14.0", + "@jimp/png": "^0.14.0", + "@jimp/tiff": "^0.14.0", + "timm": "^1.6.1" + } + }, + "@jimp/utils": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", + "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.3", + "loader-utils": "^2.0.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.7.0" + } + }, + "@koa/cors": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-3.4.3.tgz", + "integrity": "sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==", + "dev": true, + "requires": { + "vary": "^1.1.2" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true + }, + "@lion/accordion": { + "version": "0.9.0", + "dev": true, + "requires": { + "@lion/core": "^0.22.0" + } + }, + "@lion/core": { + "version": "0.22.0", + "dev": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@open-wc/scoped-elements": "^2.1.1", + "lit": "^2.0.2" + } + }, + "@lit-labs/ssr-dom-shim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", + "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==" + }, + "@lit/reactive-element": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.0.0-rc.4.tgz", + "integrity": "sha512-dJMha+4NFYdpnUJzRrWTFV5Hdp9QHWFuPnaoqonrKl4lGJVnYez9mu8ev9F/5KM47tjAjh22DuRHrdFDHfOijA==" + }, + "@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + } + }, + "@material/animation": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/base": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/circular-progress": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-4A+HMgp66b45Fvbcbh9qb1j0vRFjKESbE2fHFkSMMNDPqFiKcvq4tJFBxKG2szYzpAnXdWLYaB+DeQ2+wSu9hg==", + "requires": { + "@material/animation": "14.0.0-canary.53b3cad2f.0", + "@material/base": "14.0.0-canary.53b3cad2f.0", + "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0", + "@material/progress-indicator": "14.0.0-canary.53b3cad2f.0", + "@material/rtl": "14.0.0-canary.53b3cad2f.0", + "@material/theme": "14.0.0-canary.53b3cad2f.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "@material/animation": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-GBuR4VmcTQW1D0lPXEosf5Giho72LLbyGIydWGtaEUtLJoive/D9kFkwTN4Fsyt9Kkl7hbhs35vrNe6QkAH4/Q==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/base": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-UJKbXwZtkrA3sfQDmj8Zbw1Q3Tqtl6KdfVFws95Yf7TCUgTFzbZI/FSx1w7dVugQPOEnIBuZnzqZam/MtHkx4w==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/feature-targeting": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-fn7Af3PRyARtNeYqtjxXmE3Y/dCpnpQVWWys57MqiGR/nvc6qpgOfJ6rOdcu/MrOysOE/oebTUDmDnTmwpe9Hw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/rtl": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-f08LT0HSa0WYU+4Jz/tbm1TQ9Fcf2k+H6dPPYv0J1sZmX6hMgCEmNiUdUFLQFvszoXx2XrRi1/hIFjbz2e69Yg==", + "requires": { + "@material/theme": "14.0.0-canary.53b3cad2f.0", + "tslib": "^2.1.0" + } + }, + "@material/theme": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-S06XAevDCDWMe+GgsEpITMS07imUidzadNaTbJsqssFajBLr53QWVZsG84BpjXKXoYvyEJvb0hX5U0lq6ip9UQ==", + "requires": { + "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0", + "tslib": "^2.1.0" + } + } + } + }, + "@material/density": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/dom": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { + "@material/feature-targeting": "14.0.0-canary.261f2db59.0", + "tslib": "^2.1.0" + } + }, + "@material/elevation": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { + "@material/animation": "14.0.0-canary.261f2db59.0", + "@material/base": "14.0.0-canary.261f2db59.0", + "@material/feature-targeting": "14.0.0-canary.261f2db59.0", + "@material/rtl": "14.0.0-canary.261f2db59.0", + "@material/theme": "14.0.0-canary.261f2db59.0", + "tslib": "^2.1.0" + } + }, + "@material/feature-targeting": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/floating-label": { + "version": "14.0.0-canary.261f2db59.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-14.0.0-canary.261f2db59.0.tgz", + "integrity": "sha512-Cp0/LngkW6/uZWbEDTe3Ox143V4kYtxl9twiM3XLKd6a67JHCzneQWFzC0qSg90b3r5O+1zOkT3ZMF2Pbu2Vwg==", + "requires": { + "@material/animation": "14.0.0-canary.261f2db59.0", + "@material/base": "14.0.0-canary.261f2db59.0", + "@material/dom": "14.0.0-canary.261f2db59.0", + "@material/feature-targeting": "14.0.0-canary.261f2db59.0", + "@material/rtl": "14.0.0-canary.261f2db59.0", + "@material/theme": "14.0.0-canary.261f2db59.0", + "@material/typography": "14.0.0-canary.261f2db59.0", + "tslib": "^2.1.0" + } + }, + "@material/form-field": { + "version": "14.0.0-canary.261f2db59.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-14.0.0-canary.261f2db59.0.tgz", + "integrity": "sha512-NCc/o60gwuF28PVMgFkHrKcHxIaCMZK9JRVfoaD0sF2BINYrjaCkFZ+x6AhNjAWLUQMhJMfc+1WXAUE2T85Mug==", + "requires": { + "@material/base": "14.0.0-canary.261f2db59.0", + "@material/feature-targeting": "14.0.0-canary.261f2db59.0", + "@material/ripple": "14.0.0-canary.261f2db59.0", + "@material/rtl": "14.0.0-canary.261f2db59.0", + "@material/theme": "14.0.0-canary.261f2db59.0", + "@material/typography": "14.0.0-canary.261f2db59.0", + "tslib": "^2.1.0" + } + }, + "@material/line-ripple": { + "version": "14.0.0-canary.261f2db59.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-14.0.0-canary.261f2db59.0.tgz", + "integrity": "sha512-LlyiyxpHNlFt0PZ8Q2tvOPbjNcgm3L7tUebXsM7iGyoKXfj0HwyDI31S0KgtU3Vs5DIK4U4mnRWtoAxtBW6Jfg==", + "requires": { + "@material/animation": "14.0.0-canary.261f2db59.0", + "@material/base": "14.0.0-canary.261f2db59.0", + "@material/feature-targeting": "14.0.0-canary.261f2db59.0", + "@material/theme": "14.0.0-canary.261f2db59.0", + "tslib": "^2.1.0" + } + }, + "@material/list": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { + "@material/base": "14.0.0-canary.261f2db59.0", + "@material/density": "14.0.0-canary.261f2db59.0", + "@material/dom": "14.0.0-canary.261f2db59.0", + "@material/feature-targeting": "14.0.0-canary.261f2db59.0", + "@material/ripple": "14.0.0-canary.261f2db59.0", + "@material/rtl": "14.0.0-canary.261f2db59.0", + "@material/shape": "14.0.0-canary.261f2db59.0", + "@material/theme": "14.0.0-canary.261f2db59.0", + "@material/typography": "14.0.0-canary.261f2db59.0", + "tslib": "^2.1.0" + } + }, + "@material/menu": { + "version": "14.0.0-canary.261f2db59.0", + "requires": { "@material/base": "14.0.0-canary.261f2db59.0", "@material/dom": "14.0.0-canary.261f2db59.0", "@material/elevation": "14.0.0-canary.261f2db59.0", @@ -29817,6 +36781,8 @@ }, "@polymer/app-layout": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@polymer/app-layout/-/app-layout-3.1.0.tgz", + "integrity": "sha512-+jf5/TtUDj/la9Vi59ooGNjnTN8JTkyIUK8gxAms0N3MmyeqrmcNLlJKDVyE6IIGKz0WfFeGKqKtmtTLHrZIlg==", "requires": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/iron-media-query": "^3.0.0-pre.26", @@ -29827,6 +36793,8 @@ }, "@polymer/app-localize-behavior": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/app-localize-behavior/-/app-localize-behavior-3.0.1.tgz", + "integrity": "sha512-0OZuUIMlfYvSJbB+clU+UaEuSDsvyu997xM3aRW33mGWijgUFMprWUQIP12RM8Ob/2i7WXJPn5ew3ir+rwTARg==", "requires": { "@polymer/iron-ajax": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0", @@ -29855,7 +36823,9 @@ } }, "@polymer/font-roboto": { - "version": "3.0.2" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.2.tgz", + "integrity": "sha512-tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==" }, "@polymer/iron-a11y-announcer": { "version": "3.2.0", @@ -29877,6 +36847,8 @@ }, "@polymer/iron-autogrow-textarea": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.3.tgz", + "integrity": "sha512-5r0VkWrIlm0JIp5E5wlnvkw7slK72lFRZXncmrsLZF+6n1dg2rI8jt7xpFzSmUWrqpcyXwyKaGaDvUjl3j4JLA==", "requires": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -29899,6 +36871,15 @@ "@polymer/polymer": "^3.0.0" } }, + "@polymer/iron-collapse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-collapse/-/iron-collapse-3.0.1.tgz", + "integrity": "sha512-yg6q5ZyckQR9VL9VmLrSTkSFXWy9AcJC8KtnD5cg0EHRPbakE8I9S/gVAgeP4nMWV2a/BjLLC4IBygcCMDhAGw==", + "requires": { + "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "@polymer/iron-dropdown": { "version": "3.0.1", "requires": { @@ -29910,6 +36891,8 @@ }, "@polymer/iron-fit-behavior": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.1.0.tgz", + "integrity": "sha512-ABcgIYqrjhmUT8tiuolqeGttF/8pd3sEymUDrO1vXbZu4FWIvoLNndrMDFvs++AGd12Mjf5pYy84NJc6dB8Vig==", "requires": { "@polymer/polymer": "^3.0.0" } @@ -29928,6 +36911,8 @@ }, "@polymer/iron-icon": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-icon/-/iron-icon-3.0.1.tgz", + "integrity": "sha512-QLPwirk+UPZNaLnMew9VludXA4CWUCenRewgEcGYwdzVgDPCDbXxy6vRJjmweZobMQv/oVLppT2JZtJFnPxX6g==", "requires": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/iron-meta": "^3.0.0-pre.26", @@ -29936,6 +36921,8 @@ }, "@polymer/iron-icons": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-icons/-/iron-icons-3.0.1.tgz", + "integrity": "sha512-xtEI8erH2GIBiF3QxEMyW81XuVjguu6Le5WjEEpX67qd9z7jjmc4T/ke3zRUlnDydex9p8ytcwVpMIKcyvjYAQ==", "requires": { "@polymer/iron-icon": "^3.0.0-pre.26", "@polymer/iron-iconset-svg": "^3.0.0-pre.26", @@ -30001,12 +36988,22 @@ }, "@polymer/iron-pages": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-pages/-/iron-pages-3.0.1.tgz", + "integrity": "sha512-PQe8S1JKHPcsIvFOaQP+9+AXmqUIL9fPqC6xT63OAZQxYCeZJDKgT9GKBx+VRryYBUlj2FLEXkUVpG+PTotdjg==", "requires": { "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", "@polymer/iron-selector": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" } }, + "@polymer/iron-range-behavior": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/iron-range-behavior/-/iron-range-behavior-3.0.1.tgz", + "integrity": "sha512-+jtL9v45M/T1RJleWyQaNH84S9/mIIR+AjNbYIttbKGp1eG+98j8MDWe7LXNtg79V2LQnE/+VS82cBeELyGVeg==", + "requires": { + "@polymer/polymer": "^3.0.0" + } + }, "@polymer/iron-resizable-behavior": { "version": "3.0.1", "requires": { @@ -30051,6 +37048,8 @@ }, "@polymer/paper-button": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-button/-/paper-button-3.0.1.tgz", + "integrity": "sha512-JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==", "requires": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/paper-behaviors": "^3.0.0-pre.27", @@ -30067,8 +37066,23 @@ "@polymer/polymer": "^3.0.0" } }, + "@polymer/paper-checkbox": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@polymer/paper-checkbox/-/paper-checkbox-3.1.0.tgz", + "integrity": "sha512-kXm6yDG1tT8if0XuJ2cc9NF+g8Ev4wG+rnf0a+Sx+O7J6fn1jcnBlYn72FlrfjVjDQZDBFmT6nynhD5PvFw8iQ==", + "requires": { + "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", + "@polymer/iron-checked-element-behavior": "^3.0.0-pre.26", + "@polymer/paper-behaviors": "^3.0.0-pre.27", + "@polymer/paper-ripple": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "@polymer/paper-dialog": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-dialog/-/paper-dialog-3.0.1.tgz", + "integrity": "sha512-KvglYbEq7AWJvui2j6WKLnOvgVMeGjovAydGrPRj7kVzCiD49Eq/hpYFJTRV5iDcalWH+mORUpw+jrFnG9+Kgw==", "requires": { "@polymer/iron-overlay-behavior": "^3.0.0-pre.27", "@polymer/neon-animation": "^3.0.0-pre.26", @@ -30084,8 +37098,21 @@ "@polymer/polymer": "^3.0.0" } }, + "@polymer/paper-dialog-scrollable": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-dialog-scrollable/-/paper-dialog-scrollable-3.0.1.tgz", + "integrity": "sha512-1E8B9kNdL58jUrJ/BwqJeOoNVcxNrB559z//d1V0rVHWT5bWCCZegwS3G06iFK5MjxWFbIKzleVTLrT0opiZkA==", + "requires": { + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/paper-dialog-behavior": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "@polymer/paper-dropdown-menu": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@polymer/paper-dropdown-menu/-/paper-dropdown-menu-3.2.0.tgz", + "integrity": "sha512-2ohwSHF+RLSK6kA0UkkMiMQF6EZcaEYWAA25kfisI6DWie7yozKrpQNsqvwfOEHU6DdDMIotrOtH1TM88YS8Zg==", "requires": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-form-element-behavior": "^3.0.0-pre.26", @@ -30102,6 +37129,8 @@ }, "@polymer/paper-icon-button": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@polymer/paper-icon-button/-/paper-icon-button-3.0.2.tgz", + "integrity": "sha512-kOdxQgnKL097bggFF6PWvsBYuWg+MCcoHoTHX6bh/MuZoWFZNjrFntFqwuB4oEbpjCpfm4moA33muPJFj7CihQ==", "requires": { "@polymer/iron-icon": "^3.0.0-pre.26", "@polymer/paper-behaviors": "^3.0.0-pre.27", @@ -30111,6 +37140,8 @@ }, "@polymer/paper-input": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-input/-/paper-input-3.2.1.tgz", + "integrity": "sha512-6ghgwQKM6mS0hAQxQqj+tkeEY1VUBqAsrasAm8V5RpNcfSWQC/hhRFxU0beGuKTAhndzezDzWYP6Zz4b8fExGg==", "requires": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-autogrow-textarea": "^3.0.0-pre.26", @@ -30123,6 +37154,8 @@ }, "@polymer/paper-item": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-item/-/paper-item-3.0.1.tgz", + "integrity": "sha512-KTk2N+GsYiI/HuubL3sxebZ6tteQbBOAp4QVLAnbjSPmwl+mJSDWk+omuadesU0bpkCwaWVs3fHuQsmXxy4pkw==", "requires": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -30132,6 +37165,8 @@ }, "@polymer/paper-listbox": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-listbox/-/paper-listbox-3.0.1.tgz", + "integrity": "sha512-vMLWFpYcggAPmEDBmK+96fFefacOG3GLB1EguTn8+ZkqI+328hNfw1MzHjH68rgCIIUtjmm+9qgB1Sy/MN0a/A==", "requires": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-menu-behavior": "^3.0.0-pre.26", @@ -30151,6 +37186,17 @@ "@polymer/polymer": "^3.0.0" } }, + "@polymer/paper-progress": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-progress/-/paper-progress-3.0.1.tgz", + "integrity": "sha512-5nguG+tmnyoaWKVNG8Smtno2uLSPBgEsT3f20JY8yJTjUBYWaqa8E3l5RLkTRXgA4x9OnvLb8/CdlQWXQIogBg==", + "requires": { + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/iron-range-behavior": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "@polymer/paper-ripple": { "version": "3.0.2", "requires": { @@ -30166,8 +37212,27 @@ "@polymer/polymer": "^3.0.0" } }, + "@polymer/paper-tabs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@polymer/paper-tabs/-/paper-tabs-3.1.0.tgz", + "integrity": "sha512-t8G+3CiyI0R+wA077UNQXR/oG9GlsqRRO1KMsFHHjBSsYqWXghNsqxUG827wEj+PafI5u9tZ3vVt1S++Lg4B2g==", + "requires": { + "@polymer/iron-behaviors": "^3.0.0-pre.26", + "@polymer/iron-flex-layout": "^3.0.0-pre.26", + "@polymer/iron-icon": "^3.0.0-pre.26", + "@polymer/iron-iconset-svg": "^3.0.0-pre.26", + "@polymer/iron-menu-behavior": "^3.0.0-pre.26", + "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", + "@polymer/paper-behaviors": "^3.0.0-pre.27", + "@polymer/paper-icon-button": "^3.0.0-pre.26", + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "@polymer/paper-toast": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-toast/-/paper-toast-3.0.1.tgz", + "integrity": "sha512-pizuogzObniDdICUc6dSLrnDt2VzzoRne1gCmbD6sfOATVv5tc8UfrqhA2iHngbNBEbniBiciS3iogdp5KTVUQ==", "requires": { "@polymer/iron-a11y-announcer": "^3.0.0-pre.26", "@polymer/iron-fit-behavior": "^3.0.0-pre.26", @@ -30175,6 +37240,15 @@ "@polymer/polymer": "^3.0.0" } }, + "@polymer/paper-tooltip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz", + "integrity": "sha512-yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==", + "requires": { + "@polymer/paper-styles": "^3.0.0-pre.26", + "@polymer/polymer": "^3.0.0" + } + }, "@polymer/polymer": { "version": "3.5.1", "requires": { @@ -30218,197 +37292,103 @@ "picomatch": "^2.2.2" } }, + "@sentry-internal/feedback": { + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.92.0.tgz", + "integrity": "sha512-/jEALRtVqboxB9kcK2tag8QCO6XANTlGBb9RV3oeGXJe0DDNJXRq6wVZbfgztXJRrfgx4XVDcNt1pRVoGGG++g==", + "requires": { + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" + } + }, + "@sentry-internal/tracing": { + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.92.0.tgz", + "integrity": "sha512-ur55vPcUUUWFUX4eVLNP71ohswK7ZZpleNZw9Y1GfLqyI+0ILQUwjtzqItJrdClvVsdRZJMRmDV40Hp9Lbb9mA==", + "requires": { + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" + } + }, "@sentry/browser": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.31.1.tgz", - "integrity": "sha512-Rg9F61S1tz1Dv3iUyyGP26bxoi7WJAG2+f2fBbSmFuJ+JTH4Jvu2/F1bBig8Dz01ejzVhbNSUUCfoDhSvksIsQ==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.92.0.tgz", + "integrity": "sha512-loMr02/zQ38u8aQhYLtIBg0i5n3ps2e3GUXrt3CdsJQdkRYfa62gcrE7SzvoEpMVHTk7VOI4fWGht8cWw/1k3A==", "requires": { - "@sentry/core": "7.31.1", - "@sentry/replay": "7.31.1", - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1", - "tslib": "^1.9.3" - }, - "dependencies": { - "@sentry/core": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.31.1.tgz", - "integrity": "sha512-quaNU6z8jabmatBTDi28Wpff2yzfWIp/IU4bbi2QOtEiCNT+TQJXqlRTRMu9xLrX7YzyKCL5X2gbit/85lyWUg==", - "requires": { - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1", - "tslib": "^1.9.3" - } - }, - "@sentry/types": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.31.1.tgz", - "integrity": "sha512-1uzr2l0AxEnxUX/S0EdmXUQ15/kDsam8Nbdw4Gai8SU764XwQgA/TTjoewVP597CDI/AHKan67Y630/Ylmkx9w==" - }, - "@sentry/utils": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.31.1.tgz", - "integrity": "sha512-ZsIPq29aNdP9q3R7qIzJhZ9WW+4DzE9g5SfGwx3UjTIxoRRBfdUJUbf7S+LKEdvCkKbyoDt6FLt5MiSJV43xBA==", - "requires": { - "@sentry/types": "7.31.1", - "tslib": "^1.9.3" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@sentry-internal/feedback": "7.92.0", + "@sentry-internal/tracing": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/replay": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" } }, "@sentry/core": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.30.0.tgz", - "integrity": "sha512-NeLigkBlpcK63ymM63GoIHurml6V3BUe1Vi+trwm4/qqOTzT7PQhvdJCX+o3+atzRBH+zdb6kd4VWx44Oye3KA==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.92.0.tgz", + "integrity": "sha512-1Tly7YB2I1byI5xb0Cwrxs56Rhww+6mQ7m9P7rTmdC3/ijOzbEoohtYIUPwcooCEarpbEJe/tAayRx6BrH2UbQ==", "requires": { - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" } }, "@sentry/electron": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-4.2.0.tgz", - "integrity": "sha512-9r7Kb4BOPXNClsYvzWJ1Nppf5cL8sck9Li4KIAgCq/ofogPiE54fbUdJtx5Fkagon5sBSjy0gu74xuhnPexhoA==", - "requires": { - "@sentry/browser": "7.30.0", - "@sentry/core": "7.30.0", - "@sentry/node": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "deepmerge": "4.2.2", - "tslib": "^2.3.1" - }, - "dependencies": { - "@sentry/browser": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.30.0.tgz", - "integrity": "sha512-9hpaNAqIBDLdnrZ51iWkqenRotqqweE1f2AlHO56nyT/UE+u+GdmAiBrgRNqdFQQM13JtTG/gu4HGOyLWb9HEA==", - "requires": { - "@sentry/core": "7.30.0", - "@sentry/replay": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/replay": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.30.0.tgz", - "integrity": "sha512-qJgz1tG0uStqMF5V7gN7KqxZuZY0MMQQY7siwPcSQVYj7X3AQswHjmvD4npEKbIa+jP6aQ6fFjoBjl3c0t3Mmg==", - "requires": { - "@sentry/core": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0" - } - }, + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-4.17.0.tgz", + "integrity": "sha512-1ThTHtn80E6h6mtt+V7tH03YW/vxwNfWrT8CxWSEUmtPQ/CPDpGZ8NN86lUwOPHjlSGBIYF4N33WVsGNhl+iAg==", + "requires": { + "@sentry/browser": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/node": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0", + "deepmerge": "4.3.0", + "tslib": "^2.5.0" + }, + "dependencies": { "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==" } } }, "@sentry/node": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.30.0.tgz", - "integrity": "sha512-YYasu6C3I0HBP4N1oc/ed2nunxhGJgtAWaKwq3lo8uk3uF6cB1A8+2e0CpjzU5ejhbaFPUBxHyj4th39Bvku/w==", - "requires": { - "@sentry/core": "7.30.0", - "@sentry/types": "7.30.0", - "@sentry/utils": "7.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.92.0.tgz", + "integrity": "sha512-LZeQL1r6kikEoOzA9K61OmMl32/lK/6PzmFNDH6z7UYwQopCZgVA6IP+CZuln8K2ys5c9hCyF7ICQMysXfpNJA==", + "requires": { + "@sentry-internal/tracing": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0", + "https-proxy-agent": "^5.0.0" } }, "@sentry/replay": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.31.1.tgz", - "integrity": "sha512-sLArvwZn6IwA/bASctyhxN7LhdCXJvMmyTynRfmk7pzuNzBMc5CNlHeIsDpHrfQuH53IKicvl6cHnHyclu5DSA==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.92.0.tgz", + "integrity": "sha512-G1t9Uvc9cR8VpNkElwvHIMGzykjIKikb10n0tfVd3e+rBPMCCjCPWOduwG6jZYxcvCjTpqmJh6NSLXxL/Mt4JA==", "requires": { - "@sentry/core": "7.31.1", - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1" - }, - "dependencies": { - "@sentry/core": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.31.1.tgz", - "integrity": "sha512-quaNU6z8jabmatBTDi28Wpff2yzfWIp/IU4bbi2QOtEiCNT+TQJXqlRTRMu9xLrX7YzyKCL5X2gbit/85lyWUg==", - "requires": { - "@sentry/types": "7.31.1", - "@sentry/utils": "7.31.1", - "tslib": "^1.9.3" - } - }, - "@sentry/types": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.31.1.tgz", - "integrity": "sha512-1uzr2l0AxEnxUX/S0EdmXUQ15/kDsam8Nbdw4Gai8SU764XwQgA/TTjoewVP597CDI/AHKan67Y630/Ylmkx9w==" - }, - "@sentry/utils": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.31.1.tgz", - "integrity": "sha512-ZsIPq29aNdP9q3R7qIzJhZ9WW+4DzE9g5SfGwx3UjTIxoRRBfdUJUbf7S+LKEdvCkKbyoDt6FLt5MiSJV43xBA==", - "requires": { - "@sentry/types": "7.31.1", - "tslib": "^1.9.3" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@sentry-internal/tracing": "7.92.0", + "@sentry/core": "7.92.0", + "@sentry/types": "7.92.0", + "@sentry/utils": "7.92.0" } }, "@sentry/types": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.30.0.tgz", - "integrity": "sha512-l4A86typvt/SfWh5JffpdxNGkg5EEA8m35BzpIcKmCAQZUDmnb4b478r8jdD2uuOjLmPNmZr1tifdRW4NCLuxQ==" + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.92.0.tgz", + "integrity": "sha512-APmSOuZuoRGpbPpPeYIbMSplPjiWNLZRQa73QiXuTflW4Tu/ItDlU8hOa2+A6JKVkJCuD2EN6yUrxDGSMyNXeg==" }, "@sentry/utils": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.30.0.tgz", - "integrity": "sha512-tSlBhr5u/LdE2emxIDTDmjmyRr99GnZGIAh5GwRxUgeDQ3VEfNUFlyFodBCbZ6yeYTYd6PWNih5xoHn1+Rf3Sw==", + "version": "7.92.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.92.0.tgz", + "integrity": "sha512-3nEfrQ1z28b/2zgFGANPh5yMVtgwXmrasZxTvKbrAj+KWJpjrJHrIR84r9W277J44NMeZ5RhRW2uoDmuBslPnA==", "requires": { - "@sentry/types": "7.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "@sentry/types": "7.92.0" } }, "@sindresorhus/is": { @@ -30582,6 +37562,12 @@ "integrity": "sha512-nOcaDp0Qa1i5T0IUeW5y8jiGD2VaOj9RV5FzfV5fpMBJ0vkPIC+NV9ELKHwooxBVEN2+mI0J+v6NC7oiEXpnLQ==", "dev": true }, + "@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "dev": true + }, "@types/chai": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", @@ -30712,6 +37698,12 @@ "@types/node": "*" } }, + "@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, "@types/express": { "version": "4.17.13", "dev": true, @@ -30751,6 +37743,12 @@ "@types/node": "*" } }, + "@types/hapi__joi": { + "version": "17.1.14", + "resolved": "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-17.1.14.tgz", + "integrity": "sha512-elV1VhwXUfA1sw59ij75HWyCH+3cA7xLbaOY9GQ+iQo/S+jSSf22LNZAmsXMdfV8DZwquCZaCT+F43Xf6/txrQ==", + "dev": true + }, "@types/hast": { "version": "2.3.4", "dev": true, @@ -31049,6 +38047,15 @@ "version": "14.18.23", "dev": true }, + "@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/parse5": { "version": "6.0.3", "dev": true @@ -31083,6 +38090,15 @@ "version": "1.26.0", "dev": true }, + "@types/puppeteer": { + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.7.tgz", + "integrity": "sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/qs": { "version": "6.9.7", "dev": true @@ -31091,6 +38107,31 @@ "version": "1.2.4", "dev": true }, + "@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "dev": true, + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, "@types/resolve": { "version": "1.17.1", "dev": true, @@ -31152,6 +38193,12 @@ "@types/node": "*" } }, + "@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, "@types/trusted-types": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", @@ -31172,6 +38219,16 @@ "dev": true, "optional": true }, + "@types/vinyl": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.11.tgz", + "integrity": "sha512-vPXzCLmRp74e9LsP8oltnWKTH+jBwt86WgRUb4Pc9Lf3pkMVGyvIo2gm9bODeGfCay2DBB/hAWDuvf07JcK4rw==", + "dev": true, + "requires": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, "@types/webcomponents.js": { "version": "0.6.37", "dev": true @@ -31597,118 +38654,148 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -31716,7 +38803,9 @@ "version": "1.11.0" }, "@webcomponents/webcomponentsjs": { - "version": "2.6.0" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz", + "integrity": "sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==" }, "@webpack-cli/configtest": { "version": "1.2.0", @@ -31737,10 +38826,14 @@ }, "@xtuc/ieee754": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, "@xtuc/long": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, "7zip-bin": { @@ -31759,18 +38852,21 @@ }, "accepts": { "version": "1.3.8", - "dev": true, "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "acorn": { - "version": "8.8.0", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-import-assertions": { - "version": "1.8.0", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} }, @@ -31816,7 +38912,6 @@ }, "ajv": { "version": "6.12.6", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -31902,6 +38997,15 @@ } } }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-html-community": { "version": "0.0.8", "dev": true @@ -31917,6 +39021,12 @@ "color-convert": "^2.0.1" } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true + }, "any-base": { "version": "1.1.0", "dev": true @@ -32007,6 +39117,15 @@ } } }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, "append-type": { "version": "1.0.2", "dev": true @@ -32018,6 +39137,29 @@ "version": "1.2.0", "dev": true }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", + "dev": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", + "dev": true + } + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, "argparse": { "version": "2.0.1" }, @@ -32076,6 +39218,42 @@ } } }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, "array-back": { "version": "3.1.0", "dev": true @@ -32094,10 +39272,21 @@ "version": "3.0.0", "dev": true }, - "array-flatten": { - "version": "1.1.1", + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true }, + "array-flatten": { + "version": "1.1.1" + }, "array-ify": { "version": "1.0.0", "dev": true @@ -32113,6 +39302,66 @@ "is-string": "^1.0.7" } }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "array-to-sentence": { "version": "1.1.0", "dev": true @@ -32125,6 +39374,12 @@ "version": "1.0.3", "dev": true }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, "array.prototype.flat": { "version": "1.3.0", "dev": true, @@ -32170,8 +39425,7 @@ "dev": true }, "arrify": { - "version": "2.0.1", - "dev": true + "version": "2.0.1" }, "asar": { "version": "3.2.0", @@ -32188,14 +39442,12 @@ }, "asn1": { "version": "0.2.6", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, "assert-plus": { - "version": "1.0.0", - "dev": true + "version": "1.0.0" }, "assert-valid-glob-opts": { "version": "1.0.0", @@ -32205,6 +39457,12 @@ "validate-glob-opts": "^1.0.0" } }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, "ast-metadata-inferer": { "version": "0.7.0", "dev": true, @@ -32230,20 +39488,52 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true + }, "async-exit-hook": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, "asynckit": { - "version": "0.4.0", - "dev": true + "version": "0.4.0" }, "at-least-node": { "version": "1.0.0", "dev": true }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "auto-launch": { "version": "5.0.5", "requires": { @@ -32261,12 +39551,10 @@ "dev": true }, "aws-sign2": { - "version": "0.7.0", - "dev": true + "version": "0.7.0" }, "aws4": { - "version": "1.11.0", - "dev": true + "version": "1.11.0" }, "axe-core": { "version": "4.8.1", @@ -32462,6 +39750,23 @@ } } }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, "backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -32476,6 +39781,32 @@ "version": "1.0.2", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, "base64-arraybuffer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", @@ -32483,8 +39814,7 @@ "dev": true }, "base64-js": { - "version": "1.5.1", - "dev": true + "version": "1.5.1" }, "base64id": { "version": "2.0.0", @@ -32496,7 +39826,6 @@ }, "bcrypt-pbkdf": { "version": "1.0.2", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -32509,10 +39838,273 @@ "version": "5.2.2", "dev": true }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, + "bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "requires": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "requires": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dev": true, + "requires": { + "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" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true + }, + "filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "is-plain-obj": { + "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==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", + "dev": true, + "requires": { + "p-timeout": "^1.1.1" + } + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "path-key": { + "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==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "dev": true + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, "binary-extensions": { "version": "2.2.0", "dev": true }, + "binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "4.1.0", "dev": true, @@ -32557,8 +40149,9 @@ "dev": true }, "body-parser": { - "version": "1.20.0", - "dev": true, + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -32568,33 +40161,29 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.2", - "dev": true + "version": "3.1.2" }, "debug": { "version": "2.6.9", - "dev": true, "requires": { "ms": "2.0.0" } }, "iconv-lite": { "version": "0.4.24", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ms": { - "version": "2.0.0", - "dev": true + "version": "2.0.0" } } }, @@ -32661,12 +40250,14 @@ "dev": true }, "browserslist": { - "version": "4.21.3", + "version": "4.22.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", + "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "browserslist-useragent": { @@ -32727,6 +40318,11 @@ "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -32848,6 +40444,23 @@ } } }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, "cache-content-type": { "version": "1.0.1", "dev": true, @@ -32890,7 +40503,6 @@ }, "call-bind": { "version": "1.0.2", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -32936,6 +40548,24 @@ "version": "2.0.1", "dev": true }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + } + } + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -32949,13 +40579,24 @@ } }, "caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==" + "version": "1.0.30001585", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", + "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==" }, "caseless": { - "version": "0.12.0", - "dev": true + "version": "0.12.0" + }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "requires": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + } }, "ccount": { "version": "1.1.0", @@ -33024,6 +40665,43 @@ "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", "dev": true }, + "circle-flags": { + "version": "git+ssh://git@github.com/HatScripts/circle-flags.git#7b0dc8acd3b1c5994281832b9f03cc7c537617c5", + "from": "circle-flags@github:HatScripts/circle-flags" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + } + } + }, "clean-css": { "version": "4.2.4", "dev": true, @@ -33055,6 +40733,11 @@ "string-width": "^4.2.0" } }, + "clipboard-polyfill": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/clipboard-polyfill/-/clipboard-polyfill-2.8.6.tgz", + "integrity": "sha512-kz/1ov+PXsBpGnW9XJH3dLWdYj12FpXqO89Dngm/GRPoI36E/tnYs6N0YPTEhxM9WHAlFiN5eoyIVuv5nzKXvg==" + }, "cliui": { "version": "7.0.4", "dev": true, @@ -33068,6 +40751,12 @@ "version": "2.1.2", "dev": true }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "dev": true + }, "clone-deep": { "version": "4.0.1", "dev": true, @@ -33086,6 +40775,23 @@ "mimic-response": "^1.0.0" } }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, "co": { "version": "4.6.0", "dev": true @@ -33110,6 +40816,27 @@ "version": "1.0.6", "dev": true }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "2.0.1", "dev": true, @@ -33121,6 +40848,12 @@ "version": "1.1.4", "dev": true }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "colorette": { "version": "2.0.19", "dev": true @@ -33133,7 +40866,6 @@ }, "combined-stream": { "version": "1.0.8", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -33306,12 +41038,66 @@ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, - "optional": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, + "config-file-ts": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", + "dev": true, + "requires": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + } + } + }, "connect": { "version": "3.7.0", "dev": true, @@ -33375,20 +41161,17 @@ }, "content-disposition": { "version": "0.5.4", - "dev": true, "requires": { "safe-buffer": "5.2.1" }, "dependencies": { "safe-buffer": { - "version": "5.2.1", - "dev": true + "version": "5.2.1" } } }, "content-type": { - "version": "1.0.4", - "dev": true + "version": "1.0.4" }, "conventional-changelog-conventionalcommits": { "version": "4.6.3", @@ -33407,11 +41190,11 @@ } }, "cookie": { - "version": "0.4.2" + "version": "0.4.2", + "dev": true }, "cookie-signature": { - "version": "1.0.6", - "dev": true + "version": "1.0.6" }, "cookies": { "version": "0.8.0", @@ -33433,10 +41216,34 @@ "run-queue": "^1.0.0" } }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, "copy-dir": { "version": "1.3.0", "dev": true }, + "copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "requires": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } + } + }, "copy-webpack-plugin": { "version": "5.1.2", "dev": true, @@ -34330,6 +42137,15 @@ "version": "3.0.0", "dev": true }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "custom-event": { "version": "1.0.1", "dev": true @@ -34338,9 +42154,18 @@ "version": "1.0.1", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -34369,6 +42194,53 @@ "version": "1.2.0", "dev": true }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -34378,6 +42250,144 @@ "mimic-response": "^1.0.0" } }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, "dedent": { "version": "0.7.0", "dev": true @@ -34400,6 +42410,23 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "default-gateway": { "version": "6.0.3", "dev": true, @@ -34407,6 +42434,12 @@ "execa": "^5.0.0" } }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", + "dev": true + }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -34439,6 +42472,16 @@ "object-keys": "^1.1.1" } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, "del": { "version": "3.0.0", "dev": true, @@ -34482,8 +42525,7 @@ } }, "delayed-stream": { - "version": "1.0.0", - "dev": true + "version": "1.0.0" }, "delegates": { "version": "1.0.0", @@ -34503,8 +42545,7 @@ } }, "depd": { - "version": "2.0.0", - "dev": true + "version": "2.0.0" }, "dependency-graph": { "version": "0.11.0", @@ -34513,8 +42554,7 @@ "dev": true }, "destroy": { - "version": "1.2.0", - "dev": true + "version": "1.2.0" }, "detab": { "version": "2.0.4", @@ -34523,6 +42563,12 @@ "repeat-string": "^1.5.4" } }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, "detect-indent": { "version": "6.1.0", "dev": true @@ -34738,6 +42784,194 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "download": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", + "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", + "dev": true, + "requires": { + "archive-type": "^4.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.2.1", + "ext-name": "^5.0.0", + "file-type": "^11.1.0", + "filenamify": "^3.0.0", + "get-stream": "^4.1.0", + "got": "^8.3.1", + "make-dir": "^2.1.0", + "p-event": "^2.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "file-type": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", + "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "is-plain-obj": { + "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==", + "dev": true + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, "duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -34758,6 +42992,16 @@ "version": "0.1.1", "dev": true }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -34766,15 +43010,21 @@ }, "ecc-jsbn": { "version": "0.1.2", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { - "version": "1.1.1", - "dev": true + "version": "1.1.1" }, "ejs": { "version": "3.1.8", @@ -34860,6 +43110,16 @@ "jimp": "^0.14.0" } }, + "electron-notarize": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.2.2.tgz", + "integrity": "sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + } + }, "electron-osx-sign": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz", @@ -34949,7 +43209,9 @@ } }, "electron-to-chromium": { - "version": "1.4.215" + "version": "1.4.659", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.659.tgz", + "integrity": "sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==" }, "electron-updater": { "version": "5.2.1", @@ -35003,12 +43265,10 @@ "dev": true }, "encodeurl": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "encoding": { "version": "0.1.13", - "dev": true, "optional": true, "requires": { "iconv-lite": "^0.6.2" @@ -35114,7 +43374,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.10.0", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -35420,7 +43682,9 @@ } }, "es-module-lexer": { - "version": "1.0.3", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, "es-module-shims": { @@ -35454,6 +43718,17 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -35461,10 +43736,43 @@ "dev": true, "optional": true }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-promise": { "version": "4.2.8", "dev": true }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "esbuild": { "version": "0.12.29", "dev": true @@ -35473,8 +43781,7 @@ "version": "3.1.1" }, "escape-html": { - "version": "1.0.3", - "dev": true + "version": "1.0.3" }, "escape-string-regexp": { "version": "4.0.0", @@ -35889,8 +44196,7 @@ "dev": true }, "etag": { - "version": "1.8.1", - "dev": true + "version": "1.8.1" }, "eventemitter3": { "version": "4.0.7", @@ -35919,6 +44225,81 @@ "version": "0.1.12", "dev": true }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -35926,12 +44307,13 @@ "dev": true }, "express": { - "version": "4.18.1", - "dev": true, + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -35950,7 +44332,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -35963,29 +44345,112 @@ }, "dependencies": { "cookie": { - "version": "0.5.0", - "dev": true + "version": "0.5.0" }, "debug": { "version": "2.6.9", - "dev": true, "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0", - "dev": true + "version": "2.0.0" }, "safe-buffer": { - "version": "5.2.1", + "version": "5.2.1" + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true } } }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, "extend": { + "version": "3.0.2" + }, + "extend-shallow": { "version": "3.0.2", - "dev": true + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } }, "extract-zip": { "version": "1.7.0", @@ -36014,14 +44479,25 @@ "version": "1.4.1", "dev": true }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, "fast-deep-equal": { - "version": "3.1.3", - "dev": true + "version": "3.1.3" }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -36036,13 +44512,17 @@ "dev": true }, "fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true + "version": "2.1.0" }, "fast-levenshtein": { "version": "2.0.6", "dev": true }, + "fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, "fastest-levenshtein": { "version": "1.0.16", "dev": true @@ -36112,6 +44592,13 @@ "version": "9.0.0", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "file-url": { "version": "2.0.2", "dev": true @@ -36145,6 +44632,23 @@ } } }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true + }, + "filenamify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", + "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, "fill-range": { "version": "7.0.1", "dev": true, @@ -36154,7 +44658,6 @@ }, "finalhandler": { "version": "1.2.0", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -36167,14 +44670,12 @@ "dependencies": { "debug": { "version": "2.6.9", - "dev": true, "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0", - "dev": true + "version": "2.0.0" } } }, @@ -36220,6 +44721,154 @@ } } }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, "flat": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", @@ -36273,6 +44922,21 @@ "is-callable": "^1.1.3" } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -36292,8 +44956,7 @@ } }, "forever-agent": { - "version": "0.6.1", - "dev": true + "version": "0.6.1" }, "form-data": { "version": "4.0.0", @@ -36316,12 +44979,19 @@ } }, "forwarded": { - "version": "0.2.0", - "dev": true + "version": "0.2.0" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } }, "fresh": { - "version": "0.5.2", - "dev": true + "version": "0.5.2" }, "from2": { "version": "2.3.0", @@ -36352,6 +45022,16 @@ "minipass": "^3.0.0" } }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, "fs-monkey": { "version": "1.0.3", "dev": true @@ -36376,8 +45056,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "dev": true + "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": { "version": "1.1.6", @@ -36401,6 +45082,55 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, + "gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "dependencies": { + "node-fetch": { + "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==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "requires": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "dev": true @@ -36413,7 +45143,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -36421,6 +45150,15 @@ "has-symbols": "^1.0.3" } }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "requires": { + "npm-conf": "^1.1.0" + } + }, "get-stdin": { "version": "6.0.0", "dev": true @@ -36441,9 +45179,14 @@ "version": "4.2.0", "dev": true }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, "getpass": { "version": "0.1.7", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -36487,10 +45230,280 @@ "is-glob": "^4.0.1" } }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "glob-to-regexp": { "version": "0.4.1", "dev": true }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, "global": { "version": "4.4.0", "dev": true, @@ -36526,6 +45539,41 @@ } } }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "global-tunnel-ng": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", @@ -36572,6 +45620,39 @@ "version": "0.1.2", "dev": true }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "google-auth-library": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", + "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.3.0", + "gtoken": "^6.1.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + } + }, + "google-p12-pem": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", + "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", + "requires": { + "node-forge": "^1.3.1" + } + }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -36624,11 +45705,227 @@ "version": "1.0.4", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "gtoken": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", + "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", + "requires": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + } + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-regex": { + "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==", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } + }, + "gulp-posthtml": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/gulp-posthtml/-/gulp-posthtml-3.0.5.tgz", + "integrity": "sha512-3+whkhaYkZyp7Tl97/laTxy+Q43tL1Nk07DAXcBK3jbkmLeRwBpq6pPT2UAkDaI1wgN6jfBfXSaGcX5nzET6Ww==", + "dev": true, + "requires": { + "plugin-error": "^1.0.1", + "posthtml": "^0.11.6", + "posthtml-load-config": "^1.0.0", + "through2": "^3.0.2" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-replace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.4.tgz", + "integrity": "sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/vinyl": "^2.0.4", + "istextorbinary": "^3.0.0", + "replacestream": "^4.0.3", + "yargs-parser": ">=5.0.0-security.0" + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } }, "handle-thing": { "version": "2.0.1", @@ -36648,12 +45945,10 @@ } }, "har-schema": { - "version": "2.0.0", - "dev": true + "version": "2.0.0" }, "har-validator": { "version": "5.1.5", - "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -36661,7 +45956,6 @@ }, "has": { "version": "1.0.3", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -36720,12 +46014,25 @@ "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", "dev": true }, "has-symbols": { - "version": "1.0.3", - "dev": true + "version": "1.0.3" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } }, "has-tostringtag": { "version": "1.0.0", @@ -36740,6 +46047,64 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "hasha": { "version": "2.2.0", "dev": true, @@ -36754,6 +46119,15 @@ } } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "hast-to-hyperscript": { "version": "9.0.1", "dev": true, @@ -36874,6 +46248,15 @@ "version": "1.2.0", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "4.1.0", "dev": true, @@ -36932,7 +46315,9 @@ "dev": true }, "html-webpack-plugin": { - "version": "5.5.0", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "requires": { "@types/html-minifier-terser": "^6.0.0", @@ -36993,7 +46378,6 @@ }, "http-errors": { "version": "2.0.0", - "dev": true, "requires": { "depd": "2.0.0", "inherits": "2.0.4", @@ -37045,7 +46429,6 @@ }, "http-signature": { "version": "1.2.0", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -37243,7 +46626,7 @@ }, "iconv-lite": { "version": "0.6.3", - "dev": true, + "devOptional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -37256,1054 +46639,1963 @@ "version": "0.1.5", "dev": true }, - "ignore": { - "version": "5.2.0", + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.4", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-q": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/node": "16.9.1" + }, + "dependencies": { + "@types/node": { + "version": "16.9.1", + "dev": true + } + } + }, + "import-fresh": { + "version": "3.3.0", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "dev": true + }, + "indexed-filter": { + "version": "1.0.3", + "dev": true, + "requires": { + "append-type": "^1.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "dev": true + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "init-package-json": { + "version": "2.0.5", + "dev": true, + "requires": { + "npm-package-arg": "^8.1.5", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "^4.1.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "inline-style-parser": { + "version": "0.1.1", + "dev": true + }, + "inspect-with-kind": { + "version": "1.0.5", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "2.2.0", + "dev": true + }, + "intersection-observer": { + "version": "0.12.2", + "dev": true + }, + "intl-format-cache": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/intl-format-cache/-/intl-format-cache-4.3.1.tgz", + "integrity": "sha512-OEUYNA7D06agqPOYhbTkl0T8HA3QKSuwWh1HiClEnpd9vw7N+3XsQt5iZ0GUEchp5CW1fQk/tary+NsbF3yQ1Q==" + }, + "intl-messageformat": { + "version": "9.13.0", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "1.11.4", + "@formatjs/fast-memoize": "1.2.1", + "@formatjs/icu-messageformat-parser": "2.1.0", + "tslib": "^2.1.0" + } + }, + "intl-messageformat-parser": { + "version": "1.4.0" + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "dev": true + }, + "ios-deploy": { + "version": "1.11.4", + "optional": true + }, + "ios-sim": { + "version": "8.0.2", + "dev": true, + "requires": { + "bplist-parser": "^0.0.6", + "nopt": "1.0.9", + "plist": "^3.0.1", + "simctl": "^2" + }, + "dependencies": { + "bplist-parser": { + "version": "0.0.6", + "dev": true + }, + "nopt": { + "version": "1.0.9", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "ip": { + "version": "1.1.8" + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha512-HjpCHTuxbR/6jWJroc/VN+npo5j0T4Vv2TAI5qdEHQx7hsL767MeccGFSsLtF694EiZKTSEqgoeU6DtGFCcuqQ==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-alphabetical": { + "version": "1.0.4", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "dev": true + }, + "is-builtin-module": { + "version": "3.2.0", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.10.0", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "dev": true + }, + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-directory": { + "version": "0.3.1", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "dev": true + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-extglob": { + "version": "2.1.1", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "is-function": { + "version": "1.0.2", + "dev": true + }, + "is-generator-function": { + "version": "1.0.10", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "dev": true + }, + "is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "is-lambda": { + "version": "1.0.1", + "dev": true + }, + "is-module": { + "version": "1.0.0", + "dev": true + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "dev": true + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + }, + "dependencies": { + "is-path-inside": { + "version": "1.0.1", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + } + } + }, + "is-path-inside": { + "version": "3.0.3", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", "dev": true }, - "ignore-walk": { - "version": "3.0.4", + "is-plain-object": { + "version": "2.0.4", "dev": true, "requires": { - "minimatch": "^3.0.4" + "isobject": "^3.0.1" } }, - "image-q": { - "version": "4.0.0", + "is-regex": { + "version": "1.1.4", "dev": true, "requires": { - "@types/node": "16.9.1" - }, - "dependencies": { - "@types/node": { - "version": "16.9.1", - "dev": true - } + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "import-fresh": { - "version": "3.3.0", + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "is-unc-path": "^1.0.0" } }, - "import-local": { - "version": "3.1.0", + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", "dev": true, "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "call-bind": "^1.0.2" } }, - "imurmurhash": { - "version": "0.1.4", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "dev": true + "is-stream": { + "version": "2.0.1" }, - "indexed-filter": { - "version": "1.0.3", + "is-string": { + "version": "1.0.7", "dev": true, "requires": { - "append-type": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", - "dev": true - }, - "infer-owner": { + "is-symbol": { "version": "1.0.4", - "dev": true - }, - "inflation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", - "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", - "dev": true - }, - "inflight": { - "version": "1.0.6", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "has-symbols": "^1.0.2" } }, - "inherits": { - "version": "2.0.4", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, - "optional": true + "requires": { + "which-typed-array": "^1.1.11" + } }, - "init-package-json": { - "version": "2.0.5", + "is-typedarray": { + "version": "1.0.0" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { - "npm-package-arg": "^8.1.5", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "unc-path-regex": "^0.1.2" } }, - "inline-style-parser": { - "version": "0.1.1", + "is-utf8": { + "version": "0.2.1", "dev": true }, - "inspect-with-kind": { - "version": "1.0.5", + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "dev": true + }, + "is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "is-invalid-path": "^0.1.0" } }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "is-weakref": { + "version": "1.0.2", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "call-bind": "^1.0.2" } }, - "interpret": { - "version": "2.2.0", + "is-whitespace-character": { + "version": "1.0.4", "dev": true }, - "intersection-observer": { - "version": "0.12.2", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "intl-messageformat": { - "version": "9.13.0", + "is-word-character": { + "version": "1.0.4", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", "dev": true, "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/fast-memoize": "1.2.1", - "@formatjs/icu-messageformat-parser": "2.1.0", - "tslib": "^2.1.0" + "is-docker": "^2.0.0" } }, - "intl-messageformat-parser": { - "version": "1.4.0" - }, - "invert-kv": { + "isarray": { "version": "1.0.0", "dev": true }, - "ios-deploy": { - "version": "1.11.4", - "optional": true + "isbinaryfile": { + "version": "4.0.10", + "dev": true }, - "ios-sim": { - "version": "8.0.2", + "isexe": { + "version": "2.0.0", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "dev": true + }, + "isstream": { + "version": "0.1.2" + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==", "dev": true, "requires": { - "bplist-parser": "^0.0.6", - "nopt": "1.0.9", - "plist": "^3.0.1", - "simctl": "^2" + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" }, "dependencies": { - "bplist-parser": { - "version": "0.0.6", + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, "nopt": { - "version": "1.0.9", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, "requires": { "abbrev": "1" } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, - "ip": { - "version": "1.1.8" - }, - "ipaddr.js": { - "version": "1.9.1", - "dev": true - }, - "is-alphabetical": { - "version": "1.0.4", + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, - "is-alphanumerical": { - "version": "1.0.4", + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" } }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "make-dir": { + "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==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "is-arrayish": { - "version": "0.2.1", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "requires": { - "has-bigints": "^1.0.1" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, - "is-binary-path": { - "version": "2.1.0", + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { - "binary-extensions": "^2.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "is-boolean-object": { - "version": "1.1.2", + "istextorbinary": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", + "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "binaryextensions": "^2.2.0", + "textextensions": "^3.2.0" } }, - "is-buffer": { - "version": "2.0.5", - "dev": true - }, - "is-builtin-module": { - "version": "3.2.0", + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "requires": { - "builtin-modules": "^3.3.0" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "requires": { - "ci-info": "^3.2.0" + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" } }, - "is-core-module": { - "version": "2.10.0", + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", "dev": true, "requires": { - "has": "^1.0.3" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } } }, - "is-date-object": { - "version": "1.0.5", + "jasmine-core": { + "version": "3.99.1", + "dev": true + }, + "jest-worker": { + "version": "26.6.2", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" } }, - "is-decimal": { - "version": "1.0.4", - "dev": true - }, - "is-directory": { - "version": "0.3.1", - "dev": true + "jimp": { + "version": "0.14.0", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.14.0", + "@jimp/plugins": "^0.14.0", + "@jimp/types": "^0.14.0", + "regenerator-runtime": "^0.13.3" + } }, - "is-docker": { - "version": "2.2.1", + "jpeg-js": { + "version": "0.4.4", "dev": true }, - "is-extglob": { - "version": "2.1.1", - "dev": true + "js-base64": { + "version": "3.7.2" }, - "is-fullwidth-code-point": { - "version": "3.0.0", + "js-string-escape": { + "version": "1.0.1", "dev": true }, - "is-function": { - "version": "1.0.2", + "js-tokens": { + "version": "4.0.0", "dev": true }, - "is-generator-function": { - "version": "1.0.10", - "dev": true, + "js-yaml": { + "version": "4.1.0", "requires": { - "has-tostringtag": "^1.0.0" + "argparse": "^2.0.1" } }, - "is-glob": { - "version": "4.0.3", - "dev": true, + "jsbn": { + "version": "0.1.1" + }, + "jsesc": { + "version": "2.5.2", + "dev": true + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "requires": { - "is-extglob": "^2.1.1" + "bignumber.js": "^9.0.0" } }, - "is-hexadecimal": { - "version": "1.0.4", + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", "dev": true }, - "is-lambda": { - "version": "1.0.1", + "json-parse-better-errors": { + "version": "1.0.2", "dev": true }, - "is-module": { - "version": "1.0.0", + "json-parse-even-better-errors": { + "version": "2.3.1", "dev": true }, - "is-negative-zero": { - "version": "2.0.2", + "json-schema": { + "version": "0.4.0" + }, + "json-schema-traverse": { + "version": "0.4.1" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", "dev": true }, - "is-number": { - "version": "7.0.0", + "json-stringify-safe": { + "version": "5.0.1" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, - "is-number-object": { - "version": "1.0.7", - "dev": true, + "jsonfile": { + "version": "6.1.0", "requires": { - "has-tostringtag": "^1.0.0" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, - "is-obj": { - "version": "2.0.0", - "dev": true + "jsonic": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/jsonic/-/jsonic-0.3.1.tgz", + "integrity": "sha512-5Md4EK3vPAMvP2sXY6M3/vQEPeX3LxEQBJuF979uypddXjsUlEoAI9/Nojh8tbw+YU5FjMoqSElO6oyjrAuprw==" }, - "is-path-cwd": { - "version": "1.0.0", + "jsonparse": { + "version": "1.3.1", "dev": true }, - "is-path-in-cwd": { - "version": "1.0.1", - "dev": true, + "jsprim": { + "version": "1.4.2", "requires": { - "is-path-inside": "^1.0.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "dependencies": { - "is-path-inside": { - "version": "1.0.1", - "dev": true, + "core-util-is": { + "version": "1.0.2" + }, + "extsprintf": { + "version": "1.3.0" + }, + "verror": { + "version": "1.10.0", "requires": { - "path-is-inside": "^1.0.1" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } } } }, - "is-path-inside": { - "version": "3.0.3", + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", "dev": true }, - "is-plain-obj": { - "version": "2.1.0", - "dev": true + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } }, - "is-plain-object": { - "version": "2.0.4", - "dev": true, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", "requires": { - "isobject": "^3.0.1" + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" } }, - "is-regex": { - "version": "1.1.4", + "karma": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ua-parser-js": { + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", + "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "dev": true, + "requires": { + "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-parser": { + "version": "20.2.9", + "dev": true + } } }, - "is-shared-array-buffer": { - "version": "1.0.2", + "karma-chrome-launcher": { + "version": "3.1.1", "dev": true, "requires": { - "call-bind": "^1.0.2" + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "is-stream": { - "version": "2.0.1", - "dev": true - }, - "is-string": { - "version": "1.0.7", + "karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@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-source-maps": { + "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==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + } } }, - "is-symbol": { - "version": "1.0.4", + "karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" } }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "karma-jasmine": { + "version": "4.0.2", "dev": true, "requires": { - "which-typed-array": "^1.1.11" + "jasmine-core": "^3.6.0" } }, - "is-typedarray": { - "version": "1.0.0", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", + "karma-mocha": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", + "integrity": "sha512-twRO+KCXIFOBs7o6i7oIpTJhVvjKZbIsUM96A+k2QaeXOzbVQXCkjVzXqNeQoczW4ruasPZYi0iWMTkfTrQVCw==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==", + "dev": true + } } }, - "is-whitespace-character": { - "version": "1.0.4", - "dev": true - }, - "is-word-character": { - "version": "1.0.4", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", + "karma-mocha-reporter": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==", "dev": true, "requires": { - "is-docker": "^2.0.0" + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, + "ansi-styles": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "isarray": { - "version": "1.0.0", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "dev": true - }, - "isstream": { - "version": "0.1.2", + "karma-mocha-snapshot": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/karma-mocha-snapshot/-/karma-mocha-snapshot-0.2.1.tgz", + "integrity": "sha512-uXm9Kg6HlP05jbKvQNoZMNq8d6hEhzr6Cdxl4LhklX/0CSbsE/5hCRiDPLVNa6+7NIioWu2HTcgshtWmXe+eVA==", "dev": true }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==", + "karma-snapshot": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/karma-snapshot/-/karma-snapshot-0.6.0.tgz", + "integrity": "sha512-S34sM1jNPD2KFPWfiucsWjrSnl3Ox8aoKlwEnmV2advFkBsl4zpOZ1LKySQbzFsLasEotPvr4RhFeN7CLatozg==", "dev": true, "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "mkdirp": "^0.5.1", + "remark-parse": "^4.0.0", + "unified": "^6.1.5" }, "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "is-plain-obj": { + "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==", + "dev": true + }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true + "remark-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz", + "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==", + "dev": true, + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^2.0.0", + "x-is-string": "^0.1.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", "dev": true }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "unist-util-visit": "^1.1.0" } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", "dev": true }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } + "unist-util-visit-parents": "^2.0.0" } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "dev": true, "requires": { - "abbrev": "1" + "unist-util-is": "^3.0.0" } }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", + "dev": true + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", "dev": true, "requires": { - "isexe": "^2.0.0" + "unist-util-stringify-position": "^1.1.1" } } } }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "source-map-support": "^0.5.5" } }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "karma-webpack": { + "version": "5.0.0", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "webpack-merge": "^4.1.5" }, "dependencies": { - "make-dir": { - "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==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "webpack-merge": { + "version": "4.2.2", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "lodash": "^4.17.15" } } } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "kew": { + "version": "0.7.0", + "dev": true + }, + "keygrip": { + "version": "1.1.0", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" + "tsscmp": "1.0.6" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "koa": { + "version": "2.13.4", + "dev": true, + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" }, "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "http-errors": { + "version": "1.8.1", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "dev": true + } } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "statuses": { + "version": "1.5.0", "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + } + } + }, + "koa-compose": { + "version": "4.1.0", + "dev": true + }, + "koa-compress": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.1.0.tgz", + "integrity": "sha512-0m24/yS/GbhWI+g9FqtvStY+yJwTObwoxOvPok6itVjRen7PBWkjsJ8pre76m+99YybXLKhOJ62mJ268qyBFMQ==", + "dev": true, + "requires": { + "bytes": "^3.0.0", + "compressible": "^2.0.0", + "koa-is-json": "^1.0.0", + "statuses": "^1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true } } }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "koa-convert": { + "version": "2.0.0", "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "co": "^4.6.0", + "koa-compose": "^4.1.0" } }, - "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "koa-etag": { + "version": "4.0.0", "dev": true, "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "etag": "^1.8.1" } }, - "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==", + "dev": true + }, + "koa-send": { + "version": "5.0.1", "dev": true, "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" }, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "depd": { + "version": "1.1.2", + "dev": true + }, + "http-errors": { + "version": "1.8.1", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" } + }, + "statuses": { + "version": "1.5.0", + "dev": true } } }, - "jasmine-core": { - "version": "3.99.1", - "dev": true - }, - "jest-worker": { - "version": "26.6.2", + "koa-static": { + "version": "5.0.0", "dev": true, "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, - "jimp": { - "version": "0.14.0", + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", "dev": true, "requires": { - "@babel/runtime": "^7.7.2", - "@jimp/custom": "^0.14.0", - "@jimp/plugins": "^0.14.0", - "@jimp/types": "^0.14.0", - "regenerator-runtime": "^0.13.3" + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" } }, - "jpeg-js": { - "version": "0.4.4", - "dev": true + "launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } }, - "js-base64": { - "version": "3.7.2" + "lazy-val": { + "version": "1.0.5" }, - "js-string-escape": { + "lazystream": { "version": "1.0.1", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, "requires": { - "argparse": "^2.0.1" + "readable-stream": "^2.0.5" } }, - "jsbn": { - "version": "0.1.1", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true + "lcid": { + "version": "1.0.0", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } }, - "json-schema": { - "version": "0.4.0", - "dev": true + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } }, - "json-schema-traverse": { + "levn": { "version": "0.4.1", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", + "dev": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "jsonparse": { - "version": "1.3.1", - "dev": true - }, - "jsprim": { - "version": "1.4.2", + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" }, "dependencies": { - "core-util-is": { - "version": "1.0.2", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "dev": true - }, - "verror": { - "version": "1.10.0", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "resolve": "^1.1.6" } } } }, - "karma": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", - "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", - "dev": true, + "lit": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", + "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" + "@lit/reactive-element": "^1.6.0", + "lit-element": "^3.3.0", + "lit-html": "^2.8.0" }, "dependencies": { - "rimraf": { - "version": "3.0.2", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "dev": true, + "@lit/reactive-element": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", "requires": { - "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" + "@lit-labs/ssr-dom-shim": "^1.0.0" } - }, - "yargs-parser": { - "version": "20.2.9", - "dev": true } } }, - "karma-chrome-launcher": { - "version": "3.1.1", - "dev": true, + "lit-element": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", + "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", "requires": { - "which": "^1.2.1" + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.8.0" }, "dependencies": { - "which": { - "version": "1.3.1", - "dev": true, + "@lit/reactive-element": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", "requires": { - "isexe": "^2.0.0" + "@lit-labs/ssr-dom-shim": "^1.0.0" } } } }, - "karma-coverage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", - "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "lit-html": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "requires": { + "@types/trusted-types": "^2.0.2" + } + }, + "load-bmfont": { + "version": "1.4.1", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" }, "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "buffer-equal": { + "version": "0.0.1", + "dev": true + }, + "mime": { + "version": "1.6.0", + "dev": true + } + } + }, + "load-json-file": { + "version": "1.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", "dev": true, "requires": { - "@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" + "error-ex": "^1.2.0" } }, - "istanbul-lib-source-maps": { - "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==", + "pify": { + "version": "2.3.0", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "is-utf8": "^0.2.0" } } } }, - "karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - } + "loader-runner": { + "version": "4.3.0", + "dev": true }, - "karma-jasmine": { - "version": "4.0.2", + "loader-utils": { + "version": "2.0.4", "dev": true, "requires": { - "jasmine-core": "^3.6.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, - "karma-mocha": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", - "integrity": "sha512-twRO+KCXIFOBs7o6i7oIpTJhVvjKZbIsUM96A+k2QaeXOzbVQXCkjVzXqNeQoczW4ruasPZYi0iWMTkfTrQVCw==", + "locate-path": { + "version": "6.0.0", "dev": true, "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==", - "dev": true - } + "p-locate": "^5.0.0" } }, - "karma-mocha-reporter": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", - "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==", + "lodash": { + "version": "4.17.21", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2" + }, + "lodash.isdate": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isdate/-/lodash.isdate-4.0.1.tgz", + "integrity": "sha512-hg5B1GD+R9egsBgMwmAhk+V53Us03TVvXT4dnyKugEfsD4QKuG9Wlyvxq8OGy2nu7qVGsh4DRSnMk33hoWBq/Q==", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0" + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "strip-ansi": "^4.0.0" + "chalk": "^2.0.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -38351,15 +48643,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -38371,566 +48654,823 @@ } } }, - "karma-mocha-snapshot": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/karma-mocha-snapshot/-/karma-mocha-snapshot-0.2.1.tgz", - "integrity": "sha512-uXm9Kg6HlP05jbKvQNoZMNq8d6hEhzr6Cdxl4LhklX/0CSbsE/5hCRiDPLVNa6+7NIioWu2HTcgshtWmXe+eVA==", + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "log4js": { + "version": "6.6.1", + "dev": true, + "requires": { + "date-format": "^4.0.13", + "debug": "^4.3.4", + "flatted": "^3.2.6", + "rfdc": "^1.3.0", + "streamroller": "^3.1.2" + } + }, + "longest-streak": { + "version": "2.0.4", "dev": true }, - "karma-snapshot": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/karma-snapshot/-/karma-snapshot-0.6.0.tgz", - "integrity": "sha512-S34sM1jNPD2KFPWfiucsWjrSnl3Ox8aoKlwEnmV2advFkBsl4zpOZ1LKySQbzFsLasEotPvr4RhFeN7CLatozg==", + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", "dev": true, "requires": { - "mkdirp": "^0.5.1", - "remark-parse": "^4.0.0", - "unified": "^6.1.5" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "@tootallnate/once": { + "version": "1.1.2", "dev": true }, - "is-plain-obj": { - "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==", + "cacache": { + "version": "15.3.0", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", "dev": true }, - "parse-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", - "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "http-proxy-agent": { + "version": "4.0.1", "dev": true, "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" } }, - "remark-parse": { + "mkdirp": { + "version": "1.0.4", + "dev": true + }, + "p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz", - "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==", "dev": true, "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" + "aggregate-error": "^3.0.0" } }, - "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "rimraf": { + "version": "3.0.2", "dev": true, "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" + "glob": "^7.1.3" } }, - "unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", - "dev": true + "ssri": { + "version": "8.0.1", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "dev": true + }, + "markdown-table": { + "version": "2.0.0", + "dev": true, + "requires": { + "repeat-string": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, - "unist-util-remove-position": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", - "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, "requires": { - "unist-util-visit": "^1.1.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, "requires": { - "unist-util-visit-parents": "^2.0.0" + "is-extglob": "^2.1.0" } }, - "unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, "requires": { - "unist-util-is": "^3.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, - "vfile-location": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", - "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", - "dev": true - }, - "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, "requires": { - "unist-util-stringify-position": "^1.1.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "dev": true, + "optional": true, "requires": { - "source-map-support": "^0.5.5" + "escape-string-regexp": "^4.0.0" } }, - "karma-webpack": { + "md5-file": { "version": "5.0.0", + "dev": true + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "webpack-merge": "^4.1.5" - }, - "dependencies": { - "webpack-merge": { - "version": "4.2.2", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - } + "unist-util-remove": "^2.0.0" } }, - "kew": { - "version": "0.7.0", - "dev": true + "mdast-util-definitions": { + "version": "4.0.0", + "dev": true, + "requires": { + "unist-util-visit": "^2.0.0" + } }, - "keygrip": { - "version": "1.1.0", + "mdast-util-find-and-replace": { + "version": "1.1.1", "dev": true, "requires": { - "tsscmp": "1.0.6" + "escape-string-regexp": "^4.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" } }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "mdast-util-from-markdown": { + "version": "0.8.5", "dev": true, "requires": { - "json-buffer": "3.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" } }, - "kind-of": { - "version": "6.0.3", - "dev": true + "mdast-util-gfm": { + "version": "0.1.2", + "dev": true, + "requires": { + "mdast-util-gfm-autolink-literal": "^0.1.0", + "mdast-util-gfm-strikethrough": "^0.2.0", + "mdast-util-gfm-table": "^0.1.0", + "mdast-util-gfm-task-list-item": "^0.1.0", + "mdast-util-to-markdown": "^0.6.1" + } }, - "klaw": { - "version": "1.3.1", + "mdast-util-gfm-autolink-literal": { + "version": "0.1.3", "dev": true, "requires": { - "graceful-fs": "^4.1.9" + "ccount": "^1.0.0", + "mdast-util-find-and-replace": "^1.1.0", + "micromark": "^2.11.3" } }, - "koa": { - "version": "2.13.4", + "mdast-util-gfm-strikethrough": { + "version": "0.2.3", "dev": true, "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.8.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "dependencies": { - "http-errors": { - "version": "1.8.1", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "dev": true - } + "mdast-util-to-markdown": "^0.6.0" } }, - "koa-compose": { - "version": "4.1.0", - "dev": true + "mdast-util-gfm-table": { + "version": "0.1.6", + "dev": true, + "requires": { + "markdown-table": "^2.0.0", + "mdast-util-to-markdown": "~0.6.0" + } }, - "koa-compress": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.1.0.tgz", - "integrity": "sha512-0m24/yS/GbhWI+g9FqtvStY+yJwTObwoxOvPok6itVjRen7PBWkjsJ8pre76m+99YybXLKhOJ62mJ268qyBFMQ==", + "mdast-util-gfm-task-list-item": { + "version": "0.1.6", "dev": true, "requires": { - "bytes": "^3.0.0", - "compressible": "^2.0.0", - "koa-is-json": "^1.0.0", - "statuses": "^1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } + "mdast-util-to-markdown": "~0.6.0" } }, - "koa-convert": { - "version": "2.0.0", + "mdast-util-to-hast": { + "version": "10.0.1", "dev": true, "requires": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" } }, - "koa-etag": { - "version": "4.0.0", + "mdast-util-to-markdown": { + "version": "0.6.5", "dev": true, "requires": { - "etag": "^1.8.1" + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" } }, - "koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==", + "mdast-util-to-string": { + "version": "2.0.0", "dev": true }, - "koa-send": { - "version": "5.0.1", + "mdurl": { + "version": "1.0.1", + "dev": true + }, + "media-typer": { + "version": "0.3.0" + }, + "memfs": { + "version": "3.4.7", "dev": true, "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" + "fs-monkey": "^1.0.3" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { - "depd": { - "version": "1.1.2", + "hosted-git-info": { + "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==", "dev": true }, - "http-errors": { - "version": "1.8.1", + "normalize-package-data": { + "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==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "statuses": { - "version": "1.5.0", + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } }, - "koa-static": { - "version": "5.0.0", + "merge-descriptors": { + "version": "1.0.1" + }, + "merge-source-map": { + "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==", "dev": true, "requires": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "source-map": "^0.6.1" } }, - "lazy-val": { - "version": "1.0.5" + "merge-stream": { + "version": "2.0.0", + "dev": true }, - "lcid": { - "version": "1.0.0", + "merge2": { + "version": "1.4.1", + "dev": true + }, + "methods": { + "version": "1.1.2" + }, + "micromark": { + "version": "2.11.4", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "debug": "^4.0.0", + "parse-entities": "^2.0.0" } }, - "levn": { - "version": "0.4.1", + "micromark-extension-gfm": { + "version": "0.3.3", "dev": true, "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "micromark": "~2.11.0", + "micromark-extension-gfm-autolink-literal": "~0.5.0", + "micromark-extension-gfm-strikethrough": "~0.6.5", + "micromark-extension-gfm-table": "~0.4.0", + "micromark-extension-gfm-tagfilter": "~0.3.0", + "micromark-extension-gfm-task-list-item": "~0.3.0" } }, - "lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "micromark-extension-gfm-autolink-literal": { + "version": "0.5.7", + "dev": true, "requires": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - }, - "dependencies": { - "@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.0.0" - } - } + "micromark": "~2.11.3" } }, - "lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "micromark-extension-gfm-strikethrough": { + "version": "0.6.5", + "dev": true, "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" - }, - "dependencies": { - "@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.0.0" - } - } + "micromark": "~2.11.0" } }, - "lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "micromark-extension-gfm-table": { + "version": "0.4.3", + "dev": true, "requires": { - "@types/trusted-types": "^2.0.2" + "micromark": "~2.11.0" } }, - "load-bmfont": { - "version": "1.4.1", + "micromark-extension-gfm-tagfilter": { + "version": "0.3.0", + "dev": true + }, + "micromark-extension-gfm-task-list-item": { + "version": "0.3.3", "dev": true, "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "buffer-equal": { - "version": "0.0.1", - "dev": true - }, - "mime": { - "version": "1.6.0", - "dev": true - } + "micromark": "~2.11.0" } }, - "load-json-file": { - "version": "1.1.0", + "micromatch": { + "version": "4.0.5", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "dev": true - }, - "strip-bom": { - "version": "2.0.0", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, - "loader-runner": { - "version": "4.3.0", + "mime": { + "version": "2.6.0", "dev": true }, - "loader-utils": { - "version": "2.0.4", + "mime-db": { + "version": "1.52.0" + }, + "mime-types": { + "version": "2.1.35", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "mini-svg-data-uri": { + "version": "1.4.4", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6" + }, + "minipass": { + "version": "3.3.4", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" } }, - "locate-path": { - "version": "6.0.0", + "minipass-pipeline": { + "version": "1.2.4", "dev": true, "requires": { - "p-locate": "^5.0.0" + "minipass": "^3.0.0" } }, - "lodash": { - "version": "4.17.21", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "dev": true - }, - "lodash.escaperegexp": { - "version": "4.1.2" - }, - "lodash.isdate": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isdate/-/lodash.isdate-4.0.1.tgz", - "integrity": "sha512-hg5B1GD+R9egsBgMwmAhk+V53Us03TVvXT4dnyKugEfsD4QKuG9Wlyvxq8OGy2nu7qVGsh4DRSnMk33hoWBq/Q==", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0" - }, - "lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", - "dev": true + "minipass-sized": { + "version": "1.0.3", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } }, - "lodash.memoize": { - "version": "4.1.2", - "dev": true + "minizlib": { + "version": "2.1.2", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } }, - "lodash.merge": { - "version": "4.6.2", - "dev": true + "mississippi": { + "version": "3.0.0", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } }, - "lodash.uniq": { - "version": "4.5.0", - "dev": true + "mkdirp": { + "version": "0.5.6", + "requires": { + "minimist": "^1.2.6" + } }, - "lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", + "mkdirp-classic": { + "version": "0.5.3", "dev": true }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "mocha": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", "dev": true, "requires": { - "chalk": "^2.0.1" + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" }, "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -38940,15 +49480,58 @@ "color-convert": "^1.9.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "sprintf-js": "~1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "color-convert": { @@ -38966,1653 +49549,2121 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "is-fullwidth-code-point": { + "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==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "move-concurrently": { + "version": "1.0.1", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "mri": { + "version": "1.2.0", + "dev": true + }, + "ms": { + "version": "2.1.2" + }, + "multicast-dns": { + "version": "7.2.5", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "multimatch": { + "version": "4.0.0", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "log4js": { - "version": "6.6.1", + "nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "dev": true, + "optional": true + }, + "nanocolors": { + "version": "0.2.13", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "date-format": "^4.0.13", - "debug": "^4.3.4", - "flatted": "^3.2.6", - "rfdc": "^1.3.0", - "streamroller": "^3.1.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, - "longest-streak": { - "version": "2.0.4", + "natural-compare": { + "version": "1.4.0", "dev": true }, - "lower-case": { - "version": "2.0.2", + "negotiator": { + "version": "0.6.3" + }, + "neo-async": { + "version": "2.6.2", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "dev": true + }, + "no-case": { + "version": "3.0.4", "dev": true, "requires": { + "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true }, - "lru-cache": { - "version": "6.0.0", + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, "requires": { - "yallist": "^4.0.0" + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } } }, - "make-dir": { - "version": "3.1.0", + "node-fetch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", "dev": true, "requires": { - "semver": "^6.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" } }, - "make-fetch-happen": { - "version": "9.1.0", + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-gyp": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", "dev": true, "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" }, "dependencies": { - "@tootallnate/once": { - "version": "1.1.2", + "@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "cacache": { - "version": "15.3.0", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz", + "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + } } }, - "chownr": { - "version": "2.0.0", + "fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "requires": { + "minipass": "^7.0.3" + } + }, + "glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true }, - "http-proxy-agent": { - "version": "4.0.1", + "make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" } }, - "mkdirp": { - "version": "1.0.4", + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true }, + "minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "requires": { + "abbrev": "^2.0.0" + } + }, "p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" } }, - "rimraf": { - "version": "3.0.2", + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { - "glob": "^7.1.3" + "lru-cache": "^6.0.0" } }, "ssri": { - "version": "8.0.1", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "requires": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" + } + }, + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "requires": { + "unique-slug": "^4.0.0" + } + }, + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "requires": { + "isexe": "^3.1.1" } } } }, - "markdown-escapes": { - "version": "1.0.4", - "dev": true - }, - "markdown-table": { - "version": "2.0.0", + "node-jq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/node-jq/-/node-jq-1.12.0.tgz", + "integrity": "sha512-WRFwaguXJ8PAA0s660eRrPoubSOyvu1YsbpXdIMiG8uhnf7g/QgwZPBjDgDBTFL8cptd3rsB5YzofQ8Ff9bTFw==", "dev": true, "requires": { - "repeat-string": "^1.0.0" + "@hapi/joi": "^16.1.7", + "@types/hapi__joi": "^17.1.0", + "bin-build": "^3.0.0", + "download": "^8.0.0", + "is-valid-path": "^0.1.1", + "strip-eof": "^1.0.0", + "strip-final-newline": "^2.0.0", + "tempfile": "^3.0.0" } }, - "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "nopt": { + "version": "5.0.0", "dev": true, - "optional": true, "requires": { - "escape-string-regexp": "^4.0.0" + "abbrev": "1" } }, - "md5-file": { - "version": "5.0.0", - "dev": true - }, - "mdast-squeeze-paragraphs": { - "version": "4.0.0", + "normalize-package-data": { + "version": "3.0.3", "dev": true, "requires": { - "unist-util-remove": "^2.0.0" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "mdast-util-definitions": { - "version": "4.0.0", + "normalize-path": { + "version": "3.0.0", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", "dev": true, "requires": { - "unist-util-visit": "^2.0.0" + "once": "^1.3.2" } }, - "mdast-util-find-and-replace": { - "version": "1.1.1", + "npm-bundled": { + "version": "1.1.2", "dev": true, "requires": { - "escape-string-regexp": "^4.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "npm-normalize-package-bin": "^1.0.1" } }, - "mdast-util-from-markdown": { - "version": "0.8.5", + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", "dev": true, "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } } }, - "mdast-util-gfm": { - "version": "0.1.2", + "npm-install-checks": { + "version": "4.0.0", "dev": true, "requires": { - "mdast-util-gfm-autolink-literal": "^0.1.0", - "mdast-util-gfm-strikethrough": "^0.2.0", - "mdast-util-gfm-table": "^0.1.0", - "mdast-util-gfm-task-list-item": "^0.1.0", - "mdast-util-to-markdown": "^0.6.1" + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "mdast-util-gfm-autolink-literal": { - "version": "0.1.3", + "npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.5", "dev": true, "requires": { - "ccount": "^1.0.0", - "mdast-util-find-and-replace": "^1.1.0", - "micromark": "^2.11.3" + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "mdast-util-gfm-strikethrough": { - "version": "0.2.3", + "npm-packlist": { + "version": "2.2.2", "dev": true, "requires": { - "mdast-util-to-markdown": "^0.6.0" + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" } }, - "mdast-util-gfm-table": { - "version": "0.1.6", + "npm-pick-manifest": { + "version": "6.1.1", "dev": true, "requires": { - "markdown-table": "^2.0.0", - "mdast-util-to-markdown": "~0.6.0" + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "mdast-util-gfm-task-list-item": { - "version": "0.1.6", + "npm-registry-fetch": { + "version": "11.0.0", "dev": true, "requires": { - "mdast-util-to-markdown": "~0.6.0" + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" } }, - "mdast-util-to-hast": { - "version": "10.0.1", + "npm-run-path": { + "version": "4.0.1", "dev": true, "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" + "path-key": "^3.0.0" } }, - "mdast-util-to-markdown": { - "version": "0.6.5", + "nth-check": { + "version": "2.1.1", "dev": true, "requires": { - "@types/unist": "^2.0.0", - "longest-streak": "^2.0.0", - "mdast-util-to-string": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.0.0", - "zwitch": "^1.0.0" + "boolbase": "^1.0.0" } }, - "mdast-util-to-string": { - "version": "2.0.0", - "dev": true - }, - "mdurl": { + "number-is-nan": { "version": "1.0.1", "dev": true }, - "media-typer": { - "version": "0.3.0", - "dev": true - }, - "memfs": { - "version": "3.4.7", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } + "oauth-sign": { + "version": "0.9.0" }, - "merge-descriptors": { - "version": "1.0.1", + "object-assign": { + "version": "4.1.1", "dev": true }, - "merge-source-map": { - "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==", + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, "requires": { - "source-map": "^0.6.1" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "merge-stream": { - "version": "2.0.0", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "dev": true + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, - "methods": { - "version": "1.1.2", + "object-keys": { + "version": "1.1.1", "dev": true }, - "micromark": { - "version": "2.11.4", + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, "requires": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" + "isobject": "^3.0.0" } }, - "micromark-extension-gfm": { - "version": "0.3.3", + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { - "micromark": "~2.11.0", - "micromark-extension-gfm-autolink-literal": "~0.5.0", - "micromark-extension-gfm-strikethrough": "~0.6.5", - "micromark-extension-gfm-table": "~0.4.0", - "micromark-extension-gfm-tagfilter": "~0.3.0", - "micromark-extension-gfm-task-list-item": "~0.3.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" } }, - "micromark-extension-gfm-autolink-literal": { - "version": "0.5.7", + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, "requires": { - "micromark": "~2.11.3" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" } }, - "micromark-extension-gfm-strikethrough": { - "version": "0.6.5", + "object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", "dev": true, "requires": { - "micromark": "~2.11.0" + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" } }, - "micromark-extension-gfm-table": { - "version": "0.4.3", + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "dev": true, "requires": { - "micromark": "~2.11.0" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, - "micromark-extension-gfm-tagfilter": { - "version": "0.3.0", - "dev": true - }, - "micromark-extension-gfm-task-list-item": { - "version": "0.3.3", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, "requires": { - "micromark": "~2.11.0" + "isobject": "^3.0.1" } }, - "micromatch": { - "version": "4.0.5", + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", "dev": true, "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, - "mime": { - "version": "2.6.0", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "dev": true - }, - "mime-types": { - "version": "2.1.35", + "object.values": { + "version": "1.1.5", "dev": true, "requires": { - "mime-db": "1.52.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, - "mimic-fn": { - "version": "2.1.0", + "objectorarray": { + "version": "1.0.5", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "obuf": { + "version": "1.1.2", "dev": true }, - "min-document": { - "version": "2.19.0", - "dev": true, + "omggif": { + "version": "1.0.10", + "dev": true + }, + "on-finished": { + "version": "2.4.1", "requires": { - "dom-walk": "^0.1.0" + "ee-first": "1.1.1" } }, - "mini-svg-data-uri": { - "version": "1.4.4", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", + "on-headers": { + "version": "1.0.2", "dev": true }, - "minimatch": { - "version": "3.1.2", + "once": { + "version": "1.4.0", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "wrappy": "1" } }, - "minimist": { - "version": "1.2.6" - }, - "minipass": { - "version": "3.3.4", + "onetime": { + "version": "5.1.2", "dev": true, "requires": { - "yallist": "^4.0.0" + "mimic-fn": "^2.1.0" } }, - "minipass-collect": { - "version": "1.0.2", + "only": { + "version": "0.0.2", + "dev": true + }, + "open": { + "version": "8.4.0", "dev": true, "requires": { - "minipass": "^3.0.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, - "minipass-fetch": { - "version": "1.4.1", + "opn": { + "version": "5.5.0", "dev": true, "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "dev": true + } } }, - "minipass-flush": { - "version": "1.0.5", + "optionator": { + "version": "0.9.1", "dev": true, "requires": { - "minipass": "^3.0.0" + "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.3" } }, - "minipass-json-stream": { + "ordered-read-streams": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", "dev": true, "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "readable-stream": "^2.0.1" } }, - "minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } + "os-homedir": { + "version": "1.0.2", + "dev": true }, - "minipass-sized": { - "version": "1.0.3", + "os-locale": { + "version": "1.4.0", "dev": true, "requires": { - "minipass": "^3.0.0" + "lcid": "^1.0.0" } }, - "minizlib": { - "version": "2.1.2", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } + "os-tmpdir": { + "version": "1.0.2", + "dev": true }, - "mississippi": { - "version": "3.0.0", + "osenv": { + "version": "0.1.5", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "requires": { - "minimist": "^1.2.6" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "mkdirp-classic": { - "version": "0.5.3", - "dev": true - }, - "mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", + "outline-i18n": { + "version": "git+ssh://git@github.com/Jigsaw-Code/outline-i18n.git#4642c3657074246b8eca09486941434718f66608", "dev": true, + "from": "outline-i18n@Jigsaw-Code/outline-i18n#v0.0.7" + }, + "outline-manager": { + "version": "file:server_manager", "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "@polymer/app-layout": "^3.1.0", + "@polymer/app-localize-behavior": "^3.0.1", + "@polymer/font-roboto": "^3.0.2", + "@polymer/iron-autogrow-textarea": "^3.0.3", + "@polymer/iron-collapse": "^3.0.1", + "@polymer/iron-fit-behavior": "^3.1.0", + "@polymer/iron-icon": "^3.0.1", + "@polymer/iron-icons": "^3.0.1", + "@polymer/iron-pages": "^3.0.1", + "@polymer/paper-button": "^3.0.1", + "@polymer/paper-checkbox": "^3.1.0", + "@polymer/paper-dialog": "^3.0.1", + "@polymer/paper-dialog-scrollable": "^3.0.1", + "@polymer/paper-dropdown-menu": "^3.2.0", + "@polymer/paper-icon-button": "^3.0.2", + "@polymer/paper-input": "^3.2.1", + "@polymer/paper-item": "^3.0.1", + "@polymer/paper-listbox": "^3.0.1", + "@polymer/paper-progress": "^3.0.1", + "@polymer/paper-tabs": "^3.1.0", + "@polymer/paper-toast": "^3.0.1", + "@polymer/paper-tooltip": "^3.0.1", + "@sentry/electron": "^4.17.0", + "@types/node": "^16.11.29", + "@types/node-forge": "^1.0.2", + "@types/polymer": "^1.2.9", + "@types/puppeteer": "^5.4.2", + "@types/request": "^2.47.1", + "@types/semver": "^5.5.0", + "@webcomponents/webcomponentsjs": "^2.8.0", + "circle-flags": "github:HatScripts/circle-flags", + "clipboard-polyfill": "^2.8.6", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "dotenv": "~8.2.0", + "electron": "19.1.9", + "electron-builder": "^24.9.1", + "electron-icon-maker": "^0.0.4", + "electron-notarize": "^1.2.1", + "electron-to-chromium": "^1.4.328", + "electron-updater": "^4.6.5", + "express": "^4.18.2", + "google-auth-library": "^8.9.0", + "gulp": "^4.0.0", + "gulp-posthtml": "^3.0.4", + "gulp-replace": "^1.0.0", + "html-webpack-plugin": "^5.5.3", + "intl-messageformat": "^7.8.4", + "jsonic": "^0.3.1", + "karma": "^6.3.16", + "karma-chrome-launcher": "^3.1.0", + "karma-jasmine": "^4.0.1", + "karma-webpack": "^5.0.0", + "lit": "^3.1.2", + "lit-element": "^2.5.1", + "node-forge": "^1.3.1", + "node-jq": "^1.11.2", + "postcss": "^7.0.29", + "postcss-rtl": "^1.7.3", + "posthtml-postcss": "^0.2.6", + "puppeteer": "^13.6.0", + "request": "^2.88.2", + "style-loader": "^3.3.3", + "ts-loader": "^9.5.0", + "web-animations-js": "^2.3.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-node-externals": "^3.0.0" }, "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "ansi-styles": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "@electron/universal": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", + "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" }, "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } } } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, + "@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", "requires": { - "ms": "^2.1.1" + "@lit-labs/ssr-dom-shim": "^1.2.0" } }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "@types/node": { + "version": "16.18.79", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.79.tgz", + "integrity": "sha512-Qd7jdLR5zmnIyMhfDrfPqN5tUCvreVpP3Qrf2oSM+F7SNzlb/MwHISGUkdFHtevfkPJ3iAGyeQI/jsbh9EStgQ==", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "is-fullwidth-code-point": { - "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==", - "dev": true + "requires": {} }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "requires": {} }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "requires": {} }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "fast-deep-equal": "^3.1.3" } }, - "ms": { + "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "app-builder-lib": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz", + "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==", + "dev": true, + "requires": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.1.0", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.4.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "7zip-bin": "~5.2.0", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.8.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "array-uniq": "^1.0.1" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ==", "dev": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha512-epsm3Z92j5xwek9p97pVw3KbsNc0F4QnbYh+N93SpbJYuHFQQ/UAh6K+bKFGyLePH3Hudtl/Sa95Quqp0gX8IQ==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "balanced-match": "^1.0.0" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "builder-util": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz", + "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "builder-util-runtime": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz", + "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "debug": "^4.3.4", + "sax": "^1.2.4" } }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "isexe": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + } + }, + "css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" } } } }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" }, "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } + } + } + }, + "dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "dmg-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz", + "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==", + "dev": true, + "requires": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "dmg-license": "^1.0.11", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + } + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "electron-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz", + "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==", + "dev": true, + "requires": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "dmg-builder": "24.9.1", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + } + }, + "electron-icon-maker": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/electron-icon-maker/-/electron-icon-maker-0.0.4.tgz", + "integrity": "sha512-7Lp5VJH7T7jy0YoM5Qz/pEaJloshTYzb73+ra4Nxhvf7UUs/z/FZW1nJ1dC9vaZqVvzZZduYIa9ELQpiqPnLTg==", + "dev": true, + "requires": { + "args": "^2.3.0", + "icon-gen": "1.0.7", + "jimp": "^0.2.27" + } + }, + "electron-publish": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", + "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==", + "dev": true, + "requires": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "electron-updater": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.6.5.tgz", + "integrity": "sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==", + "requires": { + "@types/semver": "^7.3.6", + "builder-util-runtime": "8.9.2", + "fs-extra": "^10.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.3.5" + }, + "dependencies": { + "@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "builder-util-runtime": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz", + "integrity": "sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==", "requires": { - "ansi-regex": "^4.1.0" + "debug": "^4.3.2", + "sax": "^1.2.4" } } } }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true + }, + "file-url": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-1.1.0.tgz", + "integrity": "sha512-Kul2nDrif1KcPH8g8bynl3/NtzaDvm3oUY3jS1tJu4fzfb6bUt1HNQ6MmLcK+pU7/ixVWKBokjHQwb83d2ngHw==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "meow": "^3.7.0" } - } - } - }, - "move-concurrently": { - "version": "1.0.1", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "mri": { - "version": "1.2.0", - "dev": true - }, - "ms": { - "version": "2.1.2" - }, - "multicast-dns": { - "version": "7.2.5", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "multimatch": { - "version": "4.0.0", - "dev": true, - "requires": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - } - }, - "mute-stream": { - "version": "0.0.8", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanocolors": { - "version": "0.2.13", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true - } - } - }, - "node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dev": true, - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - }, - "node-forge": { - "version": "1.3.1", - "dev": true - }, - "node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "dependencies": { - "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "semver": "^7.3.5" + "is-glob": "^4.0.3" } }, - "abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "icon-gen": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/icon-gen/-/icon-gen-1.0.7.tgz", + "integrity": "sha512-XIbSCmYszoYEfQVNW0Ep+xkZc4lKb/xT45nUPs8T2W/KlARjTKuWI2EpaW/GKox2dYEM6SvZGodGhndmKndUJw==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "del": "^2.2.2", + "mkdirp": "^0.5.1", + "pngjs": "^3.0.0", + "svg2png": "4.1.0", + "uuid": "^3.0.0" } }, - "cacache": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz", - "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==", + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, + "intl-messageformat": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-7.8.4.tgz", + "integrity": "sha512-yS0cLESCKCYjseCOGXuV4pxJm/buTfyCJ1nzQjryHmSehlptbZbn9fnlk1I9peLopZGGbjj46yHHiTAEZ1qOTA==", + "requires": { + "intl-format-cache": "^4.2.21", + "intl-messageformat-parser": "^3.6.4" + } + }, + "intl-messageformat-parser": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-3.6.4.tgz", + "integrity": "sha512-RgPGwue0mJtoX2Ax8EmMzJzttxjnva7gx0Q7mKJ4oALrTZvtmCeAw5Msz2PcjW4dtCh/h7vN/8GJCxZO1uv+OA==", + "requires": { + "@formatjs/intl-unified-numberformat": "^3.2.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "number-is-nan": "^1.0.0" + } + }, + "isbinaryfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "dev": true + }, + "jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha512-9HT7DA279xkTlry2oG30s6AtOUglNiY2UdyYpj0yNI4/NBv8PmdNC0gcldgMU4HqvbUlrM3+v+6GaHnTkH23JQ==", + "dev": true, + "requires": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" }, "dependencies": { - "lru-cache": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", - "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", - "dev": true, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } + }, + "jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "lit": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", + "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "requires": { + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2" + }, + "dependencies": { + "lit-element": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", + "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", "requires": { - "semver": "^7.3.5" + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.1.2" } } } }, - "fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, + "lit-element": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.5.1.tgz", + "integrity": "sha512-ogu7PiJTA33bEK0xGu1dmaX5vhcRjBXCFexPja0e7P7jqLhTpNKYRPmE+GmiCaRVAbiQKGkUgkh/i6+bh++dPQ==", "requires": { - "minipass": "^7.0.3" + "lit-html": "^1.1.1" + }, + "dependencies": { + "lit-html": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.4.1.tgz", + "integrity": "sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA==" + } } }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, + "lit-html": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", + "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "@types/trusted-types": "^2.0.2" } }, - "isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", "dev": true }, - "make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", "dev": true, "requires": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "minimist": "0.0.8" } }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha512-5NLTTdX45dKFtG8CX5pKmvS9V5u9wBE+gkklN7xhDuhq3pA2I4O7ALfKxosCMcLHOhkxj6GNacZhfXtp5nlCdg==", + "dev": true + }, + "read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", "dev": true, "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "dependencies": { + "dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true + } } }, - "nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "requires": { - "abbrev": "^2.0.0" + "resolve": "^1.20.0" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "requires": { "lru-cache": "^6.0.0" } }, - "ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { - "minipass": "^7.0.3" + "randombytes": "^2.1.0" } }, - "unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "requires": { - "unique-slug": "^4.0.0" + "semver": "^7.5.3" } }, - "unique-slug": { + "slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { - "isexe": "^3.1.1" + "ansi-regex": "^2.0.0" } - } - } - }, - "node-releases": { - "version": "2.0.6" - }, - "nopt": { - "version": "5.0.0", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.7", + }, + "style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "requires": {} + }, + "svg2png": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svg2png/-/svg2png-4.1.0.tgz", + "integrity": "sha512-OZUplzFrfjfzddYFX5zR7aPpY8jMiCUa/q8yR7+tiZ6tTqbTP2lEmAwG2lLU0/ysv95sqWAv2BxXV0P9ffUEyA==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "file-url": "^1.1.0", + "phantomjs-prebuilt": "^2.1.10", + "pn": "^1.0.0", + "yargs": "^5.0.0" + }, + "dependencies": { + "yargs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-5.0.0.tgz", + "integrity": "sha512-krgVLGNhMWUVY1EJkM/bgbvn3yCIRrsZp6KaeX8hx8ztT+jBtX7/flTQcSHe5089xIDQRUsEr2mzlZVNe/7P5w==", + "dev": true, + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.2.0", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^3.2.0" + } + } } - } - } - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.2", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "optional": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "optional": true - } - } - }, - "npm-install-checks": { - "version": "4.0.0", - "dev": true, - "requires": { - "semver": "^7.1.1" - }, - "dependencies": { - "semver": { - "version": "7.3.7", + }, + "webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" } - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true - }, - "npm-package-arg": { - "version": "8.1.5", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.7", + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } - } - } - }, - "npm-packlist": { - "version": "2.2.2", - "dev": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "6.1.1", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - }, - "dependencies": { - "semver": { - "version": "7.3.7", + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-3.2.0.tgz", + "integrity": "sha512-eANlJIqYwhwS/asi4ybKxkeJYUIjNMZXL36C/KICV5jyudUZWp+/lEfBHM0PuJcQjBfs00HwqePEQjtLJd+Kyw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "camelcase": "^3.0.0", + "lodash.assign": "^4.1.0" } } } }, - "npm-registry-fetch": { - "version": "11.0.0", - "dev": true, - "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - } - }, - "npm-run-path": { - "version": "4.0.1", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "dev": true - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - } - }, - "object.values": { - "version": "1.1.5", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "objectorarray": { - "version": "1.0.5", - "dev": true - }, - "obuf": { - "version": "1.1.2", - "dev": true - }, - "omggif": { - "version": "1.0.10", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "dev": true - }, - "once": { - "version": "1.4.0", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "only": { - "version": "0.0.2", - "dev": true - }, - "open": { - "version": "8.4.0", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "opn": { - "version": "5.5.0", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "dev": true - } - } - }, - "optionator": { - "version": "0.9.1", - "dev": true, - "requires": { - "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.3" - } - }, - "os-homedir": { - "version": "1.0.2", + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "os-locale": { - "version": "1.4.0", + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", "dev": true, "requires": { - "lcid": "^1.0.0" + "p-timeout": "^2.0.1" } }, - "os-tmpdir": { - "version": "1.0.2", + "p-finally": { + "version": "1.0.0", "dev": true }, - "osenv": { - "version": "0.1.5", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "outline-i18n": { - "version": "git+ssh://git@github.com/Jigsaw-Code/outline-i18n.git#4642c3657074246b8eca09486941434718f66608", - "dev": true, - "from": "outline-i18n@Jigsaw-Code/outline-i18n#v0.0.7" - }, - "p-cancelable": { + "p-is-promise": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", "dev": true }, "p-limit": { @@ -40642,6 +51693,21 @@ "version": "1.2.0", "dev": true }, + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==", + "dev": true + }, "p-retry": { "version": "4.6.2", "dev": true, @@ -40656,6 +51722,15 @@ } } }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "2.2.0", "dev": true @@ -40796,6 +51871,17 @@ "is-hexadecimal": "^1.0.0" } }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, "parse-headers": { "version": "2.0.5", "dev": true @@ -40808,6 +51894,18 @@ "json-parse-better-errors": "^1.0.1" } }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "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==", + "dev": true + }, "parse5": { "version": "6.0.1", "dev": true @@ -40825,8 +51923,7 @@ "dev": true }, "parseurl": { - "version": "1.3.3", - "dev": true + "version": "1.3.3" }, "pascal-case": { "version": "3.1.2", @@ -40836,6 +51933,12 @@ "tslib": "^2.0.3" } }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, "path-dirname": { "version": "1.0.2", "dev": true @@ -40859,6 +51962,21 @@ "version": "1.0.7", "dev": true }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, "path-scurry": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", @@ -40907,8 +52025,7 @@ } }, "path-to-regexp": { - "version": "0.1.7", - "dev": true + "version": "0.1.7" }, "path-type": { "version": "4.0.0", @@ -40919,8 +52036,7 @@ "dev": true }, "performance-now": { - "version": "2.1.0", - "dev": true + "version": "2.1.0" }, "phantomjs-prebuilt": { "version": "2.1.16", @@ -41050,6 +52166,29 @@ "xmlbuilder": "^15.1.1" } }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + } + } + }, "plugins-manager": { "version": "0.3.1", "dev": true @@ -41157,6 +52296,12 @@ } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, "postcss": { "version": "7.0.39", "dev": true, @@ -41184,6 +52329,324 @@ "version": "4.2.0", "dev": true }, + "posthtml": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz", + "integrity": "sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==", + "dev": true, + "requires": { + "posthtml-parser": "^0.4.1", + "posthtml-render": "^1.1.5" + } + }, + "posthtml-load-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/posthtml-load-config/-/posthtml-load-config-1.0.0.tgz", + "integrity": "sha512-GCgc8x9esPszRG/jt8Mswc0JAf4HS03Thm8P9Ks1IOa8CVvugT8C746SaBlSNhn890Bq7tZHHvTv4gvB4zkJUQ==", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0", + "posthtml-load-options": "^1.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "posthtml-load-options": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/posthtml-load-options/-/posthtml-load-options-1.0.0.tgz", + "integrity": "sha512-PqHMD4MxlodWX0O3i/MvQpLCwL6MTM7FL5+Ami/827jKlPvE5doZl6NSk6E87aLtkrVxJAW0DH85+YSUuGIJZg==", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "posthtml-parser": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz", + "integrity": "sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==", + "dev": true, + "requires": { + "htmlparser2": "^3.9.2" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "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" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "posthtml-postcss": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/posthtml-postcss/-/posthtml-postcss-0.2.6.tgz", + "integrity": "sha512-p2zrMw6tf9wnQZVe3IFiYtef+++6hC/Ab6e1RqVG7THdn8/y6i7Z/O3b/7j7PfoM0ygBkfq5ezcMU+OI7Y+MWQ==", + "dev": true, + "requires": { + "postcss": "^6.0.14" + }, + "dependencies": { + "ansi-styles": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "dev": true @@ -41208,6 +52671,12 @@ "renderkid": "^3.0.0" } }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true + }, "pretty-quick": { "version": "2.0.2", "dev": true, @@ -41378,12 +52847,10 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "optional": true + "dev": true }, "proxy-addr": { "version": "2.0.7", - "dev": true, "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -41400,8 +52867,7 @@ "dev": true }, "psl": { - "version": "1.9.0", - "dev": true + "version": "1.9.0" }, "pump": { "version": "3.0.0", @@ -41491,12 +52957,24 @@ "dev": true }, "qs": { - "version": "6.10.3", - "dev": true, + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "querystring": { "version": "0.2.0", "dev": true @@ -41513,12 +52991,10 @@ } }, "range-parser": { - "version": "1.2.1", - "dev": true + "version": "1.2.1" }, "raw-body": { "version": "2.5.1", - "dev": true, "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -41527,12 +53003,10 @@ }, "dependencies": { "bytes": { - "version": "3.1.2", - "dev": true + "version": "3.1.2" }, "iconv-lite": { "version": "0.4.24", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -41716,6 +53190,27 @@ "resolve": "^1.9.0" } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + } + } + }, "reduce-flatten": { "version": "2.0.0", "dev": true @@ -41742,6 +53237,16 @@ "@babel/runtime": "^7.8.4" } }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, "regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -42068,6 +53573,41 @@ "mdast-util-to-markdown": "^0.6.0" } }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + } + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, "renderkid": { "version": "3.0.0", "dev": true, @@ -42079,16 +53619,42 @@ "strip-ansi": "^6.0.1" } }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, "repeat-string": { "version": "1.6.1", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==", "dev": true }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, "replace-in-file": { "version": "6.3.5", "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz", @@ -42112,9 +53678,29 @@ } } }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, "request": { "version": "2.88.2", - "dev": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -42140,7 +53726,6 @@ "dependencies": { "form-data": { "version": "2.3.3", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -42148,8 +53733,7 @@ } }, "qs": { - "version": "6.5.3", - "dev": true + "version": "6.5.3" } } }, @@ -42202,10 +53786,29 @@ } } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "dev": true }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, "resolve-path": { "version": "1.4.0", "dev": true, @@ -42242,6 +53845,12 @@ } } }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -42261,6 +53870,12 @@ "signal-exit": "^3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "retry": { "version": "0.12.0", "dev": true @@ -42437,8 +54052,16 @@ } }, "safe-buffer": { - "version": "5.1.2", - "dev": true + "version": "5.1.2" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } }, "safe-regex-test": { "version": "1.0.0", @@ -42452,8 +54075,7 @@ } }, "safer-buffer": { - "version": "2.1.2", - "dev": true + "version": "2.1.2" }, "sanitize-filename": { "version": "1.6.3", @@ -42476,14 +54098,34 @@ "ajv-keywords": "^3.5.2" } }, + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "requires": { + "commander": "^2.8.1" + }, + "dependencies": { + "commander": { + "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==", + "dev": true + } + } + }, "select-hose": { "version": "2.0.0", "dev": true }, "selfsigned": { - "version": "2.0.1", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "requires": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" } }, @@ -42495,9 +54137,17 @@ "version": "1.0.0", "dev": true }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, "send": { "version": "0.18.0", - "dev": true, "requires": { "debug": "2.6.9", "depd": "2.0.0", @@ -42516,24 +54166,20 @@ "dependencies": { "debug": { "version": "2.6.9", - "dev": true, "requires": { "ms": "2.0.0" }, "dependencies": { "ms": { - "version": "2.0.0", - "dev": true + "version": "2.0.0" } } }, "mime": { - "version": "1.6.0", - "dev": true + "version": "1.6.0" }, "ms": { - "version": "2.1.3", - "dev": true + "version": "2.1.3" } } }, @@ -42608,7 +54254,6 @@ }, "serve-static": { "version": "1.15.0", - "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -42631,9 +54276,37 @@ "has-property-descriptors": "^1.0.0" } }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, "setprototypeof": { - "version": "1.2.0", - "dev": true + "version": "1.2.0" }, "ShadowsocksConfig": { "version": "git+ssh://git@github.com/Jigsaw-Code/outline-shadowsocksconfig.git#6d01c4b1beae3a3bc2a1074e5e310dfa023be57d", @@ -42671,13 +54344,18 @@ "version": "3.0.0", "dev": true }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, "shelljs": { "version": "0.5.3", "dev": true }, "side-channel": { "version": "1.0.4", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -42773,6 +54451,127 @@ "version": "4.2.0", "dev": true }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "socket.io": { "version": "4.5.1", "dev": true, @@ -42901,6 +54700,32 @@ } } }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "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==", + "dev": true + } + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, "source-map": { "version": "0.6.1", "dev": true @@ -42909,6 +54734,19 @@ "version": "1.0.2", "dev": true }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "source-map-support": { "version": "0.5.21", "dev": true, @@ -42917,10 +54755,22 @@ "source-map": "^0.6.0" } }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, "space-separated-tokens": { "version": "1.1.5", "dev": true }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, "spdx-correct": { "version": "3.1.1", "dev": true, @@ -42979,6 +54829,15 @@ } } }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", @@ -42988,7 +54847,6 @@ }, "sshpk": { "version": "1.17.0", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -43008,6 +54866,12 @@ "figgy-pudding": "^3.5.1" } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true + }, "stat-mode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", @@ -43018,9 +54882,39 @@ "version": "1.0.3", "dev": true }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + } + } + }, "statuses": { - "version": "2.0.1", - "dev": true + "version": "2.0.1" }, "storybook-addon-markdown-docs": { "version": "1.0.5", @@ -43077,10 +54971,31 @@ "stream-shift": "^1.0.0" } }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, "stream-shift": { "version": "1.0.1", "dev": true }, + "stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha512-Kg1BSDTwgGiVMtTCJNlo7kk/xzL33ZuZveEBRt6rXw+f1WLK/8kmz2NVCT/Qnv0JkV85JOHcLhD82mnXsR3kPw==", + "dev": true + }, + "stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha512-Da4WoKaZyu3nf+bIdIifh7IPkFjARBnBK+pYqn0EUJqksjV9afojjaCCHUemH30Jmu7T2qcKvlZm2ykN38uzaw==", + "dev": true, + "requires": { + "stream-to": "~0.2.0" + } + }, "streamroller": { "version": "3.1.2", "dev": true, @@ -43112,6 +55027,12 @@ } } }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, "string_decoder": { "version": "1.1.1", "dev": true, @@ -43216,6 +55137,15 @@ "version": "4.0.0", "dev": true }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "requires": { + "is-natural-number": "^4.0.1" + } + }, "strip-eof": { "version": "1.0.0", "dev": true @@ -43224,10 +55154,44 @@ "version": "2.0.0", "dev": true }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true + } + } + }, "strip-json-comments": { "version": "3.1.1", "dev": true }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, "style-loader": { "version": "2.0.0", "dev": true, @@ -43277,6 +55241,16 @@ "version": "1.0.0", "dev": true }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, "svg2png": { "version": "4.1.1", "dev": true, @@ -43412,12 +55386,14 @@ "dev": true }, "tar": { - "version": "6.1.11", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -43427,6 +55403,12 @@ "version": "2.0.0", "dev": true }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, "mkdirp": { "version": "1.0.4", "dev": true @@ -43465,6 +55447,12 @@ } } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, "temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", @@ -43488,12 +55476,24 @@ } } }, + "tempfile": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-3.0.0.tgz", + "integrity": "sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==", + "dev": true, + "requires": { + "temp-dir": "^2.0.0", + "uuid": "^3.3.2" + } + }, "terser": { - "version": "5.14.2", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -43505,18 +55505,22 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "dependencies": { "jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { "@types/node": "*", @@ -43525,7 +55529,9 @@ } }, "schema-utils": { - "version": "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==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -43534,7 +55540,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -43542,6 +55550,8 @@ }, "supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -43685,6 +55695,12 @@ "version": "0.2.0", "dev": true }, + "textextensions": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz", + "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==", + "dev": true + }, "thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -43719,10 +55735,32 @@ "xtend": "~4.0.1" } }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, "thunky": { "version": "1.1.0", "dev": true }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true + }, "timm": { "version": "1.7.1", "dev": true @@ -43764,22 +55802,76 @@ "tmp": "^0.2.0" } }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, "to-regex-range": { "version": "5.0.1", "dev": true, @@ -43787,21 +55879,27 @@ "is-number": "^7.0.0" } }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, "toidentifier": { - "version": "1.0.1", - "dev": true + "version": "1.0.1" }, "tough-cookie": { "version": "2.5.0", - "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" }, "dependencies": { "punycode": { - "version": "2.1.1", - "dev": true + "version": "2.1.1" } } }, @@ -43822,6 +55920,29 @@ "version": "0.0.1", "dev": true }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, "trim-trailing-lines": { "version": "1.1.4", "dev": true @@ -43844,13 +55965,16 @@ "dev": true }, "ts-loader": { - "version": "9.3.1", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "dependencies": { "chalk": { @@ -43867,6 +55991,12 @@ "requires": { "lru-cache": "^6.0.0" } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true } } }, @@ -43896,7 +56026,9 @@ } }, "tslib": { - "version": "2.4.0" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "tsscmp": { "version": "1.0.6", @@ -43924,13 +56056,17 @@ }, "tunnel-agent": { "version": "0.6.0", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, "tweetnacl": { - "version": "0.14.5", + "version": "0.14.5" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, "type-check": { @@ -43949,7 +56085,6 @@ }, "type-is": { "version": "1.6.18", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -44058,10 +56193,48 @@ "through": "^2.3.8" } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true + }, "underscore": { "version": "1.13.4", "dev": true }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "dependencies": { + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", + "dev": true + } + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "dev": true + }, "unherit": { "version": "1.1.3", "dev": true, @@ -44102,6 +56275,26 @@ "vfile": "^4.0.0" } }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + } + } + }, "unique-filename": { "version": "1.1.1", "dev": true, @@ -44116,6 +56309,16 @@ "imurmurhash": "^0.1.4" } }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, "unist-builder": { "version": "2.0.3", "dev": true @@ -44199,37 +56402,90 @@ "dev": true }, "unpipe": { + "version": "1.0.0" + }, + "unset-value": { "version": "1.0.0", - "dev": true + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } }, "untildify": { "version": "3.0.3" }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, "update-browserslist-db": { - "version": "1.0.5", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "dependencies": { "picocolors": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" } } }, "uri-js": { "version": "4.4.1", - "dev": true, "requires": { "punycode": "^2.1.0" }, "dependencies": { "punycode": { - "version": "2.1.1", - "dev": true + "version": "2.1.1" } } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, "url": { "version": "0.11.0", "dev": true, @@ -44253,6 +56509,27 @@ "prepend-http": "^2.0.0" } }, + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha512-dQ9cJzMou5OKr6ZzfvwJkCq3rC72PNXhqz0v3EIhF4a3Np+ujr100AhUx2cKx5ei3iymoJpJrPB3sVSEMdqAeg==", + "dev": true, + "requires": { + "ip-regex": "^1.0.1" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "useragent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", @@ -44312,12 +56589,10 @@ "dev": true }, "utils-merge": { - "version": "1.0.1", - "dev": true + "version": "1.0.1" }, "uuid": { - "version": "3.4.0", - "dev": true + "version": "3.4.0" }, "uuidv4": { "version": "4.0.0", @@ -44334,6 +56609,15 @@ "version": "2.3.0", "dev": true }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -44371,10 +56655,15 @@ "builtins": "^1.0.3" } }, - "vary": { - "version": "1.1.2", + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", "dev": true }, + "vary": { + "version": "1.1.2" + }, "verror": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", @@ -44418,6 +56707,71 @@ "unist-util-stringify-position": "^2.0.0" } }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "void-elements": { "version": "2.0.1", "dev": true @@ -44438,7 +56792,9 @@ } }, "web-animations-js": { - "version": "2.3.2" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", + "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" }, "web-namespaces": { "version": "1.1.4", @@ -44455,20 +56811,22 @@ "dev": true }, "webpack": { - "version": "5.74.0", + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", + "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -44477,23 +56835,23 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { "@types/estree": { - "version": "0.0.51", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "schema-utils": { - "version": "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==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -44572,7 +56930,9 @@ } }, "webpack-dev-server": { - "version": "4.10.0", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -44581,7 +56941,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -44594,20 +56954,23 @@ "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.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "dependencies": { "@types/ws": { - "version": "8.5.3", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "requires": { "@types/node": "*" @@ -44656,7 +57019,9 @@ } }, "ws": { - "version": "8.8.1", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "requires": {} } @@ -44678,6 +57043,12 @@ "wildcard": "^2.0.0" } }, + "webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true + }, "webpack-shell-plugin-next": { "version": "2.2.2", "dev": true, @@ -44760,6 +57131,12 @@ "version": "2.0.0", "dev": true }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "dev": true + }, "winreg": { "version": "1.2.4" }, @@ -44960,18 +57337,31 @@ "dev": true }, "yargs": { - "version": "17.5.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, "y18n": { "version": "5.0.8", "dev": true diff --git a/package.json b/package.json index 1a05d103ea..e207fdbca1 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "scripts": { "action:help": "npm run action list", "action:list": "npm run action list", - "action": "node ./src/build/run_action.mjs", + "action": "node src/build/run_action.mjs", "clean": "rimraf build output node_modules www platforms plugins third_party/jsign/*.jar", "format:all": "prettier --write \"**/*.{cjs,mjs,html,js,json,md,ts}\"", "format": "pretty-quick --staged --pattern \"**/*.{cjs,mjs,html,js,json,md,ts}\"", @@ -167,6 +167,7 @@ ] }, "workspaces": [ - "src/cordova/plugin" + "src/cordova/plugin", + "server_manager" ] } diff --git a/server_manager/README.md b/server_manager/README.md new file mode 100644 index 0000000000..f93957ca96 --- /dev/null +++ b/server_manager/README.md @@ -0,0 +1,67 @@ +# Outline Manager + +## Running + +To run the Outline Manager Electron app: + +``` +npm run action server_manager/electron_app/start ${PLATFORM} +``` + +To run the Outline Manager Electron app with a development build (code not minified): + +``` +BUILD_ENV=development npm run action server_manager/electron_app/start ${PLATFORM} +``` + +Where `${PLATFORM}` is one of `linux`, `macos`, `windows`. + +## Development Server + +To run the Outline Manager as a web app on the browser and listen for changes: + +``` +npm run action server_manager/web_app/start +``` + +## Gallery Server for UI Development + +We have a server app to for quickly iterating on UI components. To spin it up, run + +``` +npm run action server_manager/web_app/start_gallery +``` + +Changes to UI components will be hot reloaded into the gallery. + +## Debug an existing binary + +You can run an existing binary in debug mode by setting `OUTLINE_DEBUG=true`. +This will enable the Developer menu on the application window. + +## Packaging + +To build the app binary: + +``` +npm run action server_manager/electron_app/build ${PLATFORM} -- --buildMode=[debug,release] +``` + +Where `${PLATFORM}` is one of `linux`, `macos`, `windows`. + +The per-platform standalone apps will be at `build/electron_app/static/dist`. + +- Windows: zip files. Only generated if you have [wine](https://www.winehq.org/download) installed. +- Linux: tar.gz files. +- macOS: dmg files if built from macOS, zip files otherwise. + +> NOTE: If you are building for macOS, you may need to run `security unlock-keychain login.keychain` so electron-builder has access to your certificates. + +## Error reporting + +To enable error reporting through [Sentry](https://sentry.io/) for local builds, run: + +```bash +export SENTRY_DSN=[Sentry development API key] +npm run action server_manager/electron_app/start ${PLATFORM} +``` diff --git a/server_manager/base.webpack.js b/server_manager/base.webpack.js new file mode 100644 index 0000000000..9850bb6ccd --- /dev/null +++ b/server_manager/base.webpack.js @@ -0,0 +1,82 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const path = require('path'); +const CopyPlugin = require('copy-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const webpack = require('webpack'); + +const OUTPUT_BASE = path.resolve(__dirname, '../output/build/server_manager/web_app/static'); + +const GENERATE_CSS_RTL_LOADER = path.resolve(__dirname, 'css-in-js-rtl-loader.js'); + +const CIRCLE_FLAGS_PATH = path.dirname(require.resolve('circle-flags/package.json')); + +exports.makeConfig = options => { + return { + mode: options.defaultMode, + entry: [ + require.resolve('@webcomponents/webcomponentsjs/webcomponents-loader.js'), + path.resolve(__dirname, './web_app/ui_components/style.css'), + options.main, + ], + target: options.target, + devtool: 'inline-source-map', + // Run the dev server with `npm run webpack-dev-server --workspace=outline-manager --open` + devServer: { + client: { + overlay: true, + }, + }, + output: {path: OUTPUT_BASE, filename: 'main.js'}, + module: { + rules: [ + { + test: /\.ts(x)?$/, + exclude: /node_modules/, + use: ['ts-loader', GENERATE_CSS_RTL_LOADER], + }, + { + test: /\.js$/, + exclude: /node_modules/, + loader: GENERATE_CSS_RTL_LOADER, + }, + { + test: /\.css?$/, + use: ['style-loader', 'css-loader'], + }, + ], + }, + resolve: {extensions: ['.tsx', '.ts', '.js']}, + plugins: [ + new webpack.DefinePlugin({ + 'outline.gcpAuthEnabled': JSON.stringify(process.env.GCP_AUTH_ENABLED !== 'false'), + // Statically link the Roboto font, rather than link to fonts.googleapis.com + 'window.polymerSkipLoadingFontRoboto': JSON.stringify(true), + }), + new CopyPlugin({ + patterns: [ + {from: `${CIRCLE_FLAGS_PATH}/flags`, to: 'images/flags', context: __dirname}, + {from: 'images', to: 'images', context: __dirname}, // Overwrite any colliding flags. + {from: 'messages', to: 'messages', context: __dirname}, + ], + }), + new HtmlWebpackPlugin({ + template: options.template || path.resolve(__dirname, './index.html'), + filename: 'index.html', + }), + ], + }; +}; diff --git a/server_manager/browser.webpack.js b/server_manager/browser.webpack.js new file mode 100644 index 0000000000..7479f60b3c --- /dev/null +++ b/server_manager/browser.webpack.js @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Webpack config to run the Outline Manager on the browser. + +const path = require('path'); +const {makeConfig} = require('./base.webpack.js'); + +module.exports = makeConfig({ + main: path.resolve(__dirname, './web_app/browser_main.ts'), + target: 'web', + defaultMode: 'development', +}); diff --git a/server_manager/cloud/digitalocean_api.ts b/server_manager/cloud/digitalocean_api.ts new file mode 100644 index 0000000000..c67c8cbcae --- /dev/null +++ b/server_manager/cloud/digitalocean_api.ts @@ -0,0 +1,264 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as errors from '../infrastructure/custom_error'; + +export interface DigitalOceanDropletSpecification { + installCommand: string; + size: string; + image: string; + tags: string[]; +} + +// See definition and example at +// https://developers.digitalocean.com/documentation/v2/#retrieve-an-existing-droplet-by-id +export type DropletInfo = Readonly<{ + id: number; + status: 'new' | 'active'; + tags: string[]; + region: {readonly slug: string}; + size: Readonly<{ + transfer: number; + price_monthly: number; + }>; + networks: Readonly<{ + v4: ReadonlyArray< + Readonly<{ + type: string; + ip_address: string; + }> + >; + }>; +}>; + +// Reference: +// https://developers.digitalocean.com/documentation/v2/#get-user-information +export type Account = Readonly<{ + droplet_limit: number; + email: string; + uuid: string; + email_verified: boolean; + status: 'active' | 'warning' | 'locked'; + status_message: string; +}>; + +// Reference: +// https://developers.digitalocean.com/documentation/v2/#regions +export type RegionInfo = Readonly<{ + slug: string; + name: string; + sizes: string[]; + available: boolean; + features: string[]; +}>; + +// Marker class for errors due to network or authentication. +// See below for more details on when this is raised. +export class XhrError extends errors.CustomError { + constructor() { + // No message because XMLHttpRequest.onerror provides no useful info. + super(); + } +} + +// This class contains methods to interact with DigitalOcean on behalf of a user. +export interface DigitalOceanSession { + accessToken: string; + getAccount(): Promise; + createDroplet( + displayName: string, + region: string, + publicKeyForSSH: string, + dropletSpec: DigitalOceanDropletSpecification + ): Promise<{droplet: DropletInfo}>; + deleteDroplet(dropletId: number): Promise; + getRegionInfo(): Promise; + getDroplet(dropletId: number): Promise; + getDropletTags(dropletId: number): Promise; + getDropletsByTag(tag: string): Promise; + getDroplets(): Promise; +} + +export class RestApiSession implements DigitalOceanSession { + // Constructor takes a DigitalOcean access token, which should have + // read+write permissions. + constructor(public accessToken: string) {} + + public getAccount(): Promise { + console.info('Requesting account'); + return this.request<{account: Account}>('GET', 'account').then(response => { + return response.account; + }); + } + + public createDroplet( + displayName: string, + region: string, + publicKeyForSSH: string, + dropletSpec: DigitalOceanDropletSpecification + ): Promise<{droplet: DropletInfo}> { + const dropletName = makeValidDropletName(displayName); + // Register a key with DigitalOcean, so the user will not get a potentially + // confusing email with their droplet password, which could get mistaken for + // an invite. + return this.registerKey_(dropletName, publicKeyForSSH).then((keyId: number) => { + return this.makeCreateDropletRequest(dropletName, region, keyId, dropletSpec); + }); + } + + private makeCreateDropletRequest( + dropletName: string, + region: string, + keyId: number, + dropletSpec: DigitalOceanDropletSpecification + ): Promise<{droplet: DropletInfo}> { + let requestCount = 0; + const MAX_REQUESTS = 10; + const RETRY_TIMEOUT_MS = 5000; + return new Promise((fulfill, reject) => { + const makeRequestRecursive = () => { + ++requestCount; + console.info(`Requesting droplet creation ${requestCount}/${MAX_REQUESTS}`); + // See https://docs.digitalocean.com/reference/api/api-reference/#operation/droplets_create + this.request<{droplet: DropletInfo}>('POST', 'droplets', { + name: dropletName, + region, + size: dropletSpec.size, + image: dropletSpec.image, + ssh_keys: [keyId], + user_data: dropletSpec.installCommand, + tags: dropletSpec.tags, + ipv6: true, + // We install metrics and droplet agents in the user_data script in order to not delay the droplet readiness. + monitoring: false, + with_droplet_agent: false, + }) + .then(fulfill) + .catch(e => { + if (e.message.toLowerCase().indexOf('finalizing') >= 0 && requestCount < MAX_REQUESTS) { + // DigitalOcean is still validating this account and may take + // up to 30 seconds. We can retry more frequently to see when + // this error goes away. + setTimeout(makeRequestRecursive, RETRY_TIMEOUT_MS); + } else { + reject(e); + } + }); + }; + makeRequestRecursive(); + }); + } + + public deleteDroplet(dropletId: number): Promise { + console.info('Requesting droplet deletion'); + return this.request('DELETE', 'droplets/' + dropletId); + } + + public getRegionInfo(): Promise { + console.info('Requesting region info'); + return this.request<{regions: RegionInfo[]}>('GET', 'regions').then(response => { + return response.regions; + }); + } + + // Registers a SSH key with DigitalOcean. + private registerKey_(keyName: string, publicKeyForSSH: string): Promise { + console.info('Requesting key registration'); + return this.request<{ssh_key: {id: number}}>('POST', 'account/keys', { + name: keyName, + public_key: publicKeyForSSH, + }).then(response => { + return response.ssh_key.id; + }); + } + + public getDroplet(dropletId: number): Promise { + console.info('Requesting droplet'); + return this.request<{droplet: DropletInfo}>('GET', 'droplets/' + dropletId).then(response => { + return response.droplet; + }); + } + + public getDropletTags(dropletId: number): Promise { + return this.getDroplet(dropletId).then((droplet: DropletInfo) => { + return droplet.tags; + }); + } + + public getDropletsByTag(tag: string): Promise { + console.info('Requesting droplet by tag'); + // TODO Add proper pagination support. Going with 100 for now to extend the default of 20, and confirm UI works + return this.request<{droplets: DropletInfo[]}>('GET', `droplets?per_page=100&tag_name=${encodeURI(tag)}`).then( + response => { + return response.droplets; + } + ); + } + + public getDroplets(): Promise { + console.info('Requesting droplets'); + // TODO Add proper pagination support. Going with 100 for now to extend the default of 20, and confirm UI works + return this.request<{droplets: DropletInfo[]}>('GET', 'droplets?per_page=100').then(response => { + return response.droplets; + }); + } + + // Makes an XHR request to DigitalOcean's API, returns a promise which fulfills + // with the parsed object if successful. + private request(method: string, actionPath: string, data?: {}): Promise { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.open(method, `https://api.digitalocean.com/v2/${actionPath}`); + xhr.setRequestHeader('Authorization', `Bearer ${this.accessToken}`); + xhr.setRequestHeader('Content-Type', 'application/json'); + xhr.onload = () => { + // DigitalOcean may return any 2xx status code for success. + if (xhr.status >= 200 && xhr.status <= 299) { + // Parse JSON response if available. For requests like DELETE + // this.response may be empty. + const responseObj = xhr.response ? JSON.parse(xhr.response) : {}; + resolve(responseObj); + } else if (xhr.status === 401) { + console.error('DigitalOcean request failed with Unauthorized error'); + reject(new XhrError()); + } else { + // this.response is a JSON object, whose message is an error string. + const responseJson = JSON.parse(xhr.response); + console.error(`DigitalOcean request failed with status ${xhr.status}`); + reject(new Error(`XHR ${responseJson.id} failed with ${xhr.status}: ${responseJson.message}`)); + } + }; + xhr.onerror = () => { + // This is raised for both network-level and CORS (authentication) + // problems. Since there is, by design for security reasons, no way + // to programmatically distinguish the two (the error instance + // passed to this handler has *no* useful information), we should + // prompt the user for whether to retry or re-authenticate against + // DigitalOcean (this isn't so bad because application-level + // errors, e.g. bad request parameters and even 404s, do *not* raise + // an onerror event). + console.error('Failed to perform DigitalOcean request'); + reject(new XhrError()); + }; + xhr.send(data ? JSON.stringify(data) : undefined); + }); + } +} + +// Removes invalid characters from input name so it can be used with +// DigitalOcean APIs. +function makeValidDropletName(name: string): string { + // Remove all characters outside of A-Z, a-z, 0-9 and '-'. + return name.replace(/[^A-Za-z0-9-]/g, ''); +} diff --git a/server_manager/cloud/gcp_api.ts b/server_manager/cloud/gcp_api.ts new file mode 100644 index 0000000000..70790d0233 --- /dev/null +++ b/server_manager/cloud/gcp_api.ts @@ -0,0 +1,755 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// TODO: Share the same OAuth config between electron app and renderer. +// Keep this in sync with {@link gcp_oauth.ts#OAUTH_CONFIG} +const GCP_OAUTH_CLIENT_ID = '946220775492-a5v6bsdin6o7ncnqn34snuatmrp7dqh0.apps.googleusercontent.com'; +// Note: For native apps, the "client secret" is not actually a secret. +// See https://developers.google.com/identity/protocols/oauth2/native-app. +const GCP_OAUTH_CLIENT_SECRET = 'lQT4Qx9b3CaSHDcnuYFgyYVE'; + +export class GcpError extends Error { + constructor(code: number, message?: string) { + // ref: + // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget + super(`Error ${code}: ${message}`); // 'Error' breaks prototype chain here + Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain + this.name = new.target.name; + } +} + +/** @see https://cloud.google.com/compute/docs/reference/rest/v1/instances */ +export type Instance = Readonly<{ + id: string; + creationTimestamp: string; + name: string; + description: string; + tags: {items: string[]; fingerprint: string}; + machineType: string; + zone: string; + networkInterfaces: Array<{ + network: string; + subnetwork: string; + networkIP: string; + ipv6Address: string; + name: string; + accessConfigs: Array<{ + type: string; + name: string; + natIP: string; + setPublicPtr: boolean; + publicPtrDomainName: string; + networkTier: string; + kind: string; + }>; + }>; +}>; + +/** @see https://cloud.google.com/compute/docs/reference/rest/v1/addresses */ +type StaticIp = Readonly<{}>; + +const GCE_V1_API = 'https://compute.googleapis.com/compute/v1'; + +function projectUrl(projectId: string): string { + return `${GCE_V1_API}/projects/${projectId}`; +} + +export interface RegionLocator { + /** The GCP project ID. */ + projectId: string; + /** The region of the operation. */ + regionId: string; +} + +function regionUrl({projectId, regionId}: RegionLocator): string { + return `${projectUrl(projectId)}/regions/${regionId}`; +} + +/** + * Represents the scope of a zonal operation + */ +export interface ZoneLocator { + /** The GCP project ID. */ + projectId: string; + /** The zone of the operation. */ + zoneId: string; +} + +function zoneUrl({projectId, zoneId}: ZoneLocator): string { + return `${projectUrl(projectId)}/zones/${zoneId}`; +} + +const zoneUrlRegExp = new RegExp('/compute/v1/projects/(?[^/]+)/zones/(?[^/]+)$'); + +export function parseZoneUrl(url: string): ZoneLocator { + const groups = new URL(url).pathname.match(zoneUrlRegExp).groups; + return { + projectId: groups['projectId'], + zoneId: groups['zoneId'], + }; +} + +/** + * Helper type to avoid error-prone positional arguments to instance-related + * functions. + */ +export interface InstanceLocator extends ZoneLocator { + /** The ID of the instance. */ + instanceId: string; +} + +function instanceUrl(instance: InstanceLocator): string { + return `${zoneUrl(instance)}/instances/${instance.instanceId}`; +} + +/** + * @see https://cloud.google.com/compute/docs/reference/rest/v1/instances/getGuestAttributes#response-body + */ +type GuestAttributes = Readonly<{ + variableKey: string; + variableValue: string; + queryPath: string; + queryValue: {items: Array<{namespace: string; key: string; value: string}>}; +}>; + +/** @see https://cloud.google.com/compute/docs/reference/rest/v1/zones */ +type Zone = Readonly<{ + id: string; + creationTimestamp: string; + name: string; + description: string; + status: 'UP' | 'DOWN'; + region: string; +}>; + +type Status = Readonly<{code: number; message: string}>; + +/** @see https://cloud.google.com/resource-manager/reference/rest/Shared.Types/Operation */ +export type ResourceManagerOperation = Readonly<{name: string; done: boolean; error: Status}>; + +/** + * @see https://cloud.google.com/compute/docs/reference/rest/v1/globalOperations + * @see https://cloud.google.com/compute/docs/reference/rest/v1/zoneOperations + */ +export type ComputeEngineOperation = Readonly<{ + id: string; + name: string; + targetId: string; + status: string; + error: {errors: Status[]}; +}>; + +/** + * @see https://cloud.google.com/service-usage/docs/reference/rest/Shared.Types/ListOperationsResponse#Operation + */ +type ServiceUsageOperation = Readonly<{name: string; done: boolean; error: Status}>; + +/** @see https://cloud.google.com/resource-manager/reference/rest/v1/projects */ +export type Project = Readonly<{ + projectNumber: string; + projectId: string; + name: string; + lifecycleState: string; +}>; + +/** @see https://cloud.google.com/compute/docs/reference/rest/v1/firewalls/get#response-body */ +type Firewall = Readonly<{id: string; name: string}>; + +/** https://cloud.google.com/billing/docs/reference/rest/v1/billingAccounts */ +export type BillingAccount = Readonly<{ + name: string; + open: boolean; + displayName: string; + masterBillingAccount: string; +}>; + +/** https://cloud.google.com/billing/docs/reference/rest/v1/ProjectBillingInfo */ +export type ProjectBillingInfo = Readonly<{ + name: string; + projectId: string; + billingAccountName?: string; + billingEnabled?: boolean; +}>; + +/** + * @see https://accounts.google.com/.well-known/openid-configuration for + * supported claims. + * + * Note: The supported claims are optional and not guaranteed to be in the + * response. + */ +export type UserInfo = Readonly<{email: string}>; + +type Service = Readonly<{ + name: string; + config: {name: string}; + state: 'STATE_UNSPECIFIED' | 'DISABLED' | 'ENABLED'; +}>; + +type ItemsResponse = Readonly<{items: T; nextPageToken: string}>; + +type ListInstancesResponse = ItemsResponse; +type ListAllInstancesResponse = ItemsResponse<{[zone: string]: {instances: Instance[]}}>; +type ListZonesResponse = ItemsResponse; +type ListProjectsResponse = Readonly<{projects: Project[]; nextPageToken: string}>; +type ListFirewallsResponse = ItemsResponse; +type ListBillingAccountsResponse = Readonly<{ + billingAccounts: BillingAccount[]; + nextPageToken: string; +}>; +type ListEnabledServicesResponse = Readonly<{services: Service[]; nextPageToken: string}>; +type RefreshAccessTokenResponse = Readonly<{access_token: string; expires_in: number}>; + +export class HttpError extends Error { + constructor(private statusCode: number, message?: string) { + super(message); + } + + getStatusCode(): number { + return this.statusCode; + } +} + +export class RestApiClient { + private readonly GCP_HEADERS = new Map([ + ['Content-type', 'application/json'], + ['Accept', 'application/json'], + ]); + + private accessToken: string; + + constructor(private refreshToken: string) {} + + /** + * Creates a new Google Compute Engine VM instance in a specified GCP project. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/instances/insert + * + * @param zone - Indicates the GCP project and zone. + * @param data - Request body data. See documentation. + * @return The initial operation response. Call computeEngineOperationZoneWait + * to wait for the creation process to complete. + */ + async createInstance(zone: ZoneLocator, data: {}): Promise { + return this.fetchAuthenticated( + 'POST', + new URL(`${zoneUrl(zone)}/instances`), + this.GCP_HEADERS, + null, + data + ); + } + + /** + * Deletes a specified Google Compute Engine VM instance. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/instances/delete + * + * @param instance - Identifies the instance to delete. + * @return The initial operation response. Call computeEngineOperationZoneWait + * to wait for the deletion process to complete. + */ + deleteInstance(instance: InstanceLocator): Promise { + return this.fetchAuthenticated('DELETE', new URL(instanceUrl(instance)), this.GCP_HEADERS); + } + + /** + * Gets the specified Google Compute Engine VM instance resource. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/instances/get + * + * @param instance - Identifies the instance to return. + */ + getInstance(instance: InstanceLocator): Promise { + return this.fetchAuthenticated('GET', new URL(instanceUrl(instance)), this.GCP_HEADERS); + } + + /** + * Lists the Google Compute Engine VM instances in a specified zone. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/instances/list + * + * @param zone - Indicates the GCP project and zone. + * @param filter - See documentation. + */ + // TODO: Pagination + listInstances(zone: ZoneLocator, filter?: string): Promise { + let parameters = null; + if (filter) { + parameters = new Map([['filter', filter]]); + } + return this.fetchAuthenticated('GET', new URL(`${zoneUrl(zone)}/instances`), this.GCP_HEADERS, parameters); + } + + /** + * Lists all the Google Compute Engine VM instances in a specified project. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/instances/aggregatedList + * + * @param projectId - The GCP project. + * @param filter - See documentation. + */ + // TODO: Pagination + listAllInstances(projectId: string, filter?: string): Promise { + let parameters = null; + if (filter) { + parameters = new Map([['filter', filter]]); + } + return this.fetchAuthenticated( + 'GET', + new URL(`${projectUrl(projectId)}/aggregated/instances`), + this.GCP_HEADERS, + parameters + ); + } + + /** + * Creates a static IP address. + * + * If no IP address is provided, a new static IP address is created. If an + * ephemeral IP address is provided, it is promoted to a static IP address. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/addresses/insert + * + * @param region - The GCP project and region. + * @param data - Request body data. See documentation. + */ + async createStaticIp(region: RegionLocator, data: {}): Promise { + const operation = await this.fetchAuthenticated( + 'POST', + new URL(`${regionUrl(region)}/addresses`), + this.GCP_HEADERS, + null, + data + ); + return await this.computeEngineOperationRegionWait(region, operation.name); + } + + /** + * Deletes a static IP address. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/addresses/delete + * + * @param region - The GCP project and region. + * @param addressName - The name of the static IP address resource. + * @return The initial operation response. Call computeEngineOperationRegionWait + * to wait for the deletion process to complete. + */ + deleteStaticIp(region: RegionLocator, addressName: string): Promise { + return this.fetchAuthenticated( + 'DELETE', + new URL(`${regionUrl(region)}/addresses/${addressName}`), + this.GCP_HEADERS + ); + } + + /** + * Retrieves a static IP address, if it exists. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/addresses/get + * + * @param region - The GCP project and region. + * @param addressName - The name of the static IP address resource. + */ + getStaticIp(region: RegionLocator, addressName: string): Promise { + return this.fetchAuthenticated( + 'GET', + new URL(`${regionUrl(region)}/addresses/${addressName}`), + this.GCP_HEADERS + ); + } + + /** + * Lists the guest attributes applied to the specified Google Compute Engine VM instance. + * + * @see https://cloud.google.com/compute/docs/storing-retrieving-metadata#guest_attributes + * @see https://cloud.google.com/compute/docs/reference/rest/v1/instances/getGuestAttributes + * + * @param instance - Identifies the instance to inspect. + * @param namespace - The namespace of the guest attributes. + */ + async getGuestAttributes(instance: InstanceLocator, namespace: string): Promise { + try { + const parameters = new Map([['queryPath', namespace]]); + // We must await the call to getGuestAttributes to properly catch any exceptions. + return await this.fetchAuthenticated( + 'GET', + new URL(`${instanceUrl(instance)}/getGuestAttributes`), + this.GCP_HEADERS, + parameters + ); + } catch (error) { + // TODO: Distinguish between 404 not found and other errors. + return undefined; + } + } + + /** + * Creates a firewall under the specified GCP project. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/firewalls/insert + * + * @param projectId - The GCP project ID. + * @param data - Request body data. See documentation. + */ + async createFirewall(projectId: string, data: {}): Promise { + const operation = await this.fetchAuthenticated( + 'POST', + new URL(`${projectUrl(projectId)}/global/firewalls`), + this.GCP_HEADERS, + null, + data + ); + return await this.computeEngineOperationGlobalWait(projectId, operation.name); + } + + /** + * @param projectId - The GCP project ID. + * @param name - The firewall name. + */ + // TODO: Replace with getFirewall (and handle 404 NotFound) + listFirewalls(projectId: string, name: string): Promise { + const filter = `name=${name}`; + const parameters = new Map([['filter', filter]]); + return this.fetchAuthenticated( + 'GET', + new URL(`${projectUrl(projectId)}/global/firewalls`), + this.GCP_HEADERS, + parameters + ); + } + + /** + * Lists the zones available to a given GCP project. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/zones/list + * + * @param projectId - The GCP project ID. + */ + // TODO: Pagination + listZones(projectId: string): Promise { + return this.fetchAuthenticated('GET', new URL(`${projectUrl(projectId)}/zones`), this.GCP_HEADERS); + } + + /** + * Lists all services that have been enabled on the project. + * + * @param projectId - The GCP project ID. + */ + listEnabledServices(projectId: string): Promise { + const parameters = new Map([['filter', 'state:ENABLED']]); + return this.fetchAuthenticated( + 'GET', + new URL(`https://serviceusage.googleapis.com/v1/projects/${projectId}/services`), + this.GCP_HEADERS, + parameters + ); + } + + /** + * @param projectId - The GCP project ID. + * @param data - Request body data. See documentation. + */ + enableServices(projectId: string, data: {}): Promise { + return this.fetchAuthenticated( + 'POST', + new URL(`https://serviceusage.googleapis.com/v1/projects/${projectId}/services:batchEnable`), + this.GCP_HEADERS, + null, + data + ); + } + + /** + * Creates a new GCP project + * + * The project ID must conform to the following: + * - must be 6 to 30 lowercase letters, digits, or hyphens + * - must start with a letter + * - no trailing hyphens + * + * @see https://cloud.google.com/resource-manager/reference/rest/v1/projects/create + * + * @param data - Request body data. See documentation. + */ + createProject(data: {}): Promise { + return this.fetchAuthenticated( + 'POST', + new URL('https://cloudresourcemanager.googleapis.com/v1/projects'), + this.GCP_HEADERS, + null, + data + ); + } + + /** + * Lists the GCP projects that the user has access to. + * + * @see https://cloud.google.com/resource-manager/reference/rest/v1/projects/list + * + * @param filter - See documentation. + */ + listProjects(filter?: string): Promise { + let parameters = null; + if (filter) { + parameters = new Map([['filter', filter]]); + } + return this.fetchAuthenticated( + 'GET', + new URL('https://cloudresourcemanager.googleapis.com/v1/projects'), + this.GCP_HEADERS, + parameters + ); + } + + /** + * Gets the billing information for a specified GCP project. + * + * @see https://cloud.google.com/billing/docs/reference/rest/v1/projects/getBillingInfo + * + * @param projectId - The GCP project ID. + */ + getProjectBillingInfo(projectId: string): Promise { + return this.fetchAuthenticated( + 'GET', + new URL(`https://cloudbilling.googleapis.com/v1/projects/${projectId}/billingInfo`), + this.GCP_HEADERS + ); + } + + /** + * Associates a GCP project with a billing account. + * + * @see https://cloud.google.com/billing/docs/reference/rest/v1/projects/updateBillingInfo + * + * @param projectId - The GCP project ID. + * @param data - Request body data. See documentation. + */ + updateProjectBillingInfo(projectId: string, data: {}): Promise { + return this.fetchAuthenticated( + 'PUT', + new URL(`https://cloudbilling.googleapis.com/v1/projects/${projectId}/billingInfo`), + this.GCP_HEADERS, + null, + data + ); + } + + /** + * Lists the billing accounts that the user has access to. + * + * @see https://cloud.google.com/billing/docs/reference/rest/v1/billingAccounts/list + */ + listBillingAccounts(): Promise { + return this.fetchAuthenticated( + 'GET', + new URL(`https://cloudbilling.googleapis.com/v1/billingAccounts`), + this.GCP_HEADERS + ); + } + + /** + * Waits for a specified Google Compute Engine zone operation to complete. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/zoneOperations/wait + * + * @param zone - Indicates the GCP project and zone. + * @param operationId - The operation ID. + */ + async computeEngineOperationZoneWait(zone: ZoneLocator, operationId: string): Promise { + const operation = await this.fetchAuthenticated( + 'POST', + new URL(`${zoneUrl(zone)}/operations/${operationId}/wait`), + this.GCP_HEADERS + ); + if (operation.error?.errors) { + throw new GcpError(operation?.error.errors[0]?.code, operation?.error.errors[0]?.message); + } + return operation; + } + + /** + * Waits for a specified Google Compute Engine region operation to complete. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/regionOperations/wait + * + * @param region - The GCP project and region. + * @param operationId - The operation ID. + */ + computeEngineOperationRegionWait(region: RegionLocator, operationId: string): Promise { + return this.fetchAuthenticated( + 'POST', + new URL(`${regionUrl(region)}/operations/${operationId}/wait`), + this.GCP_HEADERS + ); + } + + /** + * Waits for a specified Google Compute Engine global operation to complete. + * + * @see https://cloud.google.com/compute/docs/reference/rest/v1/globalOperations/wait + * + * @param projectId - The GCP project ID. + * @param operationId - The operation ID. + */ + computeEngineOperationGlobalWait(projectId: string, operationId: string): Promise { + return this.fetchAuthenticated( + 'POST', + new URL(`${projectUrl(projectId)}/global/operations/${operationId}/wait`), + this.GCP_HEADERS + ); + } + + resourceManagerOperationGet(operationId: string): Promise { + return this.fetchAuthenticated( + 'GET', + new URL(`https://cloudresourcemanager.googleapis.com/v1/${operationId}`), + this.GCP_HEADERS + ); + } + + serviceUsageOperationGet(operationId: string): Promise { + return this.fetchAuthenticated( + 'GET', + new URL(`https://serviceusage.googleapis.com/v1/${operationId}`), + this.GCP_HEADERS + ); + } + + /** + * Gets the OpenID Connect profile information. + * + * For a list of the supported Google OpenID claims + * @see https://accounts.google.com/.well-known/openid-configuration. + * + * The OpenID standard, including the "userinfo" response and core claims, is + * defined in the links below: + * @see https://openid.net/specs/openid-connect-core-1_0.html#UserInfoResponse + * @see https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims + */ + getUserInfo(): Promise { + return this.fetchAuthenticated( + 'POST', + new URL('https://openidconnect.googleapis.com/v1/userinfo'), + this.GCP_HEADERS + ); + } + + private async refreshGcpAccessToken(refreshToken: string): Promise { + const headers = new Map([ + ['Host', 'oauth2.googleapis.com'], + ['Content-Type', 'application/x-www-form-urlencoded'], + ]); + const data = { + // TODO: Consider moving client ID to the caller. + client_id: GCP_OAUTH_CLIENT_ID, + client_secret: GCP_OAUTH_CLIENT_SECRET, + refresh_token: refreshToken, + grant_type: 'refresh_token', + }; + const encodedData = this.encodeFormData(data); + const response: RefreshAccessTokenResponse = await this.fetchUnauthenticated( + 'POST', + new URL('https://oauth2.googleapis.com/token'), + headers, + null, + encodedData + ); + return response.access_token; + } + + /** + * Revokes a token. + * + * @see https://developers.google.com/identity/protocols/oauth2/native-app + * + * @param token - A refresh token or access token + */ + // TODO(fortuna): use this to revoke the access token on account disconnection. + // private async revokeGcpToken(token: string): Promise { + // const headers = new Map( + // [['Host', 'oauth2.googleapis.com'], ['Content-Type', 'application/x-www-form-urlencoded']]); + // const parameters = new Map([['token', token]]); + // return this.fetchUnauthenticated( + // 'GET', new URL('https://oauth2.googleapis.com/revoke'), headers, parameters); + // } + + private async fetchAuthenticated( + method: string, + url: URL, + headers: Map, + parameters?: Map, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data?: any + ): Promise { + const httpHeaders = new Map(headers); + + // TODO: Handle token expiration/revokation. + if (!this.accessToken) { + this.accessToken = await this.refreshGcpAccessToken(this.refreshToken); + } + httpHeaders.set('Authorization', `Bearer ${this.accessToken}`); + return this.fetchUnauthenticated(method, url, httpHeaders, parameters, data); + } + + private async fetchUnauthenticated( + method: string, + url: URL, + headers: Map, + parameters?: Map, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data?: any + ): Promise { + const customHeaders = new Headers(); + headers.forEach((value, key) => { + customHeaders.append(key, value); + }); + if (parameters) { + parameters.forEach((value: string, key: string) => url.searchParams.append(key, value)); + } + + // TODO: More robust handling of data types + if (typeof data === 'object') { + data = JSON.stringify(data); + } + + const response = await fetch(url.toString(), { + method: method.toUpperCase(), + headers: customHeaders, + ...(data && {body: data}), + }); + + if (!response.ok) { + throw new HttpError(response.status, response.statusText); + } + + try { + let result = undefined; + if (response.status !== 204) { + result = await response.json(); + } + return result; + } catch (e) { + throw new Error('Error parsing response body: ' + JSON.stringify(e)); + } + } + + private encodeFormData(data: object): string { + return Object.entries(data) + .map(entry => { + return encodeURIComponent(entry[0]) + '=' + encodeURIComponent(entry[1]); + }) + .join('&'); + } +} diff --git a/server_manager/css-in-js-rtl-loader.js b/server_manager/css-in-js-rtl-loader.js new file mode 100644 index 0000000000..a51c945d23 --- /dev/null +++ b/server_manager/css-in-js-rtl-loader.js @@ -0,0 +1,43 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const postcss = require('postcss'); +const rtl = require('postcss-rtl'); + +const CSS_PROCESSOR = postcss([rtl()]); + +function generateRtlCss(css) { + return ( + CSS_PROCESSOR.process(css) + .css // Replace the generated selectors with Shadow DOM selectors for Polymer compatibility. + .replace(/\[dir=rtl\]/g, ':host(:dir(rtl))') + .replace(/\[dir=ltr\]/g, ':host(:dir(ltr))') + // rtlcss generates [dir] selectors for rules unaffected by directionality; ignore them. + .replace(/\[dir\]/g, '') + ); +} +// This is a Webpack loader that searches for diff --git a/server_manager/images/aws-thumbnail-1.png b/server_manager/images/aws-thumbnail-1.png new file mode 100755 index 0000000000..5e057800f4 Binary files /dev/null and b/server_manager/images/aws-thumbnail-1.png differ diff --git a/server_manager/images/aws-thumbnail-2.png b/server_manager/images/aws-thumbnail-2.png new file mode 100755 index 0000000000..c81733fa0a Binary files /dev/null and b/server_manager/images/aws-thumbnail-2.png differ diff --git a/server_manager/images/check_blue.svg b/server_manager/images/check_blue.svg new file mode 100644 index 0000000000..47cda61d7c --- /dev/null +++ b/server_manager/images/check_blue.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/server_manager/images/check_blue_rtl.svg b/server_manager/images/check_blue_rtl.svg new file mode 100644 index 0000000000..4360cf86f7 --- /dev/null +++ b/server_manager/images/check_blue_rtl.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/server_manager/images/check_green.svg b/server_manager/images/check_green.svg new file mode 100644 index 0000000000..fecf513395 --- /dev/null +++ b/server_manager/images/check_green.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/server_manager/images/check_green_rtl.svg b/server_manager/images/check_green_rtl.svg new file mode 100644 index 0000000000..23e9342b7f --- /dev/null +++ b/server_manager/images/check_green_rtl.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/server_manager/images/check_orange.svg b/server_manager/images/check_orange.svg new file mode 100644 index 0000000000..86381f69f0 --- /dev/null +++ b/server_manager/images/check_orange.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/server_manager/images/check_orange_rtl.svg b/server_manager/images/check_orange_rtl.svg new file mode 100644 index 0000000000..8aa8130b75 --- /dev/null +++ b/server_manager/images/check_orange_rtl.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/server_manager/images/check_white.svg b/server_manager/images/check_white.svg new file mode 100644 index 0000000000..6cc03acb66 --- /dev/null +++ b/server_manager/images/check_white.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/server_manager/images/check_white_rtl.svg b/server_manager/images/check_white_rtl.svg new file mode 100644 index 0000000000..7ee1a61554 --- /dev/null +++ b/server_manager/images/check_white_rtl.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/server_manager/images/cloud.svg b/server_manager/images/cloud.svg new file mode 100755 index 0000000000..50879c3c79 --- /dev/null +++ b/server_manager/images/cloud.svg @@ -0,0 +1,16 @@ + + + + Artboard Copy + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/connect-tip-2x.png b/server_manager/images/connect-tip-2x.png new file mode 100644 index 0000000000..d1cef6cece Binary files /dev/null and b/server_manager/images/connect-tip-2x.png differ diff --git a/server_manager/images/connected_large.png b/server_manager/images/connected_large.png new file mode 100644 index 0000000000..6939e9abc6 Binary files /dev/null and b/server_manager/images/connected_large.png differ diff --git a/server_manager/images/digital_ocean_logo.svg b/server_manager/images/digital_ocean_logo.svg new file mode 100755 index 0000000000..ea80e6fb2d --- /dev/null +++ b/server_manager/images/digital_ocean_logo.svg @@ -0,0 +1,16 @@ + + + + Artboard + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/do_oauth_billing.svg b/server_manager/images/do_oauth_billing.svg new file mode 100755 index 0000000000..cbc6449a56 --- /dev/null +++ b/server_manager/images/do_oauth_billing.svg @@ -0,0 +1,29 @@ + + + + digitalocean_step_2 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/do_oauth_done.svg b/server_manager/images/do_oauth_done.svg new file mode 100755 index 0000000000..4d0f39a8c1 --- /dev/null +++ b/server_manager/images/do_oauth_done.svg @@ -0,0 +1,41 @@ + + + + digitalocean_step_3 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/do_oauth_email.svg b/server_manager/images/do_oauth_email.svg new file mode 100755 index 0000000000..71ebcc3af2 --- /dev/null +++ b/server_manager/images/do_oauth_email.svg @@ -0,0 +1,18 @@ + + + + digitalocean_step_1 + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/do_white_logo.svg b/server_manager/images/do_white_logo.svg new file mode 100755 index 0000000000..e71569f24f --- /dev/null +++ b/server_manager/images/do_white_logo.svg @@ -0,0 +1,16 @@ + + + DigitalOcean icon + + + + + + + + + + + + + diff --git a/server_manager/images/flags/unknown.png b/server_manager/images/flags/unknown.png new file mode 100644 index 0000000000..7fc04bfaaf Binary files /dev/null and b/server_manager/images/flags/unknown.png differ diff --git a/server_manager/images/gcp-create-instance-screenshot.png b/server_manager/images/gcp-create-instance-screenshot.png new file mode 100644 index 0000000000..761b3fa917 Binary files /dev/null and b/server_manager/images/gcp-create-instance-screenshot.png differ diff --git a/server_manager/images/gcp-create-instance-thumbnail.png b/server_manager/images/gcp-create-instance-thumbnail.png new file mode 100644 index 0000000000..07caf7a99a Binary files /dev/null and b/server_manager/images/gcp-create-instance-thumbnail.png differ diff --git a/server_manager/images/gcp-create-project-screenshot.png b/server_manager/images/gcp-create-project-screenshot.png new file mode 100644 index 0000000000..7046023eb1 Binary files /dev/null and b/server_manager/images/gcp-create-project-screenshot.png differ diff --git a/server_manager/images/gcp-create-project-thumbnail.png b/server_manager/images/gcp-create-project-thumbnail.png new file mode 100644 index 0000000000..22904b6beb Binary files /dev/null and b/server_manager/images/gcp-create-project-thumbnail.png differ diff --git a/server_manager/images/gcp-logo.svg b/server_manager/images/gcp-logo.svg new file mode 100644 index 0000000000..3fa6234e10 --- /dev/null +++ b/server_manager/images/gcp-logo.svg @@ -0,0 +1,29 @@ + + + + logo/google_cloud copy 4 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/gcp-screenshot-1.png b/server_manager/images/gcp-screenshot-1.png new file mode 100644 index 0000000000..62ba66f850 Binary files /dev/null and b/server_manager/images/gcp-screenshot-1.png differ diff --git a/server_manager/images/gcp-screenshot-2.png b/server_manager/images/gcp-screenshot-2.png new file mode 100644 index 0000000000..7ef454eb3c Binary files /dev/null and b/server_manager/images/gcp-screenshot-2.png differ diff --git a/server_manager/images/gcp-thumbnail-1.png b/server_manager/images/gcp-thumbnail-1.png new file mode 100755 index 0000000000..57bb3a7efe Binary files /dev/null and b/server_manager/images/gcp-thumbnail-1.png differ diff --git a/server_manager/images/gcp-thumbnail-2.png b/server_manager/images/gcp-thumbnail-2.png new file mode 100755 index 0000000000..659226c459 Binary files /dev/null and b/server_manager/images/gcp-thumbnail-2.png differ diff --git a/server_manager/images/github-icon.png b/server_manager/images/github-icon.png new file mode 100644 index 0000000000..7b0609fa41 Binary files /dev/null and b/server_manager/images/github-icon.png differ diff --git a/server_manager/images/ic_done_white_24dp.svg b/server_manager/images/ic_done_white_24dp.svg new file mode 100644 index 0000000000..076f897622 --- /dev/null +++ b/server_manager/images/ic_done_white_24dp.svg @@ -0,0 +1,16 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/jigsaw-logo.svg b/server_manager/images/jigsaw-logo.svg new file mode 100644 index 0000000000..74a777155c --- /dev/null +++ b/server_manager/images/jigsaw-logo.svg @@ -0,0 +1,28 @@ + + + + +Jigsaw +Created with Sketch. + + + + + + + + + + diff --git a/server_manager/images/key-avatar.svg b/server_manager/images/key-avatar.svg new file mode 100644 index 0000000000..a0c359a0aa --- /dev/null +++ b/server_manager/images/key-avatar.svg @@ -0,0 +1,14 @@ + + + + Group 6 Copy 6 + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/server_manager/images/key-tip-2x.png b/server_manager/images/key-tip-2x.png new file mode 100644 index 0000000000..2472c1e365 Binary files /dev/null and b/server_manager/images/key-tip-2x.png differ diff --git a/server_manager/images/launcher-icon.png b/server_manager/images/launcher-icon.png new file mode 100644 index 0000000000..c345dac214 Binary files /dev/null and b/server_manager/images/launcher-icon.png differ diff --git a/server_manager/images/manager-about-logo2x.png b/server_manager/images/manager-about-logo2x.png new file mode 100644 index 0000000000..2ea033c42a Binary files /dev/null and b/server_manager/images/manager-about-logo2x.png differ diff --git a/server_manager/images/manager-profile-2x.png b/server_manager/images/manager-profile-2x.png new file mode 100644 index 0000000000..44e2521385 Binary files /dev/null and b/server_manager/images/manager-profile-2x.png differ diff --git a/server_manager/images/metrics.png b/server_manager/images/metrics.png new file mode 100644 index 0000000000..e8cb9435b3 Binary files /dev/null and b/server_manager/images/metrics.png differ diff --git a/server_manager/images/outline-manager-logo.svg b/server_manager/images/outline-manager-logo.svg new file mode 100644 index 0000000000..a6d0317245 --- /dev/null +++ b/server_manager/images/outline-manager-logo.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + +Group +Created with Sketch. + + + + + + + + diff --git a/server_manager/images/reddit-icon.png b/server_manager/images/reddit-icon.png new file mode 100644 index 0000000000..38bf21c298 Binary files /dev/null and b/server_manager/images/reddit-icon.png differ diff --git a/server_manager/images/server-icon-selected.png b/server_manager/images/server-icon-selected.png new file mode 100644 index 0000000000..dd0d97a496 Binary files /dev/null and b/server_manager/images/server-icon-selected.png differ diff --git a/server_manager/images/server-icon.png b/server_manager/images/server-icon.png new file mode 100644 index 0000000000..3209bfcd80 Binary files /dev/null and b/server_manager/images/server-icon.png differ diff --git a/server_manager/images/server-unreachable.png b/server_manager/images/server-unreachable.png new file mode 100644 index 0000000000..d9840bc20a Binary files /dev/null and b/server_manager/images/server-unreachable.png differ diff --git a/server_manager/images/tos-icon.png b/server_manager/images/tos-icon.png new file mode 100644 index 0000000000..dc8b4d7428 Binary files /dev/null and b/server_manager/images/tos-icon.png differ diff --git a/server_manager/index.html b/server_manager/index.html new file mode 100644 index 0000000000..943ce3c6bc --- /dev/null +++ b/server_manager/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + Outline Manager + + + + + diff --git a/server_manager/infrastructure/crypto.ts b/server_manager/infrastructure/crypto.ts new file mode 100644 index 0000000000..ec4329cad3 --- /dev/null +++ b/server_manager/infrastructure/crypto.ts @@ -0,0 +1,38 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as forge from 'node-forge'; + +// Keys are in OpenSSH format +export class KeyPair { + public: string; + private: string; +} + +// Generates an RSA keypair using forge +export function generateKeyPair(): Promise { + return new Promise((resolve, reject) => { + forge.pki.rsa.generateKeyPair({bits: 4096, workers: -1}, (forgeError, keypair) => { + if (forgeError) { + reject(new Error(`Failed to generate SSH key: ${forgeError}`)); + } + // trim() the string because forge adds a trailing space to + // public keys which really messes things up later. + resolve({ + public: forge.ssh.publicKeyToOpenSSH(keypair.publicKey, '').trim(), + private: forge.ssh.privateKeyToOpenSSH(keypair.privateKey, '').trim(), + }); + }); + }); +} diff --git a/server_manager/infrastructure/custom_error.ts b/server_manager/infrastructure/custom_error.ts new file mode 100644 index 0000000000..1250836a62 --- /dev/null +++ b/server_manager/infrastructure/custom_error.ts @@ -0,0 +1,23 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export class CustomError extends Error { + constructor(message?: string) { + // ref: + // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget + super(message); // 'Error' breaks prototype chain here + Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain + this.name = new.target.name; + } +} diff --git a/server_manager/infrastructure/hex_encoding.ts b/server_manager/infrastructure/hex_encoding.ts new file mode 100644 index 0000000000..8a906ef937 --- /dev/null +++ b/server_manager/infrastructure/hex_encoding.ts @@ -0,0 +1,25 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export function hexToString(hexString: string) { + const bytes: string[] = []; + if (hexString.length % 2 !== 0) { + throw new Error('hexString has odd length, ignoring: ' + hexString); + } + for (let i = 0; i < hexString.length; i += 2) { + const hexByte = hexString.slice(i, i + 2); + bytes.push(String.fromCharCode(parseInt(hexByte, 16))); + } + return bytes.join(''); +} diff --git a/server_manager/infrastructure/i18n.spec.ts b/server_manager/infrastructure/i18n.spec.ts new file mode 100644 index 0000000000..d9d62b1fc4 --- /dev/null +++ b/server_manager/infrastructure/i18n.spec.ts @@ -0,0 +1,48 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as i18n from './i18n'; + +describe('LanguageMatcher', () => { + it('returns supported language on match', () => { + const SUPPORTED_LANGUAGES = i18n.languageList(['es', 'pt-BR', 'ru']); + const matcher = new i18n.LanguageMatcher(SUPPORTED_LANGUAGES, undefined); + const supportedLanguage = matcher.getBestSupportedLanguage(i18n.languageList(['pt-PT'])); + expect(supportedLanguage.string()).toEqual('pt-BR'); + }); + it('returns the right variant', () => { + const SUPPORTED_LANGUAGES = i18n.languageList(['en-GB', 'en-IN', 'en-US']); + const matcher = new i18n.LanguageMatcher(SUPPORTED_LANGUAGES, undefined); + const supportedLanguage = matcher.getBestSupportedLanguage(i18n.languageList(['en-IN'])); + expect(supportedLanguage.string()).toEqual('en-IN'); + }); + it('prefers first matched user language', () => { + const SUPPORTED_LANGUAGES = i18n.languageList(['en-US', 'pt-BR']); + const matcher = new i18n.LanguageMatcher(SUPPORTED_LANGUAGES, undefined); + const supportedLanguage = matcher.getBestSupportedLanguage(i18n.languageList(['cn', 'en-GB', 'pt-BR'])); + expect(supportedLanguage.string()).toEqual('en-US'); + }); + it('returns default on no match', () => { + const SUPPORTED_LANGUAGES = i18n.languageList(['es', 'pt-BR', 'ru']); + const matcher = new i18n.LanguageMatcher(SUPPORTED_LANGUAGES, new i18n.LanguageCode('fr')); + const supportedLanguage = matcher.getBestSupportedLanguage(i18n.languageList(['cn'])); + expect(supportedLanguage.string()).toEqual('fr'); + }); + it('returns undefined on no match and no default', () => { + const SUPPORTED_LANGUAGES = i18n.languageList(['es', 'pt-BR', 'ru']); + const matcher = new i18n.LanguageMatcher(SUPPORTED_LANGUAGES); + const supportedLanguage = matcher.getBestSupportedLanguage(i18n.languageList(['cn'])); + expect(supportedLanguage).toBeUndefined(); + }); +}); diff --git a/server_manager/infrastructure/i18n.ts b/server_manager/infrastructure/i18n.ts new file mode 100644 index 0000000000..fc1935cde6 --- /dev/null +++ b/server_manager/infrastructure/i18n.ts @@ -0,0 +1,85 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export class LanguageCode { + private language: string; + private normalizedLanguage: string; + + constructor(languageCodeStr: string) { + this.language = languageCodeStr; + this.normalizedLanguage = languageCodeStr.toLowerCase(); + } + matches(other: LanguageCode): boolean { + return this.normalizedLanguage === other.normalizedLanguage; + } + string(): string { + return this.language; + } + split(): string[] { + return this.language.split('-'); + } +} + +export class LanguageMatcher { + constructor(private supportedLanguages: LanguageCode[], private defaultLanguage: LanguageCode = undefined) {} + + // Goes over each user language, trying to find the supported language that matches + // the best. We'll trim variants of the user and supported languages in order to find + // a match, but the language base is guaranteed to match. + getBestSupportedLanguage(userLanguages: LanguageCode[]): LanguageCode | undefined { + for (const userLanguage of userLanguages) { + const parts = userLanguage.split(); + while (parts.length > 0) { + const trimmedUserLanguage = new LanguageCode(parts.join('-')); + const supportedLanguage = this.getSupportedLanguage(trimmedUserLanguage); + if (supportedLanguage) { + return supportedLanguage; + } + parts.pop(); + } + } + return this.defaultLanguage; + } + + // Returns the closest supported language that matches the user language. + // We make sure the language matches, but the variant may differ. + private getSupportedLanguage(userLanguage: LanguageCode): LanguageCode | undefined { + for (const supportedLanguage of this.supportedLanguages) { + const parts = supportedLanguage.split(); + while (parts.length > 0) { + const trimmedSupportedLanguage = new LanguageCode(parts.join('-')); + if (userLanguage.matches(trimmedSupportedLanguage)) { + return supportedLanguage; + } + parts.pop(); + } + } + return undefined; + } +} + +export function languageList(languagesAsStr: string[]): LanguageCode[] { + return languagesAsStr.map(l => new LanguageCode(l)); +} + +// Returns the languages supported by the browser. +export function getBrowserLanguages(): LanguageCode[] { + // Ensure that navigator.languages is defined and not empty, as can be the case with some browsers + // (i.e. Chrome 59 on Electron). + let languages = navigator.languages as string[]; + if (!languages || languages.length === 0) { + languages = [navigator.language]; + } + return languageList(languages); +} diff --git a/server_manager/infrastructure/memory_storage.ts b/server_manager/infrastructure/memory_storage.ts new file mode 100644 index 0000000000..63298186be --- /dev/null +++ b/server_manager/infrastructure/memory_storage.ts @@ -0,0 +1,41 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export class InMemoryStorage implements Storage { + readonly length: number; + [key: string]: {}; + [index: number]: string; + + constructor(private store: Map = new Map()) {} + + clear(): void { + throw new Error('InMemoryStorage.clear not implemented'); + } + + getItem(key: string): string | null { + return this.store.get(key) || null; + } + + key(_index: number): string | null { + throw new Error('InMemoryStorage.key not implemented'); + } + + removeItem(key: string): void { + this.store.delete(key); + } + + setItem(key: string, data: string): void { + this.store.set(key, data); + } +} diff --git a/server_manager/infrastructure/path_api.spec.ts b/server_manager/infrastructure/path_api.spec.ts new file mode 100644 index 0000000000..1e80972733 --- /dev/null +++ b/server_manager/infrastructure/path_api.spec.ts @@ -0,0 +1,67 @@ +// Copyright 2022 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {PathApiClient} from './path_api'; + +describe('PathApi', () => { + // Mock fetcher + let lastRequest: HttpRequest; + let nextResponse: Promise; + + const fetcher = (request: HttpRequest) => { + lastRequest = request; + return nextResponse; + }; + + beforeEach(() => { + lastRequest = undefined; + nextResponse = undefined; + }); + + const api = new PathApiClient('https://asdf.test/foo', fetcher); + + it('GET', async () => { + const response = {status: 200, body: '{"asdf": true}'}; + nextResponse = Promise.resolve(response); + expect(await api.request('bar')).toEqual({asdf: true}); + expect(lastRequest).toEqual({ + url: 'https://asdf.test/foo/bar', + method: 'GET', + }); + }); + + it('PUT form data', async () => { + const response = {status: 200, body: '{"asdf": true}'}; + nextResponse = Promise.resolve(response); + expect(await api.requestForm('bar', 'PUT', {name: 'value'})).toEqual({asdf: true}); + expect(lastRequest).toEqual({ + url: 'https://asdf.test/foo/bar', + method: 'PUT', + headers: {'Content-Type': 'application/x-www-form-urlencoded'}, + body: 'name=value', + }); + }); + + it('POST JSON data', async () => { + const response = {status: 200, body: '{"asdf": true}'}; + nextResponse = Promise.resolve(response); + expect(await api.requestJson('bar', 'POST', {key: 'value'})).toEqual({asdf: true}); + expect(lastRequest).toEqual({ + url: 'https://asdf.test/foo/bar', + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: '{"key":"value"}', + }); + }); +}); diff --git a/server_manager/infrastructure/path_api.ts b/server_manager/infrastructure/path_api.ts new file mode 100644 index 0000000000..4529a1f3fd --- /dev/null +++ b/server_manager/infrastructure/path_api.ts @@ -0,0 +1,133 @@ +// Copyright 2022 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file is imported by both the Electron and Renderer process code, +// so it cannot contain any imports that are not available in both +// environments. + +// These type definitions are designed to bridge the differences between +// the Fetch API and the Node.JS HTTP API, while also being compatible +// with the Structured Clone algorithm so that they can be passed between +// the Electron and Renderer processes. + +import {CustomError} from './custom_error'; + +export interface HttpRequest { + url: string; + method: string; + headers?: Record; + body?: string; +} + +export interface HttpResponse { + status: number; + body?: string; +} + +// A Fetcher provides the HTTP client functionality for PathApi. +export type Fetcher = (request: HttpRequest) => Promise; + +// Thrown when an API request fails. +export class ServerApiError extends CustomError { + constructor(message: string, public readonly response?: HttpResponse) { + super(message); + } + + // Returns true if no response was received, i.e. a network error was encountered. + // Can be used to distinguish between client and server-side issues. + isNetworkError() { + return !this.response; + } +} + +/** + * Provides access to an HTTP API of the kind exposed by the Shadowbox server. + * + * An API is defined by a `base` URL, under which all endpoints are defined. + * Request bodies are JSON, HTML-form data, or empty. Response bodies are + * JSON or empty. + * + * If a fingerprint is set, requests are proxied through Node.JS to enable + * certificate pinning. + */ +export class PathApiClient { + /** + * @param base A valid URL + * @param fingerprint A SHA-256 hash of the expected leaf certificate, in binary encoding. + */ + constructor(public readonly base: string, public readonly fetcher: Fetcher) {} + + /** + * Makes a request relative to the base URL with a JSON body. + * + * @param path Relative path (no initial '/') + * @param method HTTP method + * @param body JSON-compatible object + * @returns Response body (JSON or void) + */ + async requestJson(path: string, method: string, body: object): Promise { + return this.request(path, method, 'application/json', JSON.stringify(body)); + } + + /** + * Makes a request relative to the base URL with an HTML-form style body. + * + * @param path Relative path (no initial '/') + * @param method HTTP method + * @param params Form data to send + * @returns Response body (JSON or void) + */ + async requestForm(path: string, method: string, params: Record): Promise { + const body = new URLSearchParams(params); + return this.request(path, method, 'application/x-www-form-urlencoded', body.toString()); + } + + /** + * Makes a request relative to the base URL. + * + * @param path Relative path (no initial '/') + * @param method HTTP method + * @param contentType Content-Type header value + * @param body Request body + * @returns Response body (JSON or void) + */ + async request(path: string, method = 'GET', contentType?: string, body?: string): Promise { + let base = this.base; + if (!base.endsWith('/')) { + base += '/'; + } + const url = base + path; + const request: HttpRequest = {url, method}; + if (contentType) { + request.headers = {'Content-Type': contentType}; + } + if (body) { + request.body = body; + } + let response: HttpResponse; + try { + response = await this.fetcher(request); + } catch (e) { + throw new ServerApiError(`API request to ${path} failed due to network error: ${e.message}`); + } + if (response.status < 200 || response.status >= 300) { + throw new ServerApiError(`API request to ${path} failed with status ${response.status}`, response); + } + if (!response.body) { + return; + } + // Assume JSON and unsafe cast to `T`. + return JSON.parse(response.body); + } +} diff --git a/server_manager/infrastructure/sentry.spec.ts b/server_manager/infrastructure/sentry.spec.ts new file mode 100644 index 0000000000..396781fced --- /dev/null +++ b/server_manager/infrastructure/sentry.spec.ts @@ -0,0 +1,22 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as sentry from './sentry'; + +describe('getSentryApiUrl', () => { + it('returns the right URL', () => { + const url = sentry.getSentryApiUrl('https://_key_@_org_.ingest.sentry.io/_project_'); + expect(url).toEqual('https://_org_.ingest.sentry.io/api/_project_/store/?sentry_version=7&sentry_key=_key_'); + }); +}); diff --git a/server_manager/infrastructure/sentry.ts b/server_manager/infrastructure/sentry.ts new file mode 100644 index 0000000000..68d7bc15e3 --- /dev/null +++ b/server_manager/infrastructure/sentry.ts @@ -0,0 +1,30 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Returns Sentry URL for DSN string or undefined if `sentryDsn` is falsy. +// e.g. for DSN "https://[API_KEY]@[SUBDOMAIN].ingest.sentry.io/[PROJECT_ID]" +// this will return +// "https://[SUBDOMAIN].ingest.sentry.io/api/[PROJECT_ID]/store/?sentry_version=7&sentry_key=[API_KEY]" +export function getSentryApiUrl(sentryDsn?: string): string | undefined { + if (!sentryDsn) { + return undefined; + } + const dsnUrl = new URL(sentryDsn); + const sentryKey = dsnUrl.username; + // Trims leading '/'; + const project = dsnUrl.pathname.substr(1); + return `https://${encodeURIComponent(dsnUrl.hostname)}/api/${encodeURIComponent( + project + )}/store/?sentry_version=7&sentry_key=${sentryKey}`; +} diff --git a/server_manager/infrastructure/sleep.ts b/server_manager/infrastructure/sleep.ts new file mode 100644 index 0000000000..86c84cea0e --- /dev/null +++ b/server_manager/infrastructure/sleep.ts @@ -0,0 +1,17 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/server_manager/infrastructure/value_stream.spec.ts b/server_manager/infrastructure/value_stream.spec.ts new file mode 100644 index 0000000000..b423d014ba --- /dev/null +++ b/server_manager/infrastructure/value_stream.spec.ts @@ -0,0 +1,105 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {ValueStream} from './value_stream'; + +describe('ValueStream', () => { + it('get returns initial value', () => { + const stream = new ValueStream('foo'); + expect(stream.get()).toEqual('foo'); + }); + + it('watch yields initial value', async () => { + const stream = new ValueStream('foo'); + for await (const value of stream.watch()) { + expect(value).toEqual('foo'); + return; + } + fail("Loop didn't run"); + }); + + it('watch on a closed stream yields the final value and exits', async () => { + const stream = new ValueStream('foo'); + stream.close(); + for await (const value of stream.watch()) { + expect(value).toEqual('foo'); + } + }); + + it('closing a stream terminates existing watchers', async () => { + const stream = new ValueStream('foo'); + for await (const value of stream.watch()) { + expect(value).toEqual('foo'); + stream.close(); + } + }); + + it('close can safely be called twice', async () => { + const stream = new ValueStream('foo'); + stream.close(); + stream.close(); + }); + + it('get works after close', () => { + const stream = new ValueStream('foo'); + stream.close(); + expect(stream.get()).toEqual('foo'); + }); + + it('set changes the value', () => { + const stream = new ValueStream('foo'); + stream.set('bar'); + expect(stream.get()).toEqual('bar'); + }); + + it('set updates the generator', async () => { + const stream = new ValueStream('foo'); + for await (const value of stream.watch()) { + if (value === 'foo') { + stream.set('bar'); + } else { + expect(value).toEqual('bar'); + break; + } + } + }); + + it('the last update in a burst is received', async () => { + const stream = new ValueStream('foo'); + let value; + for await (value of stream.watch()) { + if (value === 'foo') { + stream.set('bar'); + stream.set('baz'); + } else if (value === 'baz') { + stream.close(); + } + } + }); + + it('updates can be made during updates', async () => { + const stream = new ValueStream(0); + const stepTo10 = async () => { + for await (const value of stream.watch()) { + if (value === 10) { + break; + } + stream.set(value + 1); + } + }; + + await Promise.all([stepTo10(), stepTo10(), stepTo10()]); + expect(stream.get()).toEqual(10); + }); +}); diff --git a/server_manager/infrastructure/value_stream.ts b/server_manager/infrastructure/value_stream.ts new file mode 100644 index 0000000000..05753be2be --- /dev/null +++ b/server_manager/infrastructure/value_stream.ts @@ -0,0 +1,69 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Represents a value that can change over time, with a generator that + * exposes changes to the value. + * + * Watchers are not guaranteed to see every intermediate value, but are + * guaranteed to see the last value in a series of updates. + */ +export class ValueStream { + private wakers: Array<(closed: boolean) => void> = []; + constructor(private value: T) {} + + get(): T { + return this.value; + } + + set(newValue: T) { + if (this.isClosed()) { + throw new Error('Cannot change a closed value stream'); + } + this.value = newValue; + const wakers = this.wakers; + this.wakers = []; + wakers.forEach(waker => waker(false)); + } + + close() { + if (this.isClosed()) { + return; + } + const finalWakers = this.wakers; + this.wakers = null; + finalWakers.forEach(waker => waker(true)); + } + + isClosed() { + return this.wakers === null; + } + + private nextChange(): Promise { + if (this.isClosed()) { + return Promise.resolve(true); + } + return new Promise(resolve => this.wakers.push(resolve)); + } + + async *watch(): AsyncGenerator { + let closed = false; + while (!closed) { + const nextChange = this.nextChange(); + yield this.value; + closed = await nextChange; + } + yield this.value; + } +} diff --git a/server_manager/install_scripts/build_do_install_script_ts.node.js b/server_manager/install_scripts/build_do_install_script_ts.node.js new file mode 100644 index 0000000000..ad31b25e46 --- /dev/null +++ b/server_manager/install_scripts/build_do_install_script_ts.node.js @@ -0,0 +1,29 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +const fs = require('fs'); + +const tarballBinary = fs.readFileSync(process.argv[2]); +const base64Tarball = tarballBinary.toString('base64'); +const scriptText = ` +(base64 --decode | tar --extract --gzip ) < "${SHADOWBOX_DIR}/install-shadowbox-output" + +# Initialize sentry log file. +export SENTRY_LOG_FILE="${SHADOWBOX_DIR}/sentry-log-file.txt" +true > "${SENTRY_LOG_FILE}" +function log_for_sentry() { + echo "[$(date "+%Y-%m-%d@%H:%M:%S")]" "do_install_server.sh" "$@" >> "${SENTRY_LOG_FILE}" +} +function post_sentry_report() { + if [[ -n "${SENTRY_API_URL}" ]]; then + # Get JSON formatted string. This command replaces newlines with literal '\n' + # but otherwise assumes that there are no other characters to escape for JSON. + # If we need better escaping, we can install the jq command line tool. + local -ir SENTRY_PAYLOAD_BYTE_LIMIT=8000 + local SENTRY_PAYLOAD + SENTRY_PAYLOAD="{\"message\": \"Install error:\n$(awk '{printf "%s\\n", $0}' < "${SENTRY_LOG_FILE}" | tail --bytes "${SENTRY_PAYLOAD_BYTE_LIMIT}")\"}" + # See Sentry documentation at: + # https://media.readthedocs.org/pdf/sentry/7.1.0/sentry.pdf + curl -sSL "${SENTRY_API_URL}" -H "Origin: shadowbox" --data-binary "${SENTRY_PAYLOAD}" + fi +} + +# For backward-compatibility: +readonly DO_ACCESS_TOKEN="${DO_ACCESS_TOKEN:-ACCESS_TOKEN}" + +if [[ -z "${DO_ACCESS_TOKEN}" ]]; then + echo "Access token must be supplied" + exit 1 +fi + +# DigitalOcean's Metadata API base url. +# This URL only supports HTTP (not HTTPS) requests, however it is a local link +# address so not at risk for man-in-the-middle attacks or eavesdropping. +# More detail at https://serverfault.com/questions/427018/what-is-this-ip-address-169-254-169-254 +readonly DO_METADATA_URL="http://169.254.169.254/metadata/v1" + +function cloud::public_ip() { + curl -sSL "${DO_METADATA_URL}/interfaces/public/0/ipv4/address" +} + +# Applies a tag to this droplet. +function cloud::add_tag() { + local -r tag="$1" + local -ar base_flags=(-X POST -H 'Content-Type: application/json' \ + -H "Authorization: Bearer ${DO_ACCESS_TOKEN}") + local -r TAGS_URL='https://api.digitalocean.com/v2/tags' + # Create the tag + curl -sSL "${base_flags[@]}" -d "{\"name\":\"${tag}\"}" "${TAGS_URL}" + local droplet_id + droplet_id="$(curl -sSL "${DO_METADATA_URL}/id")" + printf -v droplet_obj ' +{ + "resources": [{ + "resource_id": "%s", + "resource_type": "droplet" + }] +}' "${droplet_id}" + # Link the tag to this droplet + curl -sSL "${base_flags[@]}" -d "${droplet_obj}" "${TAGS_URL}/${tag}/resources" +} + +# Adds a key-value tag to the droplet. +# Takes the key as the only argument and reads the value from stdin. +# add_kv_tag() converts the input value to hex, because (1) DigitalOcean +# tags may only contain letters, numbers, : - and _, and (2) there is +# currently a bug that makes tags case-insensitive, so we can't use base64. +function cloud::add_kv_tag() { + local -r key="$1" + local value + value="$(xxd -p -c 255)" + cloud::add_tag "kv:${key}:${value}" +} + +# Adds a key-value tag where the value is already hex-encoded. +function cloud::add_encoded_kv_tag() { + local -r key="$1" + local value + read -r value + cloud::add_tag "kv:${key}:${value}" +} + +echo "true" | cloud::add_encoded_kv_tag "install-started" + +log_for_sentry "Starting install" + +# DigitalOcean's docker image comes with ufw enabled by default, disable so when +# can serve the shadowbox manager and instances on arbitrary high number ports. +log_for_sentry "Disabling ufw" +ufw disable + +# Recent DigitalOcean Ubuntu droplets have unattended-upgrades configured from +# the outset but we want to enable automatic rebooting so that critical updates +# are applied without the Outline user's intervention. +readonly UNATTENDED_UPGRADES_CONFIG='/etc/apt/apt.conf.d/50unattended-upgrades' +if [[ -f "${UNATTENDED_UPGRADES_CONFIG}" ]]; then + log_for_sentry "Configuring auto-updates" + cat >> "${UNATTENDED_UPGRADES_CONFIG}" << EOF + +// Enabled by Outline manager installer. +Unattended-Upgrade::Automatic-Reboot "true"; +EOF +fi + +# Enable BBR. +# Recent DigitalOcean one-click images are based on Ubuntu 18 and have kernel 4.15+. +log_for_sentry "Enabling BBR" +cat >> /etc/sysctl.conf << EOF + +# Added by Outline. +net.core.default_qdisc=fq +net.ipv4.tcp_congestion_control=bbr +EOF +sysctl -p + +log_for_sentry "Getting SB_PUBLIC_IP" +SB_PUBLIC_IP="$(cloud::public_ip)" +export SB_PUBLIC_IP + +log_for_sentry "Initializing ACCESS_CONFIG" +export ACCESS_CONFIG="${SHADOWBOX_DIR}/access.txt" +true > "${ACCESS_CONFIG}" + +# Set trap which publishes an error tag and sentry report only if there is an error. +function finish { + local -ir INSTALL_SERVER_EXIT_CODE=$? + log_for_sentry "In EXIT trap, exit code ${INSTALL_SERVER_EXIT_CODE}" + if ! ( grep --quiet apiUrl "${ACCESS_CONFIG}" && grep --quiet certSha256 "${ACCESS_CONFIG}" ); then + echo "INSTALL_SCRIPT_FAILED: ${INSTALL_SERVER_EXIT_CODE}" | cloud::add_kv_tag "install-error" + # Post error report to sentry. + post_sentry_report + fi +} +trap finish EXIT + +# Run install script asynchronously, so tags can be written as soon as they are ready. +log_for_sentry "Running install_server.sh" +./install_server.sh& +declare -ir install_pid=$! + +# Save tags for access information. +log_for_sentry "Reading tags from ACCESS_CONFIG" +tail -f "${ACCESS_CONFIG}" "--pid=${install_pid}" | while IFS=: read -r key value; do + case "${key}" in + certSha256) + # Bypass encoding + log_for_sentry "Writing certSha256 tag" + echo "${value}" | cloud::add_encoded_kv_tag "${key}" + ;; + apiUrl) + log_for_sentry "Writing apiUrl tag" + echo -n "${value}" | cloud::add_kv_tag "${key}" + ;; + esac +done + +# Wait for install script to finish, so that if there is any error in install_server.sh, +# the finish trap in this file will be able to access its error code. +wait "${install_pid}" + +# We could install the agents below in the create droplet request, but they add +# over a minute of delay to the droplet readiness. Instead, we do it here. +# Since the server manager looks only for the tags created in the previous +# step, this does not slow down server creation. + +# Install the DigitalOcean Metrics Agent, for improved monitoring: +# https://docs.digitalocean.com/products/monitoring/how-to/install-agent/ +curl -sSL https://repos.insights.digitalocean.com/install.sh | bash + +# Install the DigitalOcean Droplet Agent, for web console integration: +# https://docs.digitalocean.com/products/droplets/how-to/manage-agent/ +curl -sSL https://repos-droplet.digitalocean.com/install.sh | bash diff --git a/server_manager/install_scripts/gcp_install_server.sh b/server_manager/install_scripts/gcp_install_server.sh new file mode 100755 index 0000000000..2d22dcde7a --- /dev/null +++ b/server_manager/install_scripts/gcp_install_server.sh @@ -0,0 +1,145 @@ +#!/bin/bash +# +# Copyright 2021 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Script to install Shadowbox on a GCP Compute Engine instance + +# You may set the following environment variables, overriding their defaults: +# SB_IMAGE: Shadowbox Docker image to install, e.g. quay.io/outline/shadowbox:nightly +# SB_API_PORT: The port number of the management API. +# SENTRY_API_URL: Url to post Sentry report to on error. +# WATCHTOWER_REFRESH_SECONDS: refresh interval in seconds to check for updates, +# defaults to 3600. + +set -euo pipefail + +export SHADOWBOX_DIR="${SHADOWBOX_DIR:-${HOME:-/root}/shadowbox}" +mkdir -p "${SHADOWBOX_DIR}" + +# Save output for debugging +exec &> "${SHADOWBOX_DIR}/install-shadowbox-output" + +function cloud::public_ip() { + curl curl -H "Metadata-Flavor: Google" "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip" +} + +# Initialize sentry log file. +export SENTRY_LOG_FILE="${SHADOWBOX_DIR}/sentry-log-file.txt" +true > "${SENTRY_LOG_FILE}" +function log_for_sentry() { + echo "[$(date "+%Y-%m-%d@%H:%M:%S")]" "gcp_install_server.sh" "$@" >> "${SENTRY_LOG_FILE}" +} + +function post_sentry_report() { + if [[ -n "${SENTRY_API_URL}" ]]; then + # Get JSON formatted string. This command replaces newlines with literal '\n' + # but otherwise assumes that there are no other characters to escape for JSON. + # If we need better escaping, we can install the jq command line tool. + local -ir SENTRY_PAYLOAD_BYTE_LIMIT=8000 + local SENTRY_PAYLOAD + SENTRY_PAYLOAD="{\"message\": \"Install error:\n$(awk '{printf "%s\\n", $0}' < "${SENTRY_LOG_FILE}" | tail --bytes "${SENTRY_PAYLOAD_BYTE_LIMIT}")\"}" + # See Sentry documentation at: + # https://media.readthedocs.org/pdf/sentry/7.1.0/sentry.pdf + curl "${SENTRY_API_URL}" -H "Origin: shadowbox" --data-binary "${SENTRY_PAYLOAD}" + fi +} + +# Applies a guest attribute to the GCE VM. +function cloud::set_guest_attribute() { + local label_key="$1" + local label_value="$2" + + local GUEST_ATTIBUTE_NAMESPACE="outline" + local SET_GUEST_ATTRIBUTE_URL="http://metadata.google.internal/computeMetadata/v1/instance/guest-attributes/${GUEST_ATTIBUTE_NAMESPACE}/${label_key}" + curl -H "Metadata-Flavor: Google" -X PUT -d "${label_value}" "${SET_GUEST_ATTRIBUTE_URL}" +} + +cloud::set_guest_attribute "install-started" "true" + +# Enable BBR. +# Recent DigitalOcean one-click images are based on Ubuntu 18 and have kernel 4.15+. +log_for_sentry "Enabling BBR" +cat >> /etc/sysctl.conf << EOF + +# Added by Outline. +net.core.default_qdisc=fq +net.ipv4.tcp_congestion_control=bbr +EOF +sysctl -p + +log_for_sentry "Initializing ACCESS_CONFIG" +export ACCESS_CONFIG="${SHADOWBOX_DIR}/access.txt" +true > "${ACCESS_CONFIG}" + +# Set trap which publishes an error tag and sentry report only if there is an error. +function finish { + INSTALL_SERVER_EXIT_CODE=$? + log_for_sentry "In EXIT trap, exit code ${INSTALL_SERVER_EXIT_CODE}" + if ! ( grep --quiet apiUrl "${ACCESS_CONFIG}" && grep --quiet certSha256 "${ACCESS_CONFIG}" ); then + echo "INSTALL_SCRIPT_FAILED: ${INSTALL_SERVER_EXIT_CODE}" | cloud::set_guest_attribute "install-error" "true" + # Post error report to sentry. + post_sentry_report + fi +} +trap finish EXIT + +# Docker is not installed by default. If we don't install it here, +# install.sh will download it using the get.docker.com script (much slower). +log_for_sentry "Downloading Docker" +# Following instructions from https://docs.docker.com/engine/install/ubuntu/#install-from-a-package + +declare -ar PACKAGES=( + 'containerd.io_1.4.9-1_amd64.deb' + 'docker-ce_20.10.8~3-0~ubuntu-focal_amd64.deb' + 'docker-ce-cli_20.10.8~3-0~ubuntu-focal_amd64.deb' +) + +declare packages_csv +packages_csv="$(printf ',%s' "${PACKAGES[@]}")" +packages_csv="${packages_csv:1}" +curl --remote-name-all --fail "https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/{${packages_csv}}" +log_for_sentry "Installing Docker" +dpkg --install "${PACKAGES[@]}" +rm "${PACKAGES[@]}" + +# Run install script asynchronously, so tags can be written as soon as they are ready. +log_for_sentry "Running install_server.sh" +./install_server.sh& +declare -ir install_pid=$! + +# Save tags for access information. +log_for_sentry "Reading tags from ACCESS_CONFIG" +tail -f "${ACCESS_CONFIG}" "--pid=${install_pid}" | while IFS=: read -r key value; do + case "${key}" in + certSha256) + log_for_sentry "Writing certSha256 tag" + echo "case certSha256: ${key}/${value}" + # The value is hex(fingerprint) and Electron expects base64(fingerprint). + hex_fingerprint="${value}" + base64_fingerprint="$(echo -n "${hex_fingerprint}" | xxd -revert -p -c 255 | base64)" + cloud::set_guest_attribute "${key}" "${base64_fingerprint}" + ;; + apiUrl) + log_for_sentry "Writing apiUrl tag" + echo "case apiUrl: ${key}/${value}" + url_value=$(echo -n "${value}") + cloud::set_guest_attribute "${key}" "${url_value}" + ;; + esac +done + +# Wait for install script to finish, so that if there is any error in install_server.sh, +# the finish trap in this file will be able to access its error code. +wait "${install_pid}" diff --git a/server_manager/install_scripts/install_server.sh b/server_manager/install_scripts/install_server.sh new file mode 100755 index 0000000000..0e7a3d0aa5 --- /dev/null +++ b/server_manager/install_scripts/install_server.sh @@ -0,0 +1,627 @@ +#!/bin/bash +# +# Copyright 2018 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Script to install the Outline Server docker container, a watchtower docker container +# (to automatically update the server), and to create a new Outline user. + +# You may set the following environment variables, overriding their defaults: +# SB_IMAGE: The Outline Server Docker image to install, e.g. quay.io/outline/shadowbox:nightly +# CONTAINER_NAME: Docker instance name for shadowbox (default shadowbox). +# For multiple instances also change SHADOWBOX_DIR to an other location +# e.g. CONTAINER_NAME=shadowbox-inst1 SHADOWBOX_DIR=/opt/outline/inst1 +# SHADOWBOX_DIR: Directory for persistent Outline Server state. +# ACCESS_CONFIG: The location of the access config text file. +# SB_DEFAULT_SERVER_NAME: Default name for this server, e.g. "Outline server New York". +# This name will be used for the server until the admins updates the name +# via the REST API. +# SENTRY_LOG_FILE: File for writing logs which may be reported to Sentry, in case +# of an install error. No PII should be written to this file. Intended to be set +# only by do_install_server.sh. +# WATCHTOWER_REFRESH_SECONDS: refresh interval in seconds to check for updates, +# defaults to 3600. +# +# Deprecated: +# SB_PUBLIC_IP: Use the --hostname flag instead +# SB_API_PORT: Use the --api-port flag instead + +# Requires curl and docker to be installed + +set -euo pipefail + +function display_usage() { + cat <] [--api-port ] [--keys-port ] + + --hostname The hostname to be used to access the management API and access keys + --api-port The port number for the management API + --keys-port The port number for the access keys +EOF +} + +readonly SENTRY_LOG_FILE=${SENTRY_LOG_FILE:-} + +# I/O conventions for this script: +# - Ordinary status messages are printed to STDOUT +# - STDERR is only used in the event of a fatal error +# - Detailed logs are recorded to this FULL_LOG, which is preserved if an error occurred. +# - The most recent error is stored in LAST_ERROR, which is never preserved. +FULL_LOG="$(mktemp -t outline_logXXXXXXXXXX)" +LAST_ERROR="$(mktemp -t outline_last_errorXXXXXXXXXX)" +readonly FULL_LOG LAST_ERROR + +function log_command() { + # Direct STDOUT and STDERR to FULL_LOG, and forward STDOUT. + # The most recent STDERR output will also be stored in LAST_ERROR. + "$@" > >(tee -a "${FULL_LOG}") 2> >(tee -a "${FULL_LOG}" > "${LAST_ERROR}") +} + +function log_error() { + local -r ERROR_TEXT="\033[0;31m" # red + local -r NO_COLOR="\033[0m" + echo -e "${ERROR_TEXT}$1${NO_COLOR}" + echo "$1" >> "${FULL_LOG}" +} + +# Pretty prints text to stdout, and also writes to sentry log file if set. +function log_start_step() { + log_for_sentry "$@" + local -r str="> $*" + local -ir lineLength=47 + echo -n "${str}" + local -ir numDots=$(( lineLength - ${#str} - 1 )) + if (( numDots > 0 )); then + echo -n " " + for _ in $(seq 1 "${numDots}"); do echo -n .; done + fi + echo -n " " +} + +# Prints $1 as the step name and runs the remainder as a command. +# STDOUT will be forwarded. STDERR will be logged silently, and +# revealed only in the event of a fatal error. +function run_step() { + local -r msg="$1" + log_start_step "${msg}" + shift 1 + if log_command "$@"; then + echo "OK" + else + # Propagates the error code + return + fi +} + +function confirm() { + echo -n "> $1 [Y/n] " + local RESPONSE + read -r RESPONSE + RESPONSE=$(echo "${RESPONSE}" | tr '[:upper:]' '[:lower:]') || return + [[ -z "${RESPONSE}" || "${RESPONSE}" == "y" || "${RESPONSE}" == "yes" ]] +} + +function command_exists { + command -v "$@" &> /dev/null +} + +function log_for_sentry() { + if [[ -n "${SENTRY_LOG_FILE}" ]]; then + echo "[$(date "+%Y-%m-%d@%H:%M:%S")] install_server.sh" "$@" >> "${SENTRY_LOG_FILE}" + fi + echo "$@" >> "${FULL_LOG}" +} + +# Check to see if docker is installed. +function verify_docker_installed() { + if command_exists docker; then + return 0 + fi + log_error "NOT INSTALLED" + if ! confirm "Would you like to install Docker? This will run 'curl https://get.docker.com/ | sh'."; then + exit 0 + fi + if ! run_step "Installing Docker" install_docker; then + log_error "Docker installation failed, please visit https://docs.docker.com/install for instructions." + exit 1 + fi + log_start_step "Verifying Docker installation" + command_exists docker +} + +function verify_docker_running() { + local STDERR_OUTPUT + STDERR_OUTPUT="$(docker info 2>&1 >/dev/null)" + local -ir RET=$? + if (( RET == 0 )); then + return 0 + elif [[ "${STDERR_OUTPUT}" == *"Is the docker daemon running"* ]]; then + start_docker + return + fi + return "${RET}" +} + +function fetch() { + curl --silent --show-error --fail "$@" +} + +function install_docker() { + ( + # Change umask so that /usr/share/keyrings/docker-archive-keyring.gpg has the right permissions. + # See https://github.com/Jigsaw-Code/outline-server/issues/951. + # We do this in a subprocess so the umask for the calling process is unaffected. + umask 0022 + fetch https://get.docker.com/ | sh + ) >&2 +} + +function start_docker() { + systemctl enable --now docker.service >&2 +} + +function docker_container_exists() { + docker ps -a --format '{{.Names}}'| grep --quiet "^$1$" +} + +function remove_shadowbox_container() { + remove_docker_container "${CONTAINER_NAME}" +} + +function remove_watchtower_container() { + remove_docker_container watchtower +} + +function remove_docker_container() { + docker rm -f "$1" >&2 +} + +function handle_docker_container_conflict() { + local -r CONTAINER_NAME="$1" + local -r EXIT_ON_NEGATIVE_USER_RESPONSE="$2" + local PROMPT="The container name \"${CONTAINER_NAME}\" is already in use by another container. This may happen when running this script multiple times." + if [[ "${EXIT_ON_NEGATIVE_USER_RESPONSE}" == 'true' ]]; then + PROMPT="${PROMPT} We will attempt to remove the existing container and restart it. Would you like to proceed?" + else + PROMPT="${PROMPT} Would you like to replace this container? If you answer no, we will proceed with the remainder of the installation." + fi + if ! confirm "${PROMPT}"; then + if ${EXIT_ON_NEGATIVE_USER_RESPONSE}; then + exit 0 + fi + return 0 + fi + if run_step "Removing ${CONTAINER_NAME} container" "remove_${CONTAINER_NAME}_container" ; then + log_start_step "Restarting ${CONTAINER_NAME}" + "start_${CONTAINER_NAME}" + return $? + fi + return 1 +} + +# Set trap which publishes error tag only if there is an error. +function finish { + local -ir EXIT_CODE=$? + if (( EXIT_CODE != 0 )); then + if [[ -s "${LAST_ERROR}" ]]; then + log_error "\nLast error: $(< "${LAST_ERROR}")" >&2 + fi + log_error "\nSorry! Something went wrong. If you can't figure this out, please copy and paste all this output into the Outline Manager screen, and send it to us, to see if we can help you." >&2 + log_error "Full log: ${FULL_LOG}" >&2 + else + rm "${FULL_LOG}" + fi + rm "${LAST_ERROR}" +} + +function get_random_port { + local -i num=0 # Init to an invalid value, to prevent "unbound variable" errors. + until (( 1024 <= num && num < 65536)); do + num=$(( RANDOM + (RANDOM % 2) * 32768 )); + done; + echo "${num}"; +} + +function create_persisted_state_dir() { + readonly STATE_DIR="${SHADOWBOX_DIR}/persisted-state" + mkdir -p "${STATE_DIR}" + chmod ug+rwx,g+s,o-rwx "${STATE_DIR}" +} + +# Generate a secret key for access to the Management API and store it in a tag. +# 16 bytes = 128 bits of entropy should be plenty for this use. +function safe_base64() { + # Implements URL-safe base64 of stdin, stripping trailing = chars. + # Writes result to stdout. + # TODO: this gives the following errors on Mac: + # base64: invalid option -- w + # tr: illegal option -- - + local url_safe + url_safe="$(base64 -w 0 - | tr '/+' '_-')" + echo -n "${url_safe%%=*}" # Strip trailing = chars +} + +function generate_secret_key() { + SB_API_PREFIX="$(head -c 16 /dev/urandom | safe_base64)" + readonly SB_API_PREFIX +} + +function generate_certificate() { + # Generate self-signed cert and store it in the persistent state directory. + local -r CERTIFICATE_NAME="${STATE_DIR}/shadowbox-selfsigned" + readonly SB_CERTIFICATE_FILE="${CERTIFICATE_NAME}.crt" + readonly SB_PRIVATE_KEY_FILE="${CERTIFICATE_NAME}.key" + declare -a openssl_req_flags=( + -x509 -nodes -days 36500 -newkey rsa:4096 + -subj "/CN=${PUBLIC_HOSTNAME}" + -keyout "${SB_PRIVATE_KEY_FILE}" -out "${SB_CERTIFICATE_FILE}" + ) + openssl req "${openssl_req_flags[@]}" >&2 +} + +function generate_certificate_fingerprint() { + # Add a tag with the SHA-256 fingerprint of the certificate. + # (Electron uses SHA-256 fingerprints: https://github.com/electron/electron/blob/9624bc140353b3771bd07c55371f6db65fd1b67e/atom/common/native_mate_converters/net_converter.cc#L60) + # Example format: "SHA256 Fingerprint=BD:DB:C9:A4:39:5C:B3:4E:6E:CF:18:43:61:9F:07:A2:09:07:37:35:63:67" + local CERT_OPENSSL_FINGERPRINT + CERT_OPENSSL_FINGERPRINT="$(openssl x509 -in "${SB_CERTIFICATE_FILE}" -noout -sha256 -fingerprint)" || return + # Example format: "BDDBC9A4395CB34E6ECF1843619F07A2090737356367" + local CERT_HEX_FINGERPRINT + CERT_HEX_FINGERPRINT="$(echo "${CERT_OPENSSL_FINGERPRINT#*=}" | tr -d :)" || return + output_config "certSha256:${CERT_HEX_FINGERPRINT}" +} + +function join() { + local IFS="$1" + shift + echo "$*" +} + +function write_config() { + local -a config=() + if (( FLAGS_KEYS_PORT != 0 )); then + config+=("\"portForNewAccessKeys\": ${FLAGS_KEYS_PORT}") + fi + if [[ -n "${SB_DEFAULT_SERVER_NAME:-}" ]]; then + config+=("\"name\": \"$(escape_json_string "${SB_DEFAULT_SERVER_NAME}")\"") + fi + config+=("\"hostname\": \"$(escape_json_string "${PUBLIC_HOSTNAME}")\"") + echo "{$(join , "${config[@]}")}" > "${STATE_DIR}/shadowbox_server_config.json" +} + +function start_shadowbox() { + # TODO(fortuna): Write API_PORT to config file, + # rather than pass in the environment. + local -r START_SCRIPT="${STATE_DIR}/start_container.sh" + cat <<-EOF > "${START_SCRIPT}" +# This script starts the Outline server container ("Shadowbox"). +# If you need to customize how the server is run, you can edit this script, then restart with: +# +# "${START_SCRIPT}" + +set -eu + +docker stop "${CONTAINER_NAME}" 2> /dev/null || true +docker rm -f "${CONTAINER_NAME}" 2> /dev/null || true + +docker_command=( + docker + run + -d + --name "${CONTAINER_NAME}" --restart always --net host + + # Used by Watchtower to know which containers to monitor. + --label 'com.centurylinklabs.watchtower.enable=true' + + # Use log rotation. See https://docs.docker.com/config/containers/logging/configure/. + --log-driver local + + # The state that is persisted across restarts. + -v "${STATE_DIR}:${STATE_DIR}" + + # Where the container keeps its persistent state. + -e "SB_STATE_DIR=${STATE_DIR}" + + # Port number and path prefix used by the server manager API. + -e "SB_API_PORT=${API_PORT}" + -e "SB_API_PREFIX=${SB_API_PREFIX}" + + # Location of the API TLS certificate and key. + -e "SB_CERTIFICATE_FILE=${SB_CERTIFICATE_FILE}" + -e "SB_PRIVATE_KEY_FILE=${SB_PRIVATE_KEY_FILE}" + + # Where to report metrics to, if opted-in. + -e "SB_METRICS_URL=${SB_METRICS_URL:-}" + + # The Outline server image to run. + "${SB_IMAGE}" +) +"\${docker_command[@]}" +EOF + chmod +x "${START_SCRIPT}" + # Declare then assign. Assigning on declaration messes up the return code. + local STDERR_OUTPUT + STDERR_OUTPUT="$({ "${START_SCRIPT}" >/dev/null; } 2>&1)" && return + readonly STDERR_OUTPUT + log_error "FAILED" + if docker_container_exists "${CONTAINER_NAME}"; then + handle_docker_container_conflict "${CONTAINER_NAME}" true + return + else + log_error "${STDERR_OUTPUT}" + return 1 + fi +} + +function start_watchtower() { + # Start watchtower to automatically fetch docker image updates. + # Set watchtower to refresh every 30 seconds if a custom SB_IMAGE is used (for + # testing). Otherwise refresh every hour. + local -ir WATCHTOWER_REFRESH_SECONDS="${WATCHTOWER_REFRESH_SECONDS:-3600}" + local -ar docker_watchtower_flags=(--name watchtower --log-driver local --restart always \ + -v /var/run/docker.sock:/var/run/docker.sock) + # By itself, local messes up the return code. + local STDERR_OUTPUT + STDERR_OUTPUT="$(docker run -d "${docker_watchtower_flags[@]}" containrrr/watchtower --cleanup --label-enable --tlsverify --interval "${WATCHTOWER_REFRESH_SECONDS}" 2>&1 >/dev/null)" && return + readonly STDERR_OUTPUT + log_error "FAILED" + if docker_container_exists watchtower; then + handle_docker_container_conflict watchtower false + return + else + log_error "${STDERR_OUTPUT}" + return 1 + fi +} + +# Waits for the service to be up and healthy +function wait_shadowbox() { + # We use insecure connection because our threat model doesn't include localhost port + # interception and our certificate doesn't have localhost as a subject alternative name + until fetch --insecure "${LOCAL_API_URL}/access-keys" >/dev/null; do sleep 1; done +} + +function create_first_user() { + fetch --insecure --request POST "${LOCAL_API_URL}/access-keys" >&2 +} + +function output_config() { + echo "$@" >> "${ACCESS_CONFIG}" +} + +function add_api_url_to_config() { + output_config "apiUrl:${PUBLIC_API_URL}" +} + +function check_firewall() { + # TODO(JonathanDCohen) This is incorrect if access keys are using more than one port. + local -i ACCESS_KEY_PORT + ACCESS_KEY_PORT=$(fetch --insecure "${LOCAL_API_URL}/access-keys" | + docker exec -i "${CONTAINER_NAME}" node -e ' + const fs = require("fs"); + const accessKeys = JSON.parse(fs.readFileSync(0, {encoding: "utf-8"})); + console.log(accessKeys["accessKeys"][0]["port"]); + ') || return + readonly ACCESS_KEY_PORT + if ! fetch --max-time 5 --cacert "${SB_CERTIFICATE_FILE}" "${PUBLIC_API_URL}/access-keys" >/dev/null; then + log_error "BLOCKED" + FIREWALL_STATUS="\ +You won’t be able to access it externally, despite your server being correctly +set up, because there's a firewall (in this machine, your router or cloud +provider) that is preventing incoming connections to ports ${API_PORT} and ${ACCESS_KEY_PORT}." + else + FIREWALL_STATUS="\ +If you have connection problems, it may be that your router or cloud provider +blocks inbound connections, even though your machine seems to allow them." + fi + FIREWALL_STATUS="\ +${FIREWALL_STATUS} + +Make sure to open the following ports on your firewall, router or cloud provider: +- Management port ${API_PORT}, for TCP +- Access key port ${ACCESS_KEY_PORT}, for TCP and UDP +" +} + +function set_hostname() { + # These are URLs that return the client's apparent IP address. + # We have more than one to try in case one starts failing + # (e.g. https://github.com/Jigsaw-Code/outline-server/issues/776). + local -ar urls=( + 'https://icanhazip.com/' + 'https://ipinfo.io/ip' + 'https://domains.google.com/checkip' + ) + for url in "${urls[@]}"; do + PUBLIC_HOSTNAME="$(fetch --ipv4 "${url}")" && return + done + echo "Failed to determine the server's IP address. Try using --hostname ." >&2 + return 1 +} + +install_shadowbox() { + local MACHINE_TYPE + MACHINE_TYPE="$(uname -m)" + if [[ "${MACHINE_TYPE}" != "x86_64" ]]; then + log_error "Unsupported machine type: ${MACHINE_TYPE}. Please run this script on a x86_64 machine" + exit 1 + fi + + # Make sure we don't leak readable files to other users. + umask 0007 + + export CONTAINER_NAME="${CONTAINER_NAME:-shadowbox}" + + run_step "Verifying that Docker is installed" verify_docker_installed + run_step "Verifying that Docker daemon is running" verify_docker_running + + log_for_sentry "Creating Outline directory" + export SHADOWBOX_DIR="${SHADOWBOX_DIR:-/opt/outline}" + mkdir -p "${SHADOWBOX_DIR}" + chmod u+s,ug+rwx,o-rwx "${SHADOWBOX_DIR}" + + log_for_sentry "Setting API port" + API_PORT="${FLAGS_API_PORT}" + if (( API_PORT == 0 )); then + API_PORT=${SB_API_PORT:-$(get_random_port)} + fi + readonly API_PORT + readonly ACCESS_CONFIG="${ACCESS_CONFIG:-${SHADOWBOX_DIR}/access.txt}" + readonly SB_IMAGE="${SB_IMAGE:-quay.io/outline/shadowbox:stable}" + + PUBLIC_HOSTNAME="${FLAGS_HOSTNAME:-${SB_PUBLIC_IP:-}}" + if [[ -z "${PUBLIC_HOSTNAME}" ]]; then + run_step "Setting PUBLIC_HOSTNAME to external IP" set_hostname + fi + readonly PUBLIC_HOSTNAME + + # If $ACCESS_CONFIG is already populated, make a backup before clearing it. + log_for_sentry "Initializing ACCESS_CONFIG" + if [[ -s "${ACCESS_CONFIG}" ]]; then + # Note we can't do "mv" here as do_install_server.sh may already be tailing + # this file. + cp "${ACCESS_CONFIG}" "${ACCESS_CONFIG}.bak" && true > "${ACCESS_CONFIG}" + fi + + # Make a directory for persistent state + run_step "Creating persistent state dir" create_persisted_state_dir + run_step "Generating secret key" generate_secret_key + run_step "Generating TLS certificate" generate_certificate + run_step "Generating SHA-256 certificate fingerprint" generate_certificate_fingerprint + run_step "Writing config" write_config + + # TODO(dborkan): if the script fails after docker run, it will continue to fail + # as the names shadowbox and watchtower will already be in use. Consider + # deleting the container in the case of failure (e.g. using a trap, or + # deleting existing containers on each run). + run_step "Starting Shadowbox" start_shadowbox + # TODO(fortuna): Don't wait for Shadowbox to run this. + run_step "Starting Watchtower" start_watchtower + + readonly PUBLIC_API_URL="https://${PUBLIC_HOSTNAME}:${API_PORT}/${SB_API_PREFIX}" + readonly LOCAL_API_URL="https://localhost:${API_PORT}/${SB_API_PREFIX}" + run_step "Waiting for Outline server to be healthy" wait_shadowbox + run_step "Creating first user" create_first_user + run_step "Adding API URL to config" add_api_url_to_config + + FIREWALL_STATUS="" + run_step "Checking host firewall" check_firewall + + # Echos the value of the specified field from ACCESS_CONFIG. + # e.g. if ACCESS_CONFIG contains the line "certSha256:1234", + # calling $(get_field_value certSha256) will echo 1234. + function get_field_value { + grep "$1" "${ACCESS_CONFIG}" | sed "s/$1://" + } + + # Output JSON. This relies on apiUrl and certSha256 (hex characters) requiring + # no string escaping. TODO: look for a way to generate JSON that doesn't + # require new dependencies. + cat < 0 )); do + local flag="$1" + shift + case "${flag}" in + --hostname) + FLAGS_HOSTNAME="$1" + shift + ;; + --api-port) + FLAGS_API_PORT=$1 + shift + if ! is_valid_port "${FLAGS_API_PORT}"; then + log_error "Invalid value for ${flag}: ${FLAGS_API_PORT}" >&2 + exit 1 + fi + ;; + --keys-port) + FLAGS_KEYS_PORT=$1 + shift + if ! is_valid_port "${FLAGS_KEYS_PORT}"; then + log_error "Invalid value for ${flag}: ${FLAGS_KEYS_PORT}" >&2 + exit 1 + fi + ;; + --) + break + ;; + *) # This should not happen + log_error "Unsupported flag ${flag}" >&2 + display_usage >&2 + exit 1 + ;; + esac + done + if (( FLAGS_API_PORT != 0 && FLAGS_API_PORT == FLAGS_KEYS_PORT )); then + log_error "--api-port must be different from --keys-port" >&2 + exit 1 + fi + return 0 +} + +function main() { + trap finish EXIT + declare FLAGS_HOSTNAME="" + declare -i FLAGS_API_PORT=0 + declare -i FLAGS_KEYS_PORT=0 + parse_flags "$@" + install_shadowbox +} + +main "$@" diff --git a/server_manager/messages/af.json b/server_manager/messages/af.json new file mode 100644 index 0000000000..efbf8860b9 --- /dev/null +++ b/server_manager/messages/af.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline is ’n oopbronprojek wat deur Jigsaw geskep is om aan nuusorganisasies en joernaliste ’n veiliger manier te bied om by die oop internet in te gaan.

Outline word deur Shadowsocks aangedryf en die produk is nog in ’n vroeë stadium. Jy kan tot die kode bydra op GitHub, en ons op Reddit en Medium volg om ingelig te word wanneer ons na meer platforms uitbrei en nuwe kenmerke byvoeg.", + "about-version": "Weergawe {version}", + "aws-lightsail-firewall-0": "Navigeer na die skerm vir {openLink}Amazon Lightsail{closeLink}-gevalle .", + "aws-lightsail-firewall-1": "Klik die geval waarop jy Outline wil huisves.", + "aws-lightsail-firewall-2": "Navigeer na die “Netwerking”-oortjie.", + "aws-lightsail-firewall-3": "Klik “Voeg ’n ander een by” in die “Brandmuur”-afdeling.", + "aws-lightsail-firewall-4": "Stel “App”-waarde op “Alle TCP+UDP”.", + "aws-lightsail-firewall-5": "Klik op “Stoor”.", + "cancel": "Kanselleer", + "close": "Maak toe", + "confirmation-server-destroy": "Bestaande gebruikers sal toegang verloor. Hierdie handeling kan nie ontdoen word nie.", + "confirmation-server-destroy-title": "Wis bediener uit?", + "confirmation-server-remove": "Hierdie handeling verwyder jou bediener van Outline Manager, maar dit blokkeer nie instaanbedienertoegang na gebruikers nie. Jy sal steeds self die Outline-bediener moet verwyder van die masjien waar dit gehuisves word.", + "confirmation-server-remove-title": "Verwyder bediener?", + "data-limit": "Datalimiet", + "data-limit-per-key": "Datalimiet per sleutel", + "data-limits": "Datalimiete", + "data-limits-description": "Stel ’n slepende dataoordraglimiet van 30 dae vir toegangsleutels op hierdie bediener.", + "data-limits-dialog-text": "Gaan na die Instellings-oortjie om ’n dataoordraglimiet vir toegangsleutels op hierdie bediener te stel.", + "data-limits-dialog-title": "Vermy data-oorskotte", + "data-limits-disclaimer": "Aangesien jy tans oor maatstawwe verslag doen, sal gebruik van die datalimietkenmerk ingesluit wees. Sien die {openLink}data-insamelingbeleid{closeLink} vir meer besonderhede.", + "data-limits-usage": "{used} van {total} gebruik", + "destroy": "Wis uit", + "digitalocean-disconnect-account": "Ontkoppel DigitalOcean-rekening", + "digitalocean-unreachable": "Hierdie fout kan as gevolg van ’n brandmuur op jou netwerk wees of tydelike verbindingkwessies met digitalocean.com.", + "disabled": "Gedeaktiveer", + "disconnect": "Ontkoppel", + "done": "Klaar", + "enabled": "Geaktiveer", + "error-connectivity": "Ons sukkel om aan jou DigitalOcean-rekening te koppel. Dit is soms net ’n tydelike probleem met DigitalOcean of met jou internetverbiding. As jy weer probeer en dit werk nie, behoort heraanmelding by DigitalOcean die probleem op te los.", + "error-connectivity-title": "Verbindingprobleem", + "error-do-account-info": "Kon nie DigitalOcean-rekeninginligting kry nie", + "error-do-auth": "Kon nie met DigitalOcean staaf nie", + "error-do-limit": "Jou DigitalOcean-rekening het sy limiet van {num} druppels bereik. Jy kan by https://cloud.digitalocean.com/account/team/droplet_limit_increase vra dat dit vermeerder word", + "error-do-regions": "Kon nie ’n lys met beskikbare streke kry nie", + "error-do-warning": "DigitalOcean-waarskuwing: \"{message}\"", + "error-feedback": "Kon nie terugvoer indien nie. Probeer weer.", + "error-gcp-auth": "Kon nie met Google Cloud Platform staaf nie", + "error-hostname-invalid": "Moet ’n IP-adres of geldige gasheernaam wees.", + "error-key-add": "Kon nie sleutel byvoeg nie", + "error-key-remove": "Kon nie sleutel verwyder nie", + "error-key-rename": "Kon nie sleutel hernoem nie", + "error-keys-get": "Kon nie sleutels laai nie", + "error-keys-port-bad-input": "Die poort moet ’n heelgetal tussen 1 en 65 535.", + "error-keys-port-in-use": "Die poort word reeds op die bediener gebruik.", + "error-licenses": "Kon nie lisensies laai nie.", + "error-metrics": "Kon nie maatstawwe aktiveer nie", + "error-network": "Daar was ’n netwerkfout.", + "error-not-saved": "Nie gestoor nie", + "error-remove-data-limit": "Kon nie verstekdatalimiet deaktiveer nie", + "error-remove-per-key-limit": "Kon nie datalimiet van hierdie toestelsleutel verwyder nie", + "error-server-creation": "Ons kon nie jou Outline-bediener skep nie.", + "error-server-destroy": "Kon nie bediener uitwis nie", + "error-server-removed": "{serverName} is nie meer in jou DigitalOcean-rekening teenwoordig nie.", + "error-server-rename": "Kon nie bediener hernoem nie", + "error-server-unreachable": "Jou Outline-bediener is reg geïnstalleer, maar ons kan nie daaraan koppel nie. Dis waarskynlik omdat jou bediener se brandmuurreëls inkomende verbindings blokkeer. Gaan hulle asseblief na en maak seker dat jy TCP-verbindings toelaat op poorte wat strek van 1024 tot 65535.", + "error-server-unreachable-title": "Kan nie aan jou Outline-bediener koppel nie", + "error-servers-removed": "{serverNames} is nie meer in jou DigitalOcean-rekening teenwoordig nie.", + "error-set-data-limit": "Kon nie verstekdatalimiet stel nie", + "error-set-per-key-limit": "Kon nie datalimiet vir hierdie toegangsleutel stel nie", + "error-unexpected": "'n Fout het onverwags voorgekom.", + "experimental": "Eksperimenteel", + "experiments": "Eksperimente", + "experiments-description": "Toets nuwe kenmerke en stuur vir ons terugvoer voordat hulle vrygestel word.", + "experiments-disclaimer": "Eksperimente word tans ontwikkel en kan verander of van die app verwyder word. As jy tans oor maatstawwe verslag doen, sal gebruik van eksperimentele kenmerke ingesluit wees. Sien die {openLink}data-insamelingbeleid{closeLink} vir meer besonderhede.", + "experiments-feedback": "Het jy voorstelle? {openLink}Dien terugvoer hier in.{closeLink}", + "feedback-cloud-provider": "Kies wolkdiensverskaffer", + "feedback-cloud-provider-error": "Kies asseblief ’n wolkverskaffer.", + "feedback-connection": "Kan nie aan my bediener koppel nie", + "feedback-connection-others": "Ander mense kan nie aan my bediener koppel nie", + "feedback-disclaimer": "Let asseblief daarop dat ons span vrae net in Engels kan antwoord.", + "feedback-email": "E-posadres (opsioneel)", + "feedback-error": "Voer asseblief terugvoer in.", + "feedback-explanation-install": "Iets het verkeerd geloop toe ons probeer het om Outline op jou bediener te installeer. As jy nie ’n oplossing kon kry nie, kan jy dalk terugvoer stuur en vir ons jou e-posadres gee (opsioneel) sodat ons met jou in aanraking kan kom.", + "feedback-general": "Algemene terugvoer", + "feedback-install": "Sukkel jy om Outline te installeer", + "feedback-label": "Jou terugvoer", + "feedback-management": "Sukkel om my bediener te bestuur", + "feedback-other": "Ander", + "feedback-privacy": "Jou terugvoer, jou e-posadres (indien verskaf) en bykomende inligting waarna in die {openLink}privaatheidsbeleid{closeLink} verwys word, sal na die Outline-span gestuur word.", + "feedback-submit": "Dien in", + "feedback-suggestion": "Voorstelle", + "feedback-title-generic": "Stuur terugvoer", + "feedback-title-install": "Kon nie Outline-bediener installeer nie", + "gcp-billing-action": "Volgende", + "gcp-billing-body": "Wag tans vir jou om{openLink}’n faktureringrekening op Google Wolk by te voeg{closeLink}", + "gcp-billing-description": "{openLink}Maak die Wolkkonsole se faktureringbladsy oop{closeLink} en voeg ’n rekening by om te kan voortgaan.", + "gcp-billing-error": "Kan nie faktureringinligting herwin nie", + "gcp-billing-error-zero": "Jy moet ’n faktureringrekening byvoeg voordat jy voortgaan.", + "gcp-click-create": "Klik “Skep”.", + "gcp-create-new-project": "{openLink}Skep ’n nuwe Google Wolk-projek{closeLink}", + "gcp-create-new-vm": "{openLink}Skep ’n nuwe VM-geval{closeLink}.", + "gcp-create-project": "Skep ’n Google Wolk-projek", + "gcp-create-server": "Skep jou Google Wolk-projek", + "gcp-create-vm": "Skep ’n Virtuele Masjien-geval", + "gcp-disconnect-account": "Ontkoppel Google Cloud Platform-rekening", + "gcp-firewall-create-0": "{openLink}Voeg ’n nuwe brandmuurreël by{closeLink} jou Compute Engine-projek.", + "gcp-firewall-create-1": "Tik “outline-bediener” by die “Naamveld” in.", + "gcp-firewall-create-2": "Tik “outline” by die “'Teikenmerkers”-veld in.", + "gcp-firewall-create-3": "Tik “0.0.0.0/0” by die “bron-IP-reekse”-veld in.", + "gcp-firewall-create-4": "Kies “Laat alles toe” onder “Protokolle en poorte”.", + "gcp-name-your-project": "Gee jou projek ’n naam in die “Projeknaam\"-veld.", + "gcp-project-setup-error": "Ons kon nie jou Google Wolk-projek opstel nie", + "gcp-select-machine-type": "Kies “f1-micro” onder “Masjientipe”", + "gcp-select-networking": "Klik “Bestuur, sekuriteit, skywe, netwerking, alleenbesetting”, en dan “Netwerking”", + "gcp-select-region": "Kies onder “Streek” ’n streek in die omgewing van waar die bediener se gebruikers sal wees.", + "gcp-type-network-tag": "Tik “outline” by die “Netwerkmerkers”-veld in.", + "gcp-type-outline-server": "Tik “outline-bediener” by die “Naamveld” in.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua-distrik", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong-Wes", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londen", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Moembai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Noord-Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoel", + "geo-sg": "Singapoer", + "geo-south-carolina": "Suid-Carolina", + "geo-st-ghislain": "Sint Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Warskou", + "geo-zurich": "Zürich", + "key": "Sleutel {keyId}", + "manual-server-assign-firewall": "Wys brandmuurreël toe", + "manual-server-assign-group": "Wys sekuriteitgeroep aan", + "manual-server-create-firewall": "Skep ’n brandmuurreël", + "manual-server-create-group": "Skep ’n sekuriteitgroep", + "manual-server-description": "Hierdie stappe sal jou help om Outline op ’n {cloudProvider} Linux-bediener te installeer.", + "manual-server-firewall": "Stel jou brandmuur op", + "manual-server-install-paste": "Plak jou installasie-uitset hier.", + "manual-server-install-run": "Meld by jou bediener aan en laat loop hierdie opdrag.", + "manual-server-instructions": "Instruksies", + "manual-server-show-me": "Wys my waar", + "manual-server-title": "Volg die insruksies hieronder", + "metrics-description": "Deel anonieme maatstawwe om te help om Outline se betroubaarheid en werkverrigting beter te maak, vir jou en vir diegene met wie jy jou bediener deel. {openLink}Kom meer te wete.{closeLink}", + "metrics-share": "Deel maatstawwe", + "metrics-skip": "Slaan oor", + "metrics-title": "Maatstafdeling", + "nav-about": "Meer oor", + "nav-data-collection": "Data-insameling", + "nav-feedback": "Terugvoer", + "nav-help": "Hulp", + "nav-licenses": "Lisensies", + "nav-privacy": "Privaatheid", + "nav-terms": "Bepalings", + "no-data-limit": "Geen", + "notification-app-update": "’n Opgedateerde weergawe van Outline Manager is afgelaai. Dit sal geïnstalleer word wanneer jy die app herbegin.", + "notification-feedback-thanks": "Dankie dat jy ons help om beter te word! Ons hoor graag van jou.", + "notification-key-added": "Sleutel bygevoeg", + "notification-key-removed": "Sleutel is verwyder", + "notification-server-destroyed": "Bediener is uitgewis", + "notification-server-exists": "Bediener is reeds bygevoeg", + "notification-server-removed": "Bediener is verwyder", + "oauth-account-active": "Jou DigitalOcean-rekening is geaktiveer.", + "oauth-account-active-tag": "Rekening geaktiveer! Laai tans bedienerliggings …", + "oauth-activate-account": "Aktiveer jou DigitalOcean-rekening.", + "oauth-billing": "Voer jou faktureringinligting op digitalocean.com in en gaan terug na die app wanneer jy klaar is.", + "oauth-billing-tag": "Voer faktureringinligting in …", + "oauth-connect-description": "Met jou rekening maak Outline dit maklik om ’n bediener te skep en te koppel.", + "oauth-connect-tag": "Wag tans om aan jou rekening te koppel …", + "oauth-connect-title": "Meld aan of skep ’n rekening met DigitalOcean.", + "oauth-sign-out": "Meld af", + "oauth-verify": "Kyk in jou inkassie vir ’n e-pos van DigitalOcean af, en klik die skakel daarin om jou rekening te bevestig.", + "oauth-verify-tag": "Bevestig jou e-posadres", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Stel ’n gepasmaakte datalimiet", + "per-key-data-limit-dialog-title": "Datalimiet – {keyName}", + "region-best-value": "Beste waarde", + "region-description": "Dit is waar jou internetervaring vandaan sal kom.", + "region-setup": "Stel Outline op", + "region-title": "Kies die ligging van jou bediener.", + "remove": "Verwyder", + "retry": "Herprobeer", + "save": "Stoor", + "saved": "Gestoor", + "saving": "Stoor tans …", + "server-access": "Bedienertoegang", + "server-access-key-new": "Voeg sleutel by", + "server-access-key-rename": "Hernoem", + "server-access-keys": "Toegangsleutels", + "server-connections": "Verbindings", + "server-data-transfer": "Data oorgedra / afgelope 30 dae", + "server-data-used": "Toekenning gebruik / afgelope 30 dae", + "server-destroy": "Wis bediener uit", + "server-help-access-key-description": "Deel toegangsleutels met vriende sodat hulle aan jou Outline-bediener kan koppel. Hulle kan dieselfde toegangsleutel op al hul toestelle gebruik.", + "server-help-access-key-next": "Volgende", + "server-help-access-key-title": "Skep sleutels en deel toegang", + "server-help-connection-description": "Klik hier om die Outline-kliëntapp met jou persoonlike toegangsleutel op jou Outline-bediener te installeer.", + "server-help-connection-ok": "Goed, het dit!", + "server-help-connection-title": "Jy is nog nie gekoppel nie!", + "server-keys": "Sleutels", + "server-my-access-key": "My toegangsleutel", + "server-name": "Outline-bediener {serverLocation}", + "server-remove": "Verwyder bediener", + "server-settings": "Instellings", + "server-unreachable": "Bediener onbereikbaar", + "server-unreachable-description": "Ons sukkel om aan hierdie bediener te koppel.", + "server-unreachable-managed-description": "Probeer weer of verwyder hierdie bediener van die app.", + "server-unreachable-manual-description": "Probeer weer of wis hierdie bediener en die virtuele gasheer uit.", + "server-usage": "Gebruik (afgelope 30 dae)", + "servers-add": "Voeg bediener by", + "servers-digitalocean": "DigitalOcean-bedieners", + "servers-gcp": "Google Cloud Platform-bedieners", + "servers-manual": "Bedieners", + "settings-access-key-port": "Poort vir nuwe toegangsleutels", + "settings-metrics-header": "Deel anonieme maatstawwe", + "settings-server-api-url": "Management API URL", + "settings-server-cost": "Maandelikse koste", + "settings-server-creation": "Geskep", + "settings-server-hostname": "Gasheernaam", + "settings-server-id": "Bediener-ID", + "settings-server-info": "Bedienerinligting", + "settings-server-location": "Bedienerligging", + "settings-server-name": "Naam", + "settings-server-rename": "Stel ’n nuwe naam vir jou bediener. Let daarop dat dit nie sal wys op die toestelle van die gebruikers wat jy genooi het om daaraan te koppel nie.", + "settings-server-version": "Bedienerweergawe", + "settings-transfer-limit": "Dataoordragtoekenning", + "setup-action": "Stel op", + "setup-advanced": "Gevorderd", + "setup-anywhere": "Stel Outline enige plek op", + "setup-cancel": "Kanselleer enige tyd", + "setup-create": "Skep bediener", + "setup-description": "Het nie ’n bediener nie? Skep ’n rekening met DigitalOcean.", + "setup-do-cost": "Net USD6 per maand", + "setup-do-create": "Skep ’n nuwe bediener met jou DigitalOcean-rekening teen USD6 per 30 dae vir 1 TB se dataoordrag.", + "setup-do-data": "Dataoordragtoekenning van 1 TB", + "setup-do-description": "Dit kan etlike minute neem. Jy kan hierdie bediener enige tyd uitwis.", + "setup-do-easiest": "Maklikste opstellingproses", + "setup-do-title": "Stel tans Outline op.", + "setup-firewall-instructions": "Brandmuurinstruksies", + "setup-gcp-create": "Skep ’n nuwe bediener met jou Google-rekening. Koste wissel volgens ligging en gebruik.", + "setup-gcp-easy": "Maklike opstellingproses", + "setup-gcp-free-tier": "Met {openLinkFreeTier}Free Tier{closeLink} begin jou bedieners by {openLinkIpPrice}USD3/maand{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Gratis proeflopie van 90 dae{closeLink} vir nuwe gebruikers", + "setup-gcp-promo": "Probeer die nuwe outomatiese Outline-bedienerskeppingproses vir Google Wolk", + "setup-recommended": "Aanbeveel", + "setup-simple-commands": "Eenvoudige installeringopdragte", + "setup-step-by-step": "Stap-vir-stap-opstellinggids", + "setup-tested": "Op VULTR, Linode en Liquid Web getoets", + "setup-title": "Kies ’n wolkdiens om Outline op te stel.", + "share-description": "Kopieer hierdie uitnodiging en stuur dit van ’n kommunikasienutsding af wat jy vertrou. {openLink}Het jy hulp nodig?{closeLink}", + "share-invite-access-key-copied": "Toegangsleutel is na knipbord gekopieer", + "share-invite-copied": "Uitnodiging is na knipbord gekopieer", + "share-invite-copy": "Kopieer uitnodiging", + "share-invite-copy-access-key": "Kopieer toegangsleutel", + "share-invite-html": "Gebruik hierdie bediener om veilige toegang tot die oop internet te kry:

1) Laai die Outline-app vir jou toestel af en installeer dit:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android alternative link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Jy sal ’n toegangsleutel kry wat begin met ss://. Wanneer jy dit ontvang, moet jy hierdie toegangsleutel kopieer.

3) Maak die Outline-kliëntapp oop. Wanneer jou toegangsleutel outomaties bespeur is, kan jy op “Koppel” tik en voortgaan. As jou toegangsleutel nie outomaties bespeur is nie, moet jy dit in die veld plak en dan op “Koppel” tik en voortgaan.

Jy is gereed om die oop internet te gebruik! Om seker te maak dat jy wel aan die bediener gekoppel is, kan jy probeer om in Google Search te soek vir “wat is my ip”. Die IP-adres wat in Google gewys word, moet ooreenstem met die IP-adres in die Outline-kliënt.

Kom hier meer te wete oor Outline: https://getoutline.org/", + "share-invite-instructions": "Volg ons uitnodiginginstruksies op GitHub:", + "share-invite-trouble": "Sukkel jy om by die uitnodigingskakel in te kom?", + "share-title": "Deel toegang", + "survey-data-limits-title": "Laat weet ons wat ons kan doen om datalimiete beter te maak", + "survey-decline": "Wys af", + "survey-disclaimer": "As jy “voortgaan” klik, sal jy na ’n kort opname oor Google Vorms geneem word. Ons beveel aan dat jy die opname doen terwyl jy aan Outline gekoppel is.", + "survey-go-to-survey": "Gaan na opname", + "terms-of-service": "Ek het {openLink}Outline se diensbelalings{closeLink} gelees en verstaan dit" +} diff --git a/server_manager/messages/am.json b/server_manager/messages/am.json new file mode 100644 index 0000000000..e2e25b60fa --- /dev/null +++ b/server_manager/messages/am.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline በ Jigsaw የተዘጋጀ ክፍት ምንጭ ፕሮጀክት ሲሆን ለዜና አቅራቢ ድርጅቶችና ጋዜጠኞች ደኅንነቱ የተጠበቀ የኢንተርኔት አጠቃቀምን እንዲያገኙ ታልሞ የተዘጋጀ ነው፡፡

Outline (አውትላይን) በ Shadowsocks የተደገፈ አዲስ ምርት ነው፡፡ በ GitHub ላይ ለፕሮግራሙ አስተዋፅዖ ማድረግ ይችላሉ፡፡ በተጨማሪም Reddit እና Medium ላይ ሊከታተሉን እና መድረካችንን እና አገልግሎቶቻችንን ስናሳድግ መስማት ይችላሉ።", + "about-version": "ሥሪት {version}", + "aws-lightsail-firewall-0": "ወደ {openLink}Amazon Lightsail{closeLink} የአጋጣሚዎች ማያ ገፅ ያስሱ", + "aws-lightsail-firewall-1": "Outlineን ማስተናገድ የሚፈልጉበትን አጋጣሚ ጠቅ ያድርጉ።", + "aws-lightsail-firewall-2": "ወደ 'አውታረመረብ' ('Networking) ትር ያስሱ።", + "aws-lightsail-firewall-3": "የ'ኬላ' (Firewall) ክፍል ውስጥ፣ 'ሌላ አክል' (Add another)ን ጠቅ ያድርጉ።", + "aws-lightsail-firewall-4": "የ'መተግበሪያ' (Application) እሴትን ወደ 'ሁሉም TCP+UDP' ('All TCP+UDP) ያዘጋጁ።", + "aws-lightsail-firewall-5": "'አስቀምጥ' (Save)ን ጠቅ ያድርጉ።", + "cancel": "ሰርዝ", + "close": "ይዝጉ", + "confirmation-server-destroy": "አሁን ያሉት ተጠቃሚዎች መግባት ይከለከላሉ። ይህ ድርጊት መልሶ አይስተካከልም።", + "confirmation-server-destroy-title": "አገልጋዩ ይጥፋ?", + "confirmation-server-remove": "ይህ ተግባር አገልጋዩን ከOutline (አውትላይን) ማስተካከያው ላይ ያስወግደዋል፣ ሆኖም የወኪሉን ተጠቃሚዎች መግባት አይከለክላቸውም። ከአስተናጋጁ ማሽን የOutline (አውትላይን) አገልጋዩን በራስዎ ማጥፋት ግን ይጠበቅብዎታል።", + "confirmation-server-remove-title": "ሰርቨሩ ይወገድ?", + "data-limit": "የውሂብ ገደብ", + "data-limit-per-key": "የውሂብ ገደብ በቁልፍ", + "data-limits": "የውሂብ ገደቦች", + "data-limits-description": "በዚህ አገልጋይ ላይ ለየመዳረሻ ቁልፎች የ30 ቀን የመከታተያ የውሂብ ማስተላለፍ ገደብን ያዘጋጁ።", + "data-limits-dialog-text": "በዚህ አገልጋይ ላይ ለየመዳረሻ ቁልፎች የውሂብ ማስተላለፍ ገደብን ለማዘጋጀት ወደ ቅንብሮች ትር ይሂዱ።", + "data-limits-dialog-title": "የውሂብ ከመጠን በላይ ማለፎችን ያስወግዱ", + "data-limits-disclaimer": "በአሁኑ ጊዜ ሜትሪክሶችን ሪፖርት እያደረጉ ስለሆነ፣ የውሂብ ገደቦች ባህሪን መጠቀም ይካተታል። እባክዎ ለተጨማሪ መረጃ {openLink}የውሂብ አሰባሰብ መመሪያ{closeLink}ን ይመልከቱ።", + "data-limits-usage": "{used} ከ{total} ጥቅም ላይ ውሏል", + "destroy": "ይወገድ", + "digitalocean-disconnect-account": "የዲጂታልኦሽን አካውንቱ ግንኙነት ይቋረጥ", + "digitalocean-unreachable": "ይህ ስህተት የተፈጠረው በአውታረ መረብዎ ፋየርዎል ምክንያት አልያም ከdigitalocean.com ጋር መገናኘት አልቻሉም።", + "disabled": "ተሰናክሏል", + "disconnect": "የእርስዎ ግብረመልስ", + "done": "ተከናውኗል", + "enabled": "ነቅቷል", + "error-connectivity": "ከዲጂታልኦሽን አካውንትዎ ጋር የመገናኘት ችግር ገጥሞናል። ይህ አንዳንዴ የዲጂታልኦሽን ወይም የበይነመረብ ግንኙነትዎ ችግር ሊሆን ይችላል። ደግሞ መሞከር ካልሠራ፣ ዲጂታልኦሸን ውስጥ ደግሞ መግባት ችግሩን ይፈታዋል። ", + "error-connectivity-title": "የግንኙነት ችግር ", + "error-do-account-info": "የዲጂታልኦሽን አካውንት መረጃውን ማግኘት አልተቻለም", + "error-do-auth": "በዲጂታልኦሽን ማረጋገጥ አልተቻለም", + "error-do-limit": "የDigitalOcean መለያዎ የ{num} Droplets ገደቡ ላይ ደርሷል። https://cloud.digitalocean.com/account/team/droplet_limit_increase ላይ ጭማሬ መጠየቅ ይችላሉ", + "error-do-regions": "የሚሠሩትን አካባቢዎች ማግኘት አልተቻለም", + "error-do-warning": "የDigitalOcean ማስጠንቀቂያ፦ «{message}»", + "error-feedback": "ምላሽዎን መላክ አልተቻለም። እባክዎ ደግመው ይሞክሩ። ", + "error-gcp-auth": "በGoogle Cloud Platform ማረጋገጫ አልተሳካም", + "error-hostname-invalid": "የአይፒ አድራሻ ወይም ልክ የሆነ የአስተናጋጅ ስም መሆን አለበት።", + "error-key-add": "ቁልፍ መጨመር አልተቻለም።", + "error-key-remove": "ቁልፍ ማስወገድ አልተቻለም።", + "error-key-rename": "ቁልፍ መልሶ መሠየም አልተቻለም", + "error-keys-get": "ቁልፎቹን ሊጭን አልቻለም", + "error-keys-port-bad-input": "ወደቡ በ1 እና 65,535 መካከል ያለ ድፍን ቁጥር መሆን አለበት።", + "error-keys-port-in-use": "ወደቡ አስቀድሞ በአገልጋዩ ላይ ጥቅም ላይ እየዋለ ነው።", + "error-licenses": "ፈቃድ ሊጭን አልቻለም", + "error-metrics": "የስህተት መለኪያው እየሠራ ነው", + "error-network": "የአውታረ መረብ ስህተት ተከስቷል።", + "error-not-saved": "አልተቀመጠም", + "error-remove-data-limit": "ነባሪ የውሂብ ገደብን ማሰናከል አልተቻለም", + "error-remove-per-key-limit": "ከዚህ የመዳረሻ ቁልፍ የውሂብ ገደብን ማስወገድ አልተቻለም", + "error-server-creation": "Outline (አውትላይን) አገልጋይዎን መፍጠር ላይ ስህተት ተከስቷል።", + "error-server-destroy": "አገልጋዩን ማጥፋት አልተቻለም።", + "error-server-removed": "{serverName} የዲጂታልኦሽን አካውንትዎ ውስጥ የለም።", + "error-server-rename": "አገልጋይዎን መልሶ መሠየም አልተቻለም።", + "error-server-unreachable": "Outline (አውትላይን) አገልጋይዎ በትክክል ተጭኗል። ግን ማገናኘት አልቻልንም። የአገልጋይዎ የፋይርዎል መመሪያዎች እያገዱብን ሊሆን ይችላል። እባክዎ ያስተካክሉትና የቲሲፒ ግንኙነቶች ከ1024 እስከ 65535 እንዲሆን ያድርጉ። ", + "error-server-unreachable-title": "Outline (አውትላይን) አገልጋይዎ ጋር መገናኘት አልተቻለም።", + "error-servers-removed": "{serverNames} ዲጂታልኦሽን አካውንቶ ውስጥ የለም።", + "error-set-data-limit": "ነባሪ የውሂብ ገደብን ማዘጋጀት አልተቻለም", + "error-set-per-key-limit": "ለዚህ የመዳረሻ ቁልፍ የውሂብ ገደብን ማዘጋጀት አልተቻለም", + "error-unexpected": "ያልተጠበቀ ስህተት ተከስቷል።", + "experimental": "የሙከራ", + "experiments": "ሙከራዎች", + "experiments-description": "አዳዲስ ባህሪያትን ይሞክሩ እና ከመለቀቃቸው በፊት ለእኛ ግብረመልስ ይስጡን።", + "experiments-disclaimer": "ሙከራዎች በግንባታ ላይ ናቸው እና ሊቀየሩ ወይም ከመተግበሪያው ሊወገዱ ይችላሉ። በአሁኑ ጊዜ ሜትሪክሶችን ሪፖርት እያደረጉ ከሆነ የሙከራ ባህሪያትን መጠቀም ይካተታል። እባክዎ ለተጨማሪ መረጃ {openLink}የውሂብ አሰባሰብ መመሪያ{closeLink}ን ይመልከቱ።", + "experiments-feedback": "ጥቆማዎች አሉዎት? {openLink}ግብረመልስ እዚህ ያስገቡ።{closeLink}", + "feedback-cloud-provider": "የክላውድ አቅራቢውን ይምረጡ", + "feedback-cloud-provider-error": "እባክዎ የክላውድ አቅራቢውን ይምረጡ", + "feedback-connection": "ከአገልጋዬ ጋር መገናኘት አልቻልኩም፡፡", + "feedback-connection-others": "ሌሎች የእኔን ሰርቨር ሌሎች ማገናኘት አልቻሉም", + "feedback-disclaimer": "እባክዎትን ልብ ይበሉ ቡድናችን በእንግሊዝኛ ለተሰጠ ግብረ-መልስ ብቻ ነው ምላሽ መስጠት የሚችለው።", + "feedback-email": "ኢሜይል (ከፈለጉ ብቻ)", + "feedback-error": "ምላሽዎን ይጻፉ", + "feedback-explanation-install": "Outline (አውትላይን) አገልጋይዎ ላይ ለመጫን ሲሞከር ስህተት ተፈጥሯል። መፍትሔ ማግኘት ካልተቻልዎት እባክዎ ለእኛ ምላሽዎን በመጻፍ እና ኢሜይሎን (ከፈለጉ) በመናገር ተመልሰን እንድናግዝዎ ያድርጉ። ", + "feedback-general": "ጠቅላላ ምላሽ", + "feedback-install": "Outline (አውትላይን) ለመጫን ችግር አጋጥሞኛል", + "feedback-label": "የእርስዎ ግብረ መልስ", + "feedback-management": "አገልጋዬን ለማስተካከል ችግር አጋጠመኝ", + "feedback-other": "ሌላ", + "feedback-privacy": "ግብረ-መልስህ ኢሜይል አድራሻህ (የገባ ከሆነ) እና ተጨማሪ መረጃዎች ወደ {openLink}የግል ምሥጢር ጥበቃ መመሪያ{closeLink} ውስጥ የተጠቀሰው ተጨማሪ መረጃ ወደ Outline (አውትላይን) ቡድን ይላካሉ።", + "feedback-submit": "አስገባ", + "feedback-suggestion": "አስተያየቶች ", + "feedback-title-generic": "ምላሽዎን ይላኩ", + "feedback-title-install": "Outline (አውትላይን) አገልጋይ ጭነቱ ተቋርጧልå", + "gcp-billing-action": "ቀጣይ", + "gcp-billing-body": "{openLink}Google ደመና ላይ የሂሳብ መክፈያ መለያን እስኪያክሉ{closeLink} እርስዎን በመጠበቅ ላይ", + "gcp-billing-description": "{openLink}የደመና ኮንሶል የሂሳብ አከፋፈል ገፅን ይክፈቱ{closeLink} እና ለመቀጠል መለያ ያስገቡ።", + "gcp-billing-error": "የሂሳብ አከፋፈል መረጃን ሰርስሮ ማውጣት አልተቻለም", + "gcp-billing-error-zero": "ከመቀጠልዎ በፊት የሂሳብ መክፈያ መለያን ማከል አለብዎት", + "gcp-click-create": "'ይፍጠሩ' የሚለው ክሊክ ያድርጉ።", + "gcp-create-new-project": "{openLink}አዲስ የGoogle ደመና ፕሮጀክት ይፍጠሩ{closeLink}።", + "gcp-create-new-vm": "{openLink}አዲስ የVM አጋጣሚ ይፍጠሩ{closeLink}።", + "gcp-create-project": "የGoogle ደመና ፕሮጀክት ይፍጠሩ", + "gcp-create-server": "የእርስዎን የGoogle ደመና ፕሮጀክት ይፍጠሩ", + "gcp-create-vm": "የVM አጋጣሚ ይፍጠሩ", + "gcp-disconnect-account": "የGoogle Cloud Platform መለያን ያቋርጡ", + "gcp-firewall-create-0": "የአዲሱን {openLink}የፋየርዎል ደንብ{closeLink} ወደ ኮምፒዩት ኢንጂን ፕሮጀክትዎ ይጨምሩ", + "gcp-firewall-create-1": "'outline'ን የሚለውን በ'ሥም' ('Name') ማስገቢያ ላይ ይጻፉ", + "gcp-firewall-create-2": "'outline'ን 'የሚል በ'ዒላማ ባጅ' ('Target tags') ማስገቢያ ላይ ይጻፉ።", + "gcp-firewall-create-3": "'0.0.0.0/0' የሚለውን 'የምንጪ አይፒ ዝርዝር' ('Source IP ranges) ላይ ይሙሉ።", + "gcp-firewall-create-4": "'በፕሮቶኮልስ እና ፖርትስ' ('Protocols and ports') ሥር 'ሁሉንም ይፍቀዱ' ('Allow all') የሚለውን ይምረጡ።", + "gcp-name-your-project": "'የፕሮጀክት ስም' (Project name) መስክ ውስጥ ለፕሮጀክትዎ ስም ይስጡ።", + "gcp-project-setup-error": "የእርስዎን የGoogle ደመና ፕሮጀክት በማዋቀር ጊዜ ስህተት ተፈጥሯል", + "gcp-select-machine-type": "'የማሽን ዓይነት' (Machine type) ስር 'f1-micro'ን ይምረጡ", + "gcp-select-networking": "'አስተዳደር፣ ደህንነት፣ ዲስኮች፣ አውታረመረብ፣ ብቸኛ ተከራይ' (Management, security, disks, networking, sole tenancy)ን፣ ከዚያ 'አውታረመረብ' (Networking)ን ጠቅ ያድርጉ", + "gcp-select-region": "'ክልል' (Region) ስር የአገልጋዩ ተጠቃሚዎች ሊኖሩ ከሚችሉበት ቅርብ የሆነውን ክልል ይምረጡ።", + "gcp-type-network-tag": "'outline' የሚለውን በ'አውታረ መረብ መለያዎች' ('Network tags') መስክ ውስጥ ይተይቡ", + "gcp-type-outline-server": "በ'ስም' (Name) መስክ ውስጥ 'outline-server'ን ይተይቡ።", + "geo-amsterdam": "አምስተርዳም", + "geo-bangalore": "ባንጋሎር", + "geo-changhua-county": "የቻንጉዋ አውራጃ", + "geo-delhi": "ዴልሂ", + "geo-eemshaven": "ኤምሼቭን", + "geo-frankfurt": "ፍራንክፈርት", + "geo-hamina": "ሃሚና", + "geo-hk": "ሆንግ ኮንግ", + "geo-iowa": "አዮዋ", + "geo-jakarta": "ጃካርታ", + "geo-jurong-west": "ጁሮንግ ዌስት", + "geo-las-vegas": "ላስ ቬጋስ", + "geo-london": "ለንደን", + "geo-los-angeles": "ሎስ አንጀለስ", + "geo-melbourne": "ሜልቦርን", + "geo-montreal": "ሞንትሪያል", + "geo-mumbai": "ሙምባይ", + "geo-new-york-city": "ኒው ዮርክ", + "geo-northern-virginia": "ሰሜን ቨርጂኒያ", + "geo-oregon": "ኦሬጎን", + "geo-osaka": "ኦሳካ", + "geo-salt-lake-city": "ሶልት ሌክ ከተማ", + "geo-san-francisco": "ሳን ፍራንሲስኮ", + "geo-sao-paulo": "ሳዎ ፓውሎ", + "geo-seoul": "ሴውል", + "geo-sg": "ሲንጋፖር", + "geo-south-carolina": "ደቡብ ካሮላይና", + "geo-st-ghislain": "ሴንት ጂስሌን", + "geo-sydney": "ሲድኒ", + "geo-tokyo": "ቶኪዮ", + "geo-toronto": "ቶሮንቶ", + "geo-warsaw": "ዋርሶ", + "geo-zurich": "ዙሪክ", + "key": "ቁልፍ {keyId}", + "manual-server-assign-firewall": "የፋየርዎል መመሪያዎችን ያኑሩ", + "manual-server-assign-group": "የደኅንነት ቡድን ያኑሩ", + "manual-server-create-firewall": "የፋይርዎል መመሪያዎችን ይፍጠሩ", + "manual-server-create-group": "የደኅንነት ቡድን ይፍጠሩ", + "manual-server-description": "እነዚህ ተግባራት Outline (አውትላይን) {cloudProvider} ላይኑክስ አገልጋይ ላይ ለመጫን ይረዱዎታል።", + "manual-server-firewall": "የፋየርዎል ማስተካከያ ያድርጉ", + "manual-server-install-paste": "የቀዱትን የመጫኚያ ውጤት እዚህ ይለጥፉ።", + "manual-server-install-run": "ወደ አገልጋይዎ ይዝለቁ እና ይህንን ትዕዛዝ ይፈፅሙ", + "manual-server-instructions": "ይህንን ግብዣ ይቅዱና ወደሚያምኑት የመገናኛ መሣሪያ ይላኩት። START_OF_LINKእርዳታ ይፈልጋሉ?END_OF_LINK", + "manual-server-show-me": "የት እንደሆነ አሳየኝ", + "manual-server-title": "የሚከተሉትን ትዕዛዛት ይከተሉ", + "metrics-description": "ለእርስዎ እና አገልጋይዎን ለሚያጋሯቸው ሰዎች Outline (አውትላይን) አስተማማኝነት እና አሠራር ለማሻሻል ማንነትዎ የማይታወቅበትን ግምገማዎን ይላኩልን። {openLink}ተጨማሪ ይወቁ።{closeLink}", + "metrics-share": "መለኪያ ያጋሩ", + "metrics-skip": "ዝለል", + "metrics-title": "መለኪያ ማጋሪያ", + "nav-about": "ስለ", + "nav-data-collection": "የውሂብ ስብስብ", + "nav-feedback": "ምላሽ", + "nav-help": "እገዛ", + "nav-licenses": "ፈቃዶች", + "nav-privacy": "ግላዊነት", + "nav-terms": "ውሎች", + "no-data-limit": "ምንም", + "notification-app-update": "Outline (አውትላይን) ማስተካከያ የተሻሻለው ቅፅ ወርዷል። መተግበሪያውን ዘግተው ሲከፍቱት ይጫናል።", + "notification-feedback-thanks": "እንድንሻሻል ስለሚረዱን እናመሰግናለን! አስተያየትዎን መስማት ያስደስታል።", + "notification-key-added": "ቁልፍ ተጨምሯል", + "notification-key-removed": "ቁልፉ ተወግዷል", + "notification-server-destroyed": "አገልጋዩ ተወግዷል", + "notification-server-exists": "አገልጋዩ ተጨምሯል", + "notification-server-removed": "አገልጋዩ ተወግዷል", + "oauth-account-active": "የዲጂታልኦሽን አካውንትዎ ሥራ ጀምሯል", + "oauth-account-active-tag": "አካውንቱ እየሠራ ነው! የአገልጋዩን ቦታዎች እየጫነ ነው...", + "oauth-activate-account": "የዲጂታልኦሽን አካውንትዎን ሥራ ያስጀምሩ", + "oauth-billing": "የክፍያ መረጃዎችዎን digitalocean.com ላይ ያስገቡ። ሲጨርሱ ወደ መተግበሪያው ይመለሱ።", + "oauth-billing-tag": "የክፍያ መረጃዎችዎን ያስገቡ...", + "oauth-connect-description": "በአካውንትዎ፣ Outline (አውትላይን) አገልጋይ ፈጥሮልዎ ከበይነመረብ ጋር መገናኘትን ያቀልልዎታል።", + "oauth-connect-tag": "አካውንትዎን ሊያገናኝልዎ እየጠበቀ ነው...", + "oauth-connect-title": "የዲጂታልኦሽን አካውንትዎን ይግቡ ወይም ይፍጠሩ", + "oauth-sign-out": "ይውጡ", + "oauth-verify": "ከዲጂታልኦሽን የተላከልዎትን ኢሜይል ቼክ ያድርጉ እና የላክንልዎትን ኢሜይል ሊንክ ክሊክ በማድረግ አካውንትዎን መፍጠርዎን ያረጋግጡ።", + "oauth-verify-tag": "ኢሜይሎን ያረጋግጡ", + "okay": "እሺ", + "per-key-data-limit-dialog-set-custom": "ብጁ የውሂብ ገደብን አዘጋጅ", + "per-key-data-limit-dialog-title": "የውሂብ ገደብ - {keyName}", + "region-best-value": "ምርጥ እሴት", + "region-description": "የበይነመረብ ተሞክሮዎ የሚመጣው ከዚህ ነው", + "region-setup": "Outline (አውትላይን) ይጫኑ", + "region-title": "አገልጋዩ ያለበትን ቦታ ይምረጡ", + "remove": "ያስወግዱ ", + "retry": "ደግመው ይሞክሩ", + "save": "አስቀምጥ", + "saved": "ተቀምጧል", + "saving": "በማስቀመጥ ላይ...", + "server-access": "አገልጋዩን መዳረሻ", + "server-access-key-new": "አዲስ ቁልፍ ይጨምሩ", + "server-access-key-rename": "ሥሙን ይቀይሩ", + "server-access-keys": "የመግቢያ ቁልፎች", + "server-connections": "ግንኙነት", + "server-data-transfer": "የተላለፈ ውሂብ / ባለፉት 30 ቀናት", + "server-data-used": "ጥቅም ላይ የዋለው አበል / ባለፉት 30 ቀናት", + "server-destroy": "አገልጋዩን ያጥፉ", + "server-help-access-key-description": "Outline (አውትላይን) አገልጋይዎን እንዲጠቀሙበት የመግቢያ ቁልፎን ከወዳጆችዎ ጋር ይጋሩ። ሁሉም ዲቫይሶቻቸው ላይ ተመሳሳይ የመግቢያ ቁልፍ መጠቀም ይችላሉ። ", + "server-help-access-key-next": "ቀጣይ", + "server-help-access-key-title": "ቁልፍ ይፍጠሩ፣ በጋራ ተጠቀሙ", + "server-help-connection-description": "Outline (አውትላይን) አገልጋይዎ የመግቢያ ቁልፍዎን ተጠቅመው Outline (አውትላይን) ተጠቃሚ መተግበሪያ ለመጫን እዚህ ክሊክ ያድርጉ", + "server-help-connection-ok": "እሺ፣ ገባኝ", + "server-help-connection-title": "ገና የበይነመረብ ግንኙነት የልዎትም", + "server-keys": "ቁልፎች", + "server-my-access-key": "የመግቢያ ቁልፌ", + "server-name": "Outline (አውትላይን) አገልጋይ {serverLocation}", + "server-remove": "አገልጋዩን ያስወግዱ ", + "server-settings": "ማስተካከያ", + "server-unreachable": "አይደረሴ አገልጋይ", + "server-unreachable-description": "ከአገልጋዩ ጋር የመገናኘት ችግር እየገጠመን ነው።", + "server-unreachable-managed-description": "አገልጋዩን ከመተግበሪያው ላይ ለማስወገድ በድጋሚ ይሞክሩ", + "server-unreachable-manual-description": "አገልጋዩን ከዚህ ምናባዊ መድረክ ያስወግዱ ወይም ደግመው ይሞክሩ", + "server-usage": "አጠቃቀም (ባለፉት 30 ቀናት)", + "servers-add": "አገልጋይ አክል", + "servers-digitalocean": "የዲጂታልኦሽን አገልጋይ", + "servers-gcp": "የGoogle Cloud Platform አገልጋዮች", + "servers-manual": "አገልጋዮች", + "settings-access-key-port": "አዲስ የመግቢያ ቁልፍ ማግኛ ", + "settings-metrics-header": "ድብቅ መለኪያ ያጋሩ", + "settings-server-api-url": "ኤፒአይ ዩአርኤል ማስተካከያ", + "settings-server-cost": "የወር ወጪ", + "settings-server-creation": "ተፈጥሯል", + "settings-server-hostname": "የአስተናጋጁ ሥም", + "settings-server-id": "የአገልጋዩ መለያ", + "settings-server-info": "የአገልጋዩ መረጃ", + "settings-server-location": "የአገልጋዩ መገኛ ቦታ", + "settings-server-name": "ሥም", + "settings-server-rename": "ለአገልጋዩ አዲስ ሥም ይምረጡ። ይህ ሥም አገልጋይዎን የሚጋሩት ሰዎች አያዩትም።", + "settings-server-version": "የአገልጋይ ስሪት", + "settings-transfer-limit": "የሚተላለፍ ዳታ አበል", + "setup-action": "ይጫኑ", + "setup-advanced": "የጎለበተ", + "setup-anywhere": "Outline (አውትላይን) የትኛውም ቦታ ይጫኑ", + "setup-cancel": "በፈለጉ ጊዜ ይሰርዙ", + "setup-create": "አገልጋዩን ይፍጠሩ", + "setup-description": "አገልጋይ የልዎትም? የዲጂታልኦሽን አካውንት ይፍጠሩ።", + "setup-do-cost": "በወር 6 የአሜሪካ ዶላር ብቻ", + "setup-do-create": "በተጨማሪ 6 የአሜሪካ ዶላር/30 ቀናት ለ1 TB የውሂብ ዝውውር በDigitalOcean መለያዎ አዲስ አገልጋይ ይፍጠሩ።", + "setup-do-data": "የ1 ቴራ ባይት ዳታ ማስተላለፊያ አበል", + "setup-do-description": "ይህ በርካታ ደቂቃዎች ሊወስድ ይችላል። ይህንን አገልጋይ በማንኛውም ጊዜ ማስወገድ ይችላሉ።", + "setup-do-easiest": "በጣም ቀላሉ የመጫን ሒደት", + "setup-do-title": "Outline (አውትላይን) እየተጫነ ነው።", + "setup-firewall-instructions": "የፋየርዎል ትዕዛዞች", + "setup-gcp-create": "በGoogle መለያዎ አዲስ አገልጋይ ይፍጠሩ። ወጪዎች በአካባቢ እና አጠቃቀም ይለያያሉ።", + "setup-gcp-easy": "ቀላል የማዋቀር ሂደት", + "setup-gcp-free-tier": "በ{openLinkFreeTier}የነፃ መጠቀሚያ{closeLink}፣ የመጀመሪያው አገልጋይዎ ከ{openLinkIpPrice}የአሜሪካ$3/ወር{closeLink} ይጀምራል", + "setup-gcp-free-trial": "{openLinkFreeTrial}የ90 ቀን ነፃ ሙከራ{closeLink} ለአዲስ ተጠቃሚዎች", + "setup-gcp-promo": "አዲሱን ራስ-ሰር የOutline አገልጋይ ፈጠራ ሂደት ለGoogle ደመና ይሞክሩ", + "setup-recommended": "ተመራጭ", + "setup-simple-commands": "ቀላል የመጫኛ ትዕዛዛት", + "setup-step-by-step": "ደረጃ በደረጃ የመጫኛ መመሪያ", + "setup-tested": "ቩልትር፣ ሊኖድ እና ሊኪዩድ ገጾች ላይ የተሞከረ", + "setup-title": "Outline (አውትላይን) ለመጫን ክላውድ አገልግሎት ይምረጡ", + "share-description": "ይህንን ግብዣ ይቅዱ እና ከሚያምኑት የመገናኛ መሣሪያ ላይ ይላኩት። {openLink}እገዛ ይፈልጋሉ?{closeLink}", + "share-invite-access-key-copied": "የመዳረሻ ቁልፍ ወደ ቅንጥብ ሰሌዳ ተቀድቷል", + "share-invite-copied": "ግብዣ ወደ ቅንጥብ ሰሌዳ ተቀድቷል", + "share-invite-copy": "ግብዣውን ይቅዱ", + "share-invite-copy-access-key": "የመዳረሻ ቁልፍን ቅዳ", + "share-invite-html": "ክፍት በይነመረቡን ደህንነቱ በተጠበቀ ሁኔታ ለመድረስ ይህንን አገልጋይ ይጠቀሙ፦

1) ለመሣሪያዎ የOutline መተግበሪያን ያውርዱ እና ይጫኑ፦

- iOS፦ https://itunes.apple.com/app/outline-app/id1356177741
- MacOS፦ https://itunes.apple.com/app/outline-app/id1356178125
- Windows፦ https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux፦ https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android፦ https://play.google.com/store/apps/details?id=org.outline.android.client
- የAndroid አማራጭ አገናኝ፦ https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) በss:// የሚጀምር የመዳረሻ ቁልፍ ይቀበላሉ። አንዴ እሱን ከተቀበሉ በኋላ ይህን የመዳረሻ ቁልፍ ይቅዱ።

3) የOutline ደንበኛ መተግበሪያን ይክፈቱ። የመዳረሻ ቁልፍዎ በራስ-ሰር ተለይቶ የሚታወቅ ከሆነ «አገናኝ»ን መታ ያድርጉ እና ይቀጥሉ። የመዳረሻ ቁልፍዎ በራስ-ሰር ተለይቶ የሚታወቅ ካልሆነ መስኩ ላይ ይለጥፉት፣ ከዚያ «አገናኝ»ን መታ ያድርጉ እና ይቀጥሉ።

ክፍት በይነመረቡን ለመጠቀም ዝግጁ ነዎት! በተሳካ ሁኔታ ከአገልጋዩ ጋር መገናኘትዎን ለማረጋገጥ በGoogle ፍለጋ ላይ «የእኔ አይፒ ምንድን ነው» የሚለውን ለመፈለግ ይሞክሩ። በGoogle ላይ የታየው የአይፒ አድራሻ በOutline ደንበኛ ላይ ካለው አይፒ አድራሻ ጋር መዛመድ አለበት።

ስለOutline እዚህ የበለጠ ይወቁ፦ https://getoutline.org/", + "share-invite-instructions": "ጊትኸብ ላይ ያለውን የግብዣ ትዕዛዞች ይከተሉ", + "share-invite-trouble": "የግብዛ መገናኛውን ለማግኘት ችግር ገጠምዎት?", + "share-title": "መግቢያዎን ያጋሩ", + "survey-data-limits-title": "የውሂብ ገደቦችን እንዴት ማሻሻል እንደሚቻል እንድንረዳ ያግዙን", + "survey-decline": "አትቀበል", + "survey-disclaimer": "ቀጥል የሚለውን ጠቅ በማድረግ Google ቅጾች ላይ ወዳለ አጭር የዳሰሳ ጥናት ይላካሉ። ከOutline ጋር እንደተገናኙ የዳሰሳ ጥናቱን እንዲወስዱ እንመክራለን።", + "survey-go-to-survey": "ወደ የዳሰሳ ጥናት ሂድ", + "terms-of-service": "የ{openLink}Outline (አውትላይን) መመሪያዎችን አንብቤ ተረድቻለሁ{closeLink}" +} diff --git a/server_manager/messages/ar.json b/server_manager/messages/ar.json new file mode 100644 index 0000000000..ae7e246473 --- /dev/null +++ b/server_manager/messages/ar.json @@ -0,0 +1,275 @@ +{ + "about-outline": "تطبيق Outline هو أحد مشروعات البرامج مفتوحة المصدر التي تم إنشاؤها بواسطة Jigsaw حتى تتمكّن المؤسسات الإخبارية والصحفيون من الاتصال بالإنترنت بطريقة أكثر أمانًا.

يتمتع تطبيق Outline بدعم من مشروع Shadowsocks وهو ما زال منتجًا في طور النشوء. يمكنك المساهمة في عملية الترميز على موقع GitHub ومتابعتنا على Reddit وMedium لمعرفة آخر أخبارنا المتعلّقة بإتاحته على المزيد من الأنظمة الأساسية أو إضافة ميزات جديدة.", + "about-version": "الإصدار {version}", + "aws-lightsail-firewall-0": "انتقِل إلى شاشة مثيلات {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "انقر على المثيل الذي تريد استضافة Outline فيه.", + "aws-lightsail-firewall-2": "انتقِل إلى علامة التبويب \"الاتصال بالشبكات\" (Networking).", + "aws-lightsail-firewall-3": "في قسم \"جدار الحماية\" (Firewall)، انقر على \"إضافة قاعدة أخرى\" (Add another).", + "aws-lightsail-firewall-4": "اضبط قيمة \"التطبيق\" (Application) على \"كل TCP+UDP\"‏ (All TCP+UDP).", + "aws-lightsail-firewall-5": "انقر على \"حفظ\" (Save).", + "cancel": "إلغاء", + "close": "إغلاق", + "confirmation-server-destroy": "سيفقد المستخدمون الحاليون القدرة على الوصول. لا يمكن التراجع عن هذا الإجراء.", + "confirmation-server-destroy-title": "هل تريد إزالة الخادم؟", + "confirmation-server-remove": "يؤدي هذا الإجراء إلى إزالة خادمك من \"مدير Outline\" ولكنه لا يحظر وصول الخادم الوكيل للمستخدمين. ستظل بحاجة إلى حذف خادم Outline يدويًا من جهازك المضيف.", + "confirmation-server-remove-title": "هل تريد إزالة الخادم؟", + "data-limit": "الحد الأقصى للبيانات", + "data-limit-per-key": "الحد الأقصى للبيانات لكل مفتاح", + "data-limits": "الحدود القصوى للبيانات", + "data-limits-description": "يمكنك اختيار حد أقصى لاستخدام نقل بيانات مفاتيح الوصول تصل مدته إلى 30 يومًا على هذا الخادم.", + "data-limits-dialog-text": "يُرجى الانتقال إلى علامة تبويب \"الإعدادات\" لاختيار حد أقصى لنقل البيانات لمفاتيح الوصول على هذا الخادم.", + "data-limits-dialog-title": "تجنُّب تجاوز حدود البيانات", + "data-limits-disclaimer": "نظرًا لأنك ترسل تقارير عن المقاييس حاليًا، سيتم إدراج ميزة الحد الأقصى للبيانات. يُرجى الرجوع إلى {openLink}سياسة جمع البيانات{closeLink} لمزيد من التفاصيل.", + "data-limits-usage": "تم استخدام {used} من إجمالي {total}.", + "destroy": "إزالة", + "digitalocean-disconnect-account": "قطع الاتصال بحساب DigitalOcean", + "digitalocean-unreachable": "قد يرجع السبب في حدوث هذا الخطأ إلى وجود جدار ناري على شبكتك أو حدوث مشاكل مؤقتة عند الاتصال بالرابط digitalocean.com.", + "disabled": "متوقفة", + "disconnect": "قطع الاتصال", + "done": "تم", + "enabled": "مفعَّلة", + "error-connectivity": "نواجه مشكلة في ربط جهازك بحسابك على DigitalOcean. في بعض الأحيان، تكون مشكلة مؤقتة في DigitalOcean أو في اتصالك بالإنترنت. إذا لم تنجح إعادة محاولة ربط جهازك، قد يؤدي تسجيل الدخول إلى DigitalOcean مجددًا إلى حل المشكلة.", + "error-connectivity-title": "توجد مشكلة في الاتصال", + "error-do-account-info": "تعذَّر الحصول على معلومات حساب DigitalOcean", + "error-do-auth": "تعذّرت المصادقة باستخدام DigitalOcean", + "error-do-limit": "وصل حسابك على DigitalOcean إلى الحدّ الأقصى المسموح به وهو إنشاء {num} خادم Droplet. يمكنك طلب زيادة هذا الحدّ الأقصى على الرابط https://cloud.digitalocean.com/account/team/droplet_limit_increase.", + "error-do-regions": "تعذَّر الحصول على قائمة بالمناطق المتاحة", + "error-do-warning": "تحذير من DigitalOcean: \"{message}\"", + "error-feedback": "تعذَّر إرسال التعليقات. يُرجى إعادة المحاولة.", + "error-gcp-auth": "تعذَّرت المصادقة باستخدام Google Cloud Platform.", + "error-hostname-invalid": "يجب إدخال عنوان IP أو اسم مضيف صالح.", + "error-key-add": "تعذّرت إضافة مفتاح", + "error-key-remove": "تعذّرت إزالة المفتاح", + "error-key-rename": "تعذّرت إعادة تسمية المفتاح", + "error-keys-get": "تعذَّر تحميل المفاتيح", + "error-keys-port-bad-input": "يجب أن يكون رقم المنفذ عددًا صحيحًا يقع بين 1 و65535.", + "error-keys-port-in-use": "المنفذ قيد الاستخدام بالفعل على الخادم.", + "error-licenses": "تعذَّر تحميل التراخيص.", + "error-metrics": "حدث خطأ أثناء ضبط تفعيل مقاييس الخادم", + "error-network": "حدث خطأ في الشبكة.", + "error-not-saved": "لم يتم الحفظ", + "error-remove-data-limit": "تعذَّر إيقاف الحد الأقصى التلقائي للبيانات.", + "error-remove-per-key-limit": "تعذَّرت إزالة الحد الأقصى للبيانات من مفتاح الوصول الحالي.", + "error-server-creation": "حدث خطأ أثناء إنشاء خادمك على Outline.", + "error-server-destroy": "تعذّرت إزالة الخادم", + "error-server-removed": "لم يعُد {serverName} موجودًا في حسابك على DigitalOcean.", + "error-server-rename": "تعذّرت إعادة تسمية الخادم", + "error-server-unreachable": "تم تثبيت خادمك على Outline بشكل صحيح ولكننا لا نستطيع الاتصال به. يعود السبب في هذه المشكلة على الأرجح إلى أن قواعد الجدار الناري لخادمك تحظر الاتصالات الواردة. يُرجى مراجعة هذه القواعد والتأكّد من السماح باتصالات TCP الواردة على منافذ تتراوح من 1024 إلى 65535.", + "error-server-unreachable-title": "يتعذّر الاتصال بخادمك على Outline", + "error-servers-removed": "لم تعُد {serverNames} موجودة في حسابك على DigitalOcean.", + "error-set-data-limit": "تعذَّر ضبط الحد الأقصى التلقائي للبيانات.", + "error-set-per-key-limit": "تعذَّر ضبط حد أقصى للبيانات لمفتاح الوصول الحالي.", + "error-unexpected": "حدث خطأ غير متوقَّع.", + "experimental": "ميزة تجريبية", + "experiments": "الميزات التجريبية", + "experiments-description": "يُرجى اختبار الميزات الجديدة وإرسال تعليقاتك قبل صدورها.", + "experiments-disclaimer": "الميزات التجريبية قيد التطوير حاليًا وقد تتغير أو تتم إزالتها من التطبيق. في حال إعداد تقارير تتضمن مقاييس الاستخدام حاليًا، سيتم تضمين استخدام الميزات التجريبية في هذه التقارير. يُرجى الرجوع إلى {openLink}سياسة جمع البيانات{closeLink} لمزيد من التفاصيل.", + "experiments-feedback": "هل لديك اقتراحات؟ {openLink}أرسِل تعليقاتك هنا.{closeLink}", + "feedback-cloud-provider": "اختَر مقدّم الخدمات السحابية", + "feedback-cloud-provider-error": "يُرجى اختيار مقدّم خدمات سحابية.", + "feedback-connection": "لا يمكنني الاتصال بخادمي", + "feedback-connection-others": "لا يمكن للمستخدمين الآخرين الاتصال بخادمي", + "feedback-disclaimer": "يُرجى ملاحظة أنّ فريقنا لن يستطيع الرد إلا على الملاحظات المكتوبة باللغة الإنجليزية.", + "feedback-email": "عنوان البريد الإلكتروني (اختياري)", + "feedback-error": "يُرجى إدخال التعليقات", + "feedback-explanation-install": "حدث خطأ أثناء محاولة تثبيت Outline على خادمك. إذا لم تتمكّن من إيجاد حل، يُرجى إرسال تعليقك إلينا وإخبارنا بعنوان بريدك الإلكتروني (اختياري) حتى نتمكّن من الرد عليك.", + "feedback-general": "تعليقات عامة", + "feedback-install": "أواجه مشكلة في تثبيت Outline", + "feedback-label": "تعليقاتك", + "feedback-management": "أواجه مشكلة في إدارة خادمي", + "feedback-other": "مقدّم خدمات سحابية آخر", + "feedback-privacy": "سيتم إرسال تعليقاتك وعنوان بريدك الإلكتروني (في حال تقديمه) والمعلومات الإضافية المُشار إليها في {openLink}سياسة الخصوصية{closeLink} إلى فريق عمل Outline.", + "feedback-submit": "إرسال", + "feedback-suggestion": "اقتراحات", + "feedback-title-generic": "إرسال ملاحظات", + "feedback-title-install": "تعذَّر تثبيت خادم Outline", + "gcp-billing-action": "التالي", + "gcp-billing-body": "نحن في انتظار {openLink}إضافة حساب فوترة على Google Cloud{closeLink}.", + "gcp-billing-description": "{openLink}افتح صفحة الفوترة على Cloud Console{closeLink} وأضِف حسابًا للمتابعة.", + "gcp-billing-error": "يتعذّر استرداد معلومات الفوترة.", + "gcp-billing-error-zero": "يجب عليك إضافة حساب فوترة قبل المتابعة.", + "gcp-click-create": "انقر على \"إنشاء\" (Create).", + "gcp-create-new-project": "{openLink}إنشاء مشروع جديد على Google Cloud{closeLink}", + "gcp-create-new-vm": "{openLink}إنشاء مثيل جهاز افتراضي (VM) جديد{closeLink}", + "gcp-create-project": "إنشاء مشروع على Google Cloud", + "gcp-create-server": "إنشاء مشروعك على Google Cloud", + "gcp-create-vm": "إنشاء مثيل جهاز افتراضي (VM)", + "gcp-disconnect-account": "فصل حساب Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}أضِف قاعدة جديدة لجدارك الناري{closeLink} إلى مشروعك على Compute Engine.", + "gcp-firewall-create-1": "اكتب Outline في حقل \"الاسم\" (Name).", + "gcp-firewall-create-2": "اكتب Outline في حقل \"العلامات المستهدفة\" (Target tags).", + "gcp-firewall-create-3": "اكتب 0.0.0.0/0 في حقل \"نطاقات عنوان IP المصدر\" (Source IP ranges).", + "gcp-firewall-create-4": "اختَر \"السماح بالكل\" (Allow all) ضمن \"البروتوكولات والمنافذ\" (Protocols and ports).", + "gcp-name-your-project": "ضع اسمًا لمشروعك في حقل \"اسم المشروع\" (Project name).", + "gcp-project-setup-error": "حدث خطأ أثناء إعداد مشروعك على Google Cloud.", + "gcp-select-machine-type": "اختَر f1-micro ضمن \"نوع الجهاز\" (Machine type).", + "gcp-select-networking": "انقر على \"الإدارة والأمان والأقراص والاتصال بالشبكات والإيجار المستقلّ\" (Management, security, disks, networking, sole tenancy)، ثم على \"الاتصال بالشبكات\" (Networking).", + "gcp-select-region": "اختَر منطقة قريبة من المكان الذي سيكون فيه مستخدمو الخادم ضمن \"المنطقة\" (Region).", + "gcp-type-network-tag": "اكتب Outline في حقل \"علامات الشبكة\" (Network tags).", + "gcp-type-outline-server": "اكتب outline-server في حقل \"الاسم\" (Name).", + "geo-amsterdam": "أمستردام", + "geo-bangalore": "بنغالور", + "geo-changhua-county": "مقاطعة تشانغوا", + "geo-delhi": "دلهي", + "geo-eemshaven": "إيمشافن", + "geo-frankfurt": "فرانكفورت", + "geo-hamina": "هامينا", + "geo-hk": "هونغ كونغ", + "geo-iowa": "أيوا", + "geo-jakarta": "جاکارتا", + "geo-jurong-west": "جورونج الغربية", + "geo-las-vegas": "لاس فيغاس", + "geo-london": "لندن", + "geo-los-angeles": "لوس أنجلوس", + "geo-melbourne": "ميلبورن", + "geo-montreal": "مونتريال", + "geo-mumbai": "مومباي", + "geo-new-york-city": "نيويورك", + "geo-northern-virginia": "فيرجينيا الشمالية", + "geo-oregon": "أوريغون", + "geo-osaka": "أوساكا", + "geo-salt-lake-city": "سولت ليك سيتي", + "geo-san-francisco": "سان فرانسيسكو", + "geo-sao-paulo": "ساو باولو", + "geo-seoul": "سئول", + "geo-sg": "سنغافورة", + "geo-south-carolina": "كارولاينا الجنوبية", + "geo-st-ghislain": "سانت جيسلين", + "geo-sydney": "سيدني", + "geo-tokyo": "طوكيو", + "geo-toronto": "تورونتو", + "geo-warsaw": "وارسو", + "geo-zurich": "زيوريخ", + "key": "المفتاح {keyId}", + "manual-server-assign-firewall": "تخصيص قاعدة للجدار الناري", + "manual-server-assign-group": "تخصيص مجموعة أمان", + "manual-server-create-firewall": "إنشاء قاعدة جدار ناري", + "manual-server-create-group": "إنشاء مجموعة أمان", + "manual-server-description": "ستساعدك هذه الخطوات على تثبيت Outline على خادم Linux على {cloudProvider}.", + "manual-server-firewall": "ضبط جدارك الناري", + "manual-server-install-paste": "الصق مخرجات عملية التثبيت التي نفّذتها هنا.", + "manual-server-install-run": "سجِّل الدخول إلى خادمك ونفِّذ هذا الأمر.", + "manual-server-instructions": "التعليمات", + "manual-server-show-me": "عرض الموقع الجغرافي", + "manual-server-title": "اتّباع التعليمات الواردة بالأسفل", + "metrics-description": "شارك مقاييس مجهولة المصدر للمساعدة في تحسين موثوقية Outline وأدائه لأجلك ولأجل هؤلاء الذين تشارك خادمك معهم. {openLink}تعرّف على المزيد من المعلومات.{closeLink}", + "metrics-share": "مشاركة المقاييس", + "metrics-skip": "التخطّي", + "metrics-title": "مشاركة المقاييس", + "nav-about": "لمحة", + "nav-data-collection": "جمع البيانات", + "nav-feedback": "تعليقات", + "nav-help": "مساعدة", + "nav-licenses": "التراخيص", + "nav-privacy": "الخصوصية", + "nav-terms": "البنود", + "no-data-limit": "لا شيء", + "notification-app-update": "تم تنزيل إصدار محدَّث من تطبيق \"مدير Outline\". سيتم تثبيته عند إعادة فتح التطبيق.", + "notification-feedback-thanks": "شكرًا لك على مساعدتنا على التحسّن. يُسعدنا التواصل معك.", + "notification-key-added": "تمت إضافة مفتاح", + "notification-key-removed": "تمت إزالة المفتاح", + "notification-server-destroyed": "تمت إزالة الخادم", + "notification-server-exists": "تمت إضافة الخادم من قبل", + "notification-server-removed": "تمت إزالة الخادم", + "oauth-account-active": "لقد تم تفعيل حسابك على DigitalOcean.", + "oauth-account-active-tag": "تم تفعيل الحساب. جارٍ تحميل المواقع الجغرافية للخوادم…", + "oauth-activate-account": "تفعيل حسابك على DigitalOcean", + "oauth-billing": "أدخل معلومات الفوترة على digitalocean.com وارجع إلى التطبيق بمجرد أن تنتهي.", + "oauth-billing-tag": "أدخِل معلومات الفوترة...", + "oauth-connect-description": "يسهّل Outline عليك عملية إنشاء خادم والاتصال به باستخدام حسابك.", + "oauth-connect-tag": "بانتظار الاتصال بحسابك…", + "oauth-connect-title": "سجِّل دخولك إلى DigitalOcean أو أنشِئ حسابًا عليه.", + "oauth-sign-out": "تسجيل الخروج", + "oauth-verify": "تحقّق من بريدك الوارد بحثًا عن رسالة إلكترونية من DigitalOcean وانقر على الرابط الموجود فيها لتأكيد حسابك.", + "oauth-verify-tag": "أكِّد عنوان بريدك الإلكتروني...", + "okay": "حسنًا", + "per-key-data-limit-dialog-set-custom": "ضبط حد أقصى مخصّص للبيانات", + "per-key-data-limit-dialog-title": "الحد الأقصى للبيانات - {keyName}", + "region-best-value": "أفضل قيمة", + "region-description": "هذا هو الموقع الجغرافي لتجربة الاتصال بالإنترنت.", + "region-setup": "إعداد Outline", + "region-title": "اختَر الموقع الجغرافي لخادمك.", + "remove": "إزالة", + "retry": "إعادة المحاولة", + "save": "حفظ", + "saved": "تم الحفظ", + "saving": "جارٍ الحفظ…", + "server-access": "الوصول إلى الخادم", + "server-access-key-new": "إضافة مفتاح جديد", + "server-access-key-rename": "إعادة تسمية", + "server-access-keys": "مفاتيح الوصول", + "server-connections": "معلومات الاتصال", + "server-data-transfer": "مقدار البيانات المنقولة / آخر 30 يومًا", + "server-data-used": "معدّل نقل البيانات / آخر 30 يومًا", + "server-destroy": "إزالة الخادم", + "server-help-access-key-description": "يمكنك مشاركة مفاتيح الوصول مع الأصدقاء حتى يتمكّنوا من الاتصال بخادمك على Outline. يمكنهم استخدام نفس مفتاح الوصول على جميع أجهزتهم.", + "server-help-access-key-next": "التالي", + "server-help-access-key-title": "إنشاء المفاتيح ومشاركة الوصول", + "server-help-connection-description": "انقر هنا لتثبيت تطبيق عميل Outline باستخدام مفتاح وصولك الشخصي إلى خادم Outline.", + "server-help-connection-ok": "حسنًا.", + "server-help-connection-title": "لم تتصل بالخادم بعد!", + "server-keys": "المفاتيح", + "server-my-access-key": "مفتاح وصولي", + "server-name": "خادم Outline في {serverLocation}", + "server-remove": "إزالة الخادم", + "server-settings": "الإعدادات", + "server-unreachable": "يتعذّر الوصول إلى الخادم", + "server-unreachable-description": "نواجه مشاكل في الاتصال بهذا الخادم.", + "server-unreachable-managed-description": "حاول مجددًا أو أزل هذا الخادم من التطبيق.", + "server-unreachable-manual-description": "حاول مجددًا أو أزل هذا الخادم والمضيف الافتراضي.", + "server-usage": "الاستخدام (آخر 30 يومًا)", + "servers-add": "إضافة خادم", + "servers-digitalocean": "خوادم DigitalOcean", + "servers-gcp": "خوادم Google Cloud Platform", + "servers-manual": "الخوادم", + "settings-access-key-port": "منفَذ مفاتيح الوصول الجديدة", + "settings-metrics-header": "مشاركة مقاييس مجهولة المصدر", + "settings-server-api-url": "عنوان URL لواجهة برمجة تطبيقات الإدارة", + "settings-server-cost": "التكلفة الشهرية", + "settings-server-creation": "تاريخ الإنشاء", + "settings-server-hostname": "اسم المضيف", + "settings-server-id": "رقم تعريف الخادم", + "settings-server-info": "معلومات الخادم", + "settings-server-location": "الموقع الجغرافي للخادم", + "settings-server-name": "الاسم", + "settings-server-rename": "حدد اسمًا جديدًا لخادمك. لاحظ أن هذا الإجراء لن ينعكس على أجهزة المستخدمين الذين دعوتهم للاتصال بذلك الخادم.", + "settings-server-version": "إصدار الخادم", + "settings-transfer-limit": "معدّل نقل البيانات", + "setup-action": "إعداد", + "setup-advanced": "الإعدادات المتقدّمة", + "setup-anywhere": "إعداد Outline في أي مكان", + "setup-cancel": "الإلغاء في أي وقت", + "setup-create": "إنشاء خادم", + "setup-description": "ألا تمتلك خادمًا؟ أنشِئ حسابًا باستخدام DigitalOcean.", + "setup-do-cost": "6 دولارات أمريكية فقط في الشهر", + "setup-do-create": "أنشِئ خادمًا جديدًا باستخدام حسابك على DigitalOcean مقابل 6 دولارات أمريكية إضافية/30 يومًا لنقل بيانات تبلغ 1 تيرابايت.", + "setup-do-data": "معدّل نقل بيانات يصل إلى 1 تيرابايت", + "setup-do-description": "قد يستغرق تنفيذ هذا الإجراء بعض الوقت. يمكنك إزالة هذا الخادم في أي وقت.", + "setup-do-easiest": "أسهل عملية إعداد", + "setup-do-title": "إعداد تطبيق Outline", + "setup-firewall-instructions": "تعليمات الجدار الناري", + "setup-gcp-create": "أنشِئ خادمًا جديدًا باستخدام حسابك على Google. تختلف التكاليف باختلاف الموقع الجغرافي ومعدّل الاستخدام.", + "setup-gcp-easy": "عملية إعداد سهلة", + "setup-gcp-free-tier": "باستخدام {openLinkFreeTier}المستوى المجاني{closeLink}، تبدأ أسعار خادم الأول عند {openLinkIpPrice}3 دولارات في الشهر{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}فترة تجريبية مجانية لمدة 90 يومًا{closeLink} للمستخدمين الجدد", + "setup-gcp-promo": "جرِّب العملية التلقائية الجديدة لإنشاء خادم Outline لـ Google Cloud.", + "setup-recommended": "مستحسن", + "setup-simple-commands": "أوامر تثبيت بسيطة", + "setup-step-by-step": "دليل الإعداد التفصيلي", + "setup-tested": "تم الاختبار على VULTR وLinode وLiquid Web", + "setup-title": "اختَر خدمة سحابية لإعداد Outline.", + "share-description": "انسخ هذه الدعوة وأرسِلها من أداة اتصال تثق فيها. {openLink}هل تحتاج إلى مساعدة؟{closeLink}", + "share-invite-access-key-copied": "تم نسخ مفتاح الوصول إلى الحافظة.", + "share-invite-copied": "تم نسخ الدعوة إلى الحافظة.", + "share-invite-copy": "نسخ الدعوة", + "share-invite-copy-access-key": "نسخ مفتاح الوصول", + "share-invite-html": "يمكنك استخدام هذا الخادم للوصول إلى الإنترنت المفتوح بأمان من خلال تنفيذ ما يلي:

1) نزِّل تطبيق Outline وثبِّته على جهازك:

- أجهزة iOS‏: https://itunes.apple.com/app/outline-app/id1356177741
- أجهزة MacOS‏: https://itunes.apple.com/app/outline-app/id1356178125
- أجهزة Windows‏: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- أجهزة Linux‏: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- أجهزة Android‏: https://play.google.com/store/apps/details?id=org.outline.android.client
- الرابط البديل للتنزيل على أجهزة Android‏: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

‏2) ستتلقّى مفتاح وصول يبدأ بـ ss://‎. وبعد تلقّي مفتاح الوصول هذا، انسخه.

3) افتح تطبيق \"عميل Outline\". وإذا تم رصد مفتاح الوصول تلقائيًا، انقر على \"ربط\" وانتقِل إلى الخطوة التالية. أما إذا لم يتم رصد مفتاح الوصول الخاص بك تلقائيًا، فالصقه في الحقل ثم انقر على \"ربط\" وانتقِل إلى الخطوة التالية.

أصبح بإمكانك الآن استخدام الإنترنت المفتوح. للتأكد من أنّه تم الاتصال بالخادم بنجاح، جرِّب البحث باستخدام عبارة \"ما هو عنوان IP الخاص بي\" على \"بحث Google\". يجب أن يتطابق عنوان IP المعروض في Google مع عنوان IP المعروض في \"عميل Outline\".

مزيد من المعلومات عن Outline هنا: https://getoutline.org/", + "share-invite-instructions": "اتّبع تعليماتنا لإرسال الدعوات على GitHub:", + "share-invite-trouble": "هل تواجه مشاكل في الوصول إلى رابط الدعوة؟", + "share-title": "مشاركة الوصول", + "survey-data-limits-title": "ساعدنا على معرفة طرق تحسين الحدود القصوى للبيانات", + "survey-decline": "رفض", + "survey-disclaimer": "من خلال النقر على \"متابعة\"، سيتم نقلك إلى استطلاع قصير حول \"نماذج Google\". ننصحك بالإجابة على أسئلة الاستطلاع أثناء ربط خادمك بتطبيق Outline.", + "survey-go-to-survey": "الانتقال إلى الاستطلاع", + "terms-of-service": "لقد قرأت {openLink}بنود خدمة Outline{closeLink} وفهمتها" +} diff --git a/server_manager/messages/az.json b/server_manager/messages/az.json new file mode 100644 index 0000000000..261a53cb2e --- /dev/null +++ b/server_manager/messages/az.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline xəbər təşkilatları və jurnalistlərə internetə daha təhlükəsiz giriş təmin etmək üçün Jigsaw tərəfindən yaradılan açıq mənbə layihəsidir.

Outline Shadowsocks tərəfindən hazırlanıb və hələ ilkin mərhələ məhsuludur. GitHub ünvanında koda töhfə verə, həmçinin tətbiq daha çox platforma üzrə genişləndirildikdə və yeni funksiyalar əlavə edildikdə xəbərdar olmaq üçün bizi RedditMedium ünvanlarında izləyə bilərsiniz.", + "about-version": "{version} versiyası", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} nümunələri ekranına keçin.", + "aws-lightsail-firewall-1": "Outline'ı yerləşdirmək istədiyiniz nümunəyə klikləyin.", + "aws-lightsail-firewall-2": "\"Şəbəkə\" (Networking) tabına keçin.", + "aws-lightsail-firewall-3": "\"Təhlükəsizlik divarı\" ('Firewall) bölməsində \"Başqasını əlavə edin\" (Add another) düyməsinə klikləyin.", + "aws-lightsail-firewall-4": "\"Tətbiq\" (Application) qiymətini \"Bütün TCP+UDP\" (All TCP+UDP) olaraq ayarlayın.", + "aws-lightsail-firewall-5": "\"Yadda saxlayın\" düyməsinə klikləyin.", + "cancel": "Ləğv edin", + "close": "Bağlayın", + "confirmation-server-destroy": "Mövcud istifadəçilər giriş imkanını itirəcək. Bu əməliyyat geri qaytarıla bilməz.", + "confirmation-server-destroy-title": "Server silinsin?", + "confirmation-server-remove": "Bu əməliyyat serverinizi Outline Manager'dən silir, lakin istifadəçilər üçün proksi girişini blok etmir. Yenə də Outline serverini host cihazınızdan manual olaraq silməli olacaqsınız.", + "confirmation-server-remove-title": "Server silinsin?", + "data-limit": "Trafik limiti", + "data-limit-per-key": "Açar üzrə data limiti", + "data-limits": "Data limiti", + "data-limits-description": "Bu serverdəki giriş açarları üçün 30 günlük izlənən data köçürülməsi limiti təyin edin.", + "data-limits-dialog-text": "Bu serverdəki giriş açarları üçün data köçürülməsi limitini təyin etmək üçün Ayarlar bölməsinə keçin.", + "data-limits-dialog-title": "Artıq data istifadəsindən yayının", + "data-limits-disclaimer": "Hazırda göstəricilərlə bağlı hesabat hazırladığınız üçün data limitləri funksiyasından istifadə daxil ediləcək. Ətraflı məlumat üçün {openLink}data toplama siyasətinə{closeLink} baxın.", + "data-limits-usage": "{used}/{total} istifadə edilib", + "destroy": "Silin", + "digitalocean-disconnect-account": "DigitalOcean hesabının bağlantısını kəsin", + "digitalocean-unreachable": "Bu xəta şəbəkənizdəki qoruyucu divar və ya digitalocean.com saytı ilə müvəqqəti bağlantı problemləri səbəbindən ola bilər.", + "disabled": "Deaktiv", + "disconnect": "Bağlantını kəsin", + "done": "Hazırdır", + "enabled": "Aktiv", + "error-connectivity": "DigitalOcean hesabınıza qoşularkən problem baş verdi. Bu, bəzən DigitalOcean və ya internet bağlantınızla əlaqəli müvəqqəti problem səbəbindən olur. Yenidən cəhd nəticə vermirsə, DigitalOcean'a təkrar daxil olmaq problemi həll etməlidir.", + "error-connectivity-title": "Bağlantı problemi", + "error-do-account-info": "DigitalOcean hesab məlumatlarını əldə etmək alınmadı", + "error-do-auth": "DigitalOcean ilə identifikasiya alınmadı", + "error-do-limit": "DigitalOcean hesabınız {num} Droplets limitinə çatıb. https://cloud.digitalocean.com/account/team/droplet_limit_increase ünvanında limitin artırılması üçün sorğu göndərə bilərsiniz", + "error-do-regions": "Əlçatan regionların siyahısını əldə etmək alınmadı", + "error-do-warning": "DigitalOcean xəbərdarlığı: \"{message}\"", + "error-feedback": "Rəy göndərmək alınmadı. Yenidən sınayın.", + "error-gcp-auth": "Google Cloud Platforması ilə doğrulama alınmadı", + "error-hostname-invalid": "IP ünvanı və ya düzgün host adı olmalıdır.", + "error-key-add": "Açar əlavə etmək alınmadı", + "error-key-remove": "Açarı silmək alınmadı", + "error-key-rename": "Açarın adını dəyişmək alınmadı", + "error-keys-get": "Açarları yükləmək mümkün olmadı", + "error-keys-port-bad-input": "Port 1 və 65535 arasında tam ədəd olmalıdır.", + "error-keys-port-in-use": "Port artıq serverdə istifadə olunur.", + "error-licenses": "Lisenziyaları yükləmək mümkün olmadı.", + "error-metrics": "Göstəriciləri aktiv olaraq ayarlayarkən xəta oldu", + "error-network": "Şəbəkə xətası baş verdi.", + "error-not-saved": "Yadda saxlanılmadı", + "error-remove-data-limit": "Defolt data limitini deaktiv etmək mümkün olmadı", + "error-remove-per-key-limit": "Data limitini bu giriş açarından silmək mümkün olmadı", + "error-server-creation": "Outline serverinizi yaradarkən xəta baş verdi.", + "error-server-destroy": "Serveri silmək alınmadı", + "error-server-removed": "{serverName} artıq DigitalOcean hesabınızda yoxdur.", + "error-server-rename": "Serverin adını dəyişmək alınmadı", + "error-server-unreachable": "Outline Serveriniz düzgün quraşdırılıb, lakin ona qoşula bilmirik. Bu, serverinizin təhlükəsizlik divarı üzrə qaydalarının yeni bağlantıları bloklaması ilə əlaqədar ola bilər. Onları nəzərdən keçirin və 1024-dən 65535-ə qədər olan portlarda yeni TCP bağlantılarına icazə verin.", + "error-server-unreachable-title": "Outline Serverinizə qoşula bilmir", + "error-servers-removed": "{serverNames} artıq DigitalOcean hesabınızda yoxdur.", + "error-set-data-limit": "Defolt data limiti təyin etmək mümkün olmadı", + "error-set-per-key-limit": "Bu giriş açarı üçün data limiti ayarlamaq mümkün olmadı", + "error-unexpected": "Gözlənilməz xəta baş verdi.", + "experimental": "Eksperimental", + "experiments": "Təcrübələr", + "experiments-description": "İstifadədə verilmədən əvvəl yeni funksiyaları sınayın və bizə rəy bildirin.", + "experiments-disclaimer": "Təcrübələr hazırlanır və dəyişdirilə, yaxud tətbiqdən silinə bilər. Hazırda göstəriciləri bildirirsinizsə, eksperimental funksiyaların istifadəsi daxil ediləcək. Ətraflı məlumat üçün {openLink}data toplama siyasətinə{closeLink} baxın.", + "experiments-feedback": "Təklifləriniz var? {openLink}Burada rəy göndərin.{closeLink}", + "feedback-cloud-provider": "Bulud provayderini seçin", + "feedback-cloud-provider-error": "Bulud provayderi seçin.", + "feedback-connection": "Serverimə qoşulmaq mümkün deyil", + "feedback-connection-others": "Digərləri serverimə qoşula bilməz", + "feedback-disclaimer": "Nəzərə alın ki, komandamız rəylərə yalnız ingilis dilində cavab verə bilər.", + "feedback-email": "E-poçt ünvanı (istəyə görə)", + "feedback-error": "Rəy daxil edin.", + "feedback-explanation-install": "Outline'ı serverinizdə quraşdırmağa çalışarkən xəta baş verdi. Həll yolu tapa bilmirsinizsə, bizə rəy göndərin və Sizinlə əlaqə saxlaya bilməyimiz üçün e-poçt ünvanınızı (istəyə görə) təmin edin.", + "feedback-general": "Ümumi rəy", + "feedback-install": "Outline quraşdırarkən problem baş verir", + "feedback-label": "Rəyiniz", + "feedback-management": "Serverimi idarə edərkən problem baş verir", + "feedback-other": "Digər", + "feedback-privacy": "Rəyiniz, e-poçt ünvanı (əgər varsa) və {openLink}data toplama siyasətində{closeLink} göstərilən əlavə məlumatlar Outline komandasına göndəriləcək.", + "feedback-submit": "Göndərin", + "feedback-suggestion": "Təkliflər", + "feedback-title-generic": "Rəy Göndərin", + "feedback-title-install": "Outline Server Quraşdırması Alınmadı", + "gcp-billing-action": "Növbəti", + "gcp-billing-body": "{openLink}Google Cloud'da billinq hesabı əlavə etməyinizi {closeLink} gözləyirik", + "gcp-billing-description": "Davam etmək üçün {openLink}Cloud Console billinq səhifəsini açın{closeLink} və hesab əlavə edin.", + "gcp-billing-error": "Faktura məlumatlarını əldə etmək olmur", + "gcp-billing-error-zero": "Davam etmədən əvvəl billinq hesabı əlavə etməlisiniz.", + "gcp-click-create": "\"Create\" (Yaradın) düyməsinə klikləyin.", + "gcp-create-new-project": "{openLink}Yeni Google Cloud Layihəsi yaradın{closeLink}.", + "gcp-create-new-vm": "{openLink}Yeni VM nümunəsi yaradın{closeLink}.", + "gcp-create-project": "Google Cloud layihəsi yaradın", + "gcp-create-server": "Google Cloud Layihənizi yaradın", + "gcp-create-vm": "VM nümunəsi yaradın", + "gcp-disconnect-account": "Google Cloud Platforması hesabının bağlantısını kəsin", + "gcp-firewall-create-0": "Compute Engine layihənizə {openLink}təhlükəsizlik divarı qaydası əlavə edin{closeLink}.", + "gcp-firewall-create-1": "\"Ad\" sahəsinə \"outline\" yazın.", + "gcp-firewall-create-2": "\"Hədəf teqləri\" (Target tags) sahəsinə \"outline\" yazın.", + "gcp-firewall-create-3": "\"Source IP ranges\" sahəsinə \"0.0.0.0/0\" yazın.", + "gcp-firewall-create-4": "\"Protocols and ports\" (Protokollar və portlar) bölməsində \"Allow all\" (Hamısına icazə verin) seçimini edin.", + "gcp-name-your-project": "\"Layihə adı\" sahəsində layihənizə ad verin.", + "gcp-project-setup-error": "Google Cloud layihənizi quraşdırarkən xəta baş verdi", + "gcp-select-machine-type": "\"Maşın növü\" (Machine type) altında \"f1-micro\" seçimini edin", + "gcp-select-networking": "\"İdarəetmə, təhlükəsizlik, disklər, şəbəkələşmə, tək sahiblik\" seçiminə, sonra \"Şəbəkələşmə\" seçiminə klikləyin.", + "gcp-select-region": "\"Bölgə\" (Region) bölməsində server istifadəçilərinin olacağı yerə yaxın bir bölgə seçin.", + "gcp-type-network-tag": "\"Şəbəkə teqləri\" (Network tags) sahəsinə \"outline\" yazın", + "gcp-type-outline-server": "\"Ad\" (Name) sahəsinə \"outline-server\" yazın.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Banqalur", + "geo-changhua-county": "Çanxua Əyaləti", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Honq Konq", + "geo-iowa": "Ayova", + "geo-jakarta": "Cakarta", + "geo-jurong-west": "Curonq Vest", + "geo-las-vegas": "Las-Veqas", + "geo-london": "London", + "geo-los-angeles": "Los-Anceles", + "geo-melbourne": "Melburn", + "geo-montreal": "Monreal", + "geo-mumbai": "Mumbay", + "geo-new-york-city": "Nyu-York", + "geo-northern-virginia": "Şimali Virciniya", + "geo-oregon": "Oreqon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Solt Leyk Siti", + "geo-san-francisco": "San-Fransisko", + "geo-sao-paulo": "San Paulo", + "geo-seoul": "Seul", + "geo-sg": "Sinqapur", + "geo-south-carolina": "Cənubi Karolina", + "geo-st-ghislain": "Sent-Qilen", + "geo-sydney": "Sidney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varşava", + "geo-zurich": "Sürix", + "key": "Açar {keyId}", + "manual-server-assign-firewall": "Təhlükəsizlik divarı qaydasını təyin edin", + "manual-server-assign-group": "Təhlükəsizlik Qrupu təyin edin", + "manual-server-create-firewall": "Qoruyucu divar qaydası yaradın", + "manual-server-create-group": "Təhlükəsizlik Qrupu yaradın", + "manual-server-description": "Bu addımlar {cloudProvider} Linux serverində Outline quraşdırmağınıza kömək edəcək.", + "manual-server-firewall": "Qoruyucu divarınızı konfiqurasiya edin", + "manual-server-install-paste": "Quraşdırma çıxışını buraya yerləşdirin.", + "manual-server-install-run": "Serverinizə daxil olun və bu əmri icra edin.", + "manual-server-instructions": "Təlimatlar", + "manual-server-show-me": "Harada olduğun göstərin", + "manual-server-title": "Aşağıdakı təlimatlara əməl edin", + "metrics-description": "Siz və serverinizi paylaşdığınız şəxslər üçün Outline etibarlılığını və performansını artırmaq məqsədilə anonimləşdirilmiş göstəriciləri paylaşın. {openLink}Ətraflı məlumat.{closeLink}", + "metrics-share": "Göstəriciləri paylaşın", + "metrics-skip": "Ötürün", + "metrics-title": "Göstərici paylaşımı", + "nav-about": "Haqqında", + "nav-data-collection": "Datanın toplanması", + "nav-feedback": "Rəy", + "nav-help": "Yardım", + "nav-licenses": "Lisenziyalar", + "nav-privacy": "Məxfilik", + "nav-terms": "Şərtlər", + "no-data-limit": "Heç biri", + "notification-app-update": "Güncəllənmiş Outline Manager versiyası endirilib. Tətbiqi yenidən başlatdıqda quraşdırılacaq.", + "notification-feedback-thanks": "Təkmilləşdirməyə kömək etdiyiniz üçün təşəkkürlər! Rəyiniz bizim üçün maraqlıdır.", + "notification-key-added": "Açar əlavə edildi", + "notification-key-removed": "Açar silindi", + "notification-server-destroyed": "Server silindi", + "notification-server-exists": "Server artıq əlavə edilib", + "notification-server-removed": "Server silindi", + "oauth-account-active": "DigitalOcean hesabınız aktiv edilib.", + "oauth-account-active-tag": "Hesab aktiv edildi! Server məkanları yüklənir...", + "oauth-activate-account": "DigitalOcean hesabınızı aktivləşdirin.", + "oauth-billing": "Faktura məlumatlarınızı digitalocean.com saytında daxil edin və bitirdikdən sonra tətbiqə qayıdın.", + "oauth-billing-tag": "Faktura məlumatlarını daxil edin...", + "oauth-connect-description": "Hesabınızla Outline server yaratmağı və əlaqə qurmağı asanlaşdırır.", + "oauth-connect-tag": "Hesabınıza qoşulmaq üçün gözlənilir...", + "oauth-connect-title": "DigitalOcean ilə daxil olun və ya hesab yaradın.", + "oauth-sign-out": "Çıxın", + "oauth-verify": "DigitalOcean'dan gələn e-məktub üçün gələnlər qutunuzu yoxlayın və hesabınızı təsdiq etmək üçün içindəki keçidə toxunun.", + "oauth-verify-tag": "E-poçtunuzu təsdiq edin...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Fərdi data limitini ayarlayın", + "per-key-data-limit-dialog-title": "Data Limiti - {keyName}", + "region-best-value": "Ən münasib qiymət", + "region-description": "İnternet təcrübənizi təmin edəcək server burada yerləşir.", + "region-setup": "Outline'ı quraşdırın", + "region-title": "Serverinizin məkanını seçin.", + "remove": "Silin", + "retry": "Təkrar cəhd edin", + "save": "Yadda saxlayın", + "saved": "Yadda saxlanıldı", + "saving": "Yadda saxlanılır...", + "server-access": "Server girişi", + "server-access-key-new": "Yeni açar əlavə edin", + "server-access-key-rename": "Adını dəyişin", + "server-access-keys": "Giriş açarları", + "server-connections": "Bağlantılar", + "server-data-transfer": "Köçürülmüş data həcmi / son 30 gün", + "server-data-used": "İstifadə edilən data həcmi / son 30 gün", + "server-destroy": "Serveri silin", + "server-help-access-key-description": "Giriş açarlarını dostlarınızla paylaşın ki, Outline serverinizə qoşula bilsinlər. Onlar bütün cihazlarında eyni giriş açarından istifadə edə bilərlər.", + "server-help-access-key-next": "Növbəti", + "server-help-access-key-title": "Açarlar yaradın, giriş icazəsini paylaşın", + "server-help-connection-description": "Outline serverinizə şəxsi giriş açarınızdan istifadə edərək Outline müştəri tətbiqini quraşdırmaq üçün buraya toxunun.", + "server-help-connection-ok": "Yaxşı, anladım!", + "server-help-connection-title": "Hələ qoşulmamısınız!", + "server-keys": "Açarlar", + "server-my-access-key": "Giriş açarım", + "server-name": "Outline Serveri {serverLocation}", + "server-remove": "Serveri silin", + "server-settings": "Ayarlar", + "server-unreachable": "Server əlçatan deyil", + "server-unreachable-description": "Bu serverə qoşulmaqla bağlı problemimiz var.", + "server-unreachable-managed-description": "Yenidən cəhd edin və ya bu serveri tətbiqdən silin.", + "server-unreachable-manual-description": "Yenidən cəhd edin, yaxud bu serveri və virtual hostu silin.", + "server-usage": "İstifadə (son 30 gün)", + "servers-add": "Server əlavə edin", + "servers-digitalocean": "DigitalOcean serverləri", + "servers-gcp": "Google Cloud Platforması serverləri", + "servers-manual": "Serverlər", + "settings-access-key-port": "Yeni giriş açarları üçün port", + "settings-metrics-header": "Anonim göstəriciləri paylaşın", + "settings-server-api-url": "Management API URL-i", + "settings-server-cost": "Aylıq xərc", + "settings-server-creation": "Yaradılıb", + "settings-server-hostname": "Host adı", + "settings-server-id": "Server ID-si", + "settings-server-info": "Server Məlumatları", + "settings-server-location": "Server məkanı", + "settings-server-name": "Ad", + "settings-server-rename": "Serverinizə yeni ad verin. Nəzərə alın ki, bu, qoşulmağa dəvət etdiyiniz istifadəçilərin cihazlarına təsir etməyəcək.", + "settings-server-version": "Server versiyası", + "settings-transfer-limit": "Data köçürülməsi haqqı", + "setup-action": "Quraşdırın", + "setup-advanced": "Qabaqcıl", + "setup-anywhere": "İstənilən yerdə Outline'ı quraşdırın", + "setup-cancel": "İstənilən vaxt ləğv edin", + "setup-create": "Server yaradın", + "setup-description": "Serveriniz yoxdur? DigitalOcean ilə hesab yaradın.", + "setup-do-cost": "Aylıq yalnız 6$", + "setup-do-create": "1 TB datanın köçürülməsi üçün əlavə 30 günlük 6$ ödəməklə DigitalOcean hesabınızla yeni server yaradın.", + "setup-do-data": "1 TB data köçürülməsi haqqı", + "setup-do-description": "Bu, bir neçə dəqiqə çəkə bilər. Bu serveri istənilən vaxt silə bilərsiniz.", + "setup-do-easiest": "Ən asan quraşdırma prosesi", + "setup-do-title": "Outline quraşdırılır.", + "setup-firewall-instructions": "Qoruyucu divar təlimatları", + "setup-gcp-create": "Google hesabınızla yeni server yaradın. Xərclər məkan və istifadəyə görə fərqlənir.", + "setup-gcp-easy": "Asan quraşdırma prosesi", + "setup-gcp-free-tier": "{openLinkFreeTier}Ödənişsiz Səviyyə{closeLink} ilə ilk serveriniz {openLinkIpPrice}aylıq 3${closeLink} qiymətindən başlayır", + "setup-gcp-free-trial": "Yeni istifadəçilər üçün {openLinkFreeTrial}90 gün ödənişsiz sınaq{closeLink}", + "setup-gcp-promo": "Google Cloud üçün yeni avtomatik Outline serveri yaratmaq prosesini sınayın", + "setup-recommended": "Tövsiyə olunur", + "setup-simple-commands": "Sadə quraşdırma əmrləri", + "setup-step-by-step": "Addım-addım quraşdırma bələdçisi", + "setup-tested": "VULTR, Linode və Liquid Web-də sınaqdan keçirilmişdir", + "setup-title": "Outline quraşdırmaq üçün bulud xidməti seçin.", + "share-description": "Bu dəvəti kopyalayın və etibar etdiyiniz əlaqə vasitəsi ilə göndərin. {openLink}Kömək lazımdır?{closeLink}", + "share-invite-access-key-copied": "Giriş açarı mübadilə buferinə kopyalandı", + "share-invite-copied": "Dəvət mübadilə buferinə kopyalandı", + "share-invite-copy": "Dəvəti kopyalayın", + "share-invite-copy-access-key": "Giriş açarını kopyalayın", + "share-invite-html": "Azad internetə təhlükəsiz şəkildə daxil olmaq üçün bu serverdən istifadə edin:

1) Cihazınız üçün Outline tətbiqini endirin və quraşdırın:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android üçün alternativ keçid: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) ss:// ilə başlayan giriş açarı əldə edəcəksiniz. Əldə etdikdən sonra bu giriş açarını kopyalayın.

3) Outline client tətbiqini açın. Giriş açarınız avtomatik aşkarlanarsa, \"Qoşulun\" seçiminə toxunaraq davam edin. Giriş açarınız avtomatik aşkarlanmazsa, onu sahəyə əlavə edin, sonra \"Qoşulun\" seçiminə toxunaraq davam edin.

Azad internetdən istifadə etməyə hazırsınız! Serverə qoşulduğunuzdan əmin olmaq üçün Google Axtarışda \"ip-im nədir\" üzrə axtarış etməyə cəhd edin. Google'da göstərilən IP ünvanı Outline client'dəki IP ünvanına uyğun olmalıdır.

Outline haqqında ətraflı məlumatı buradan əldə edin: https://getoutline.org/", + "share-invite-instructions": "GitHub'da dəvət təlimatlarımızı izləyin:", + "share-invite-trouble": "Dəvət keçidinə daxil olarkən problem baş verir?", + "share-title": "Girişi paylaşın", + "survey-data-limits-title": "Data limitlərini təkmilləşdirməklə bağlı bizə kömək edin", + "survey-decline": "İmtina edin", + "survey-disclaimer": "Davam etmək düyməsini klikləməklə Google Forma haqqında qısa sorğuya yönləndiriləcəksiniz. Sorğuda Outline'a qoşulu olarkən iştirak etməyinizi məsləhət görürük.", + "survey-go-to-survey": "Sorğuya keçin", + "terms-of-service": "{openLink}Outline Xidmət Şərtlərini{closeLink} oxudum və anladım" +} diff --git a/server_manager/messages/bg.json b/server_manager/messages/bg.json new file mode 100644 index 0000000000..5fb73307e6 --- /dev/null +++ b/server_manager/messages/bg.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline е проект с отворен код, създаден от Jigsaw, за да предостави по-безопасен начин за достъп до интернет на новинарските организации и журналистите.

Outline се предоставя от Shadowsocks и все още е продукт в ранен стадий на разработка. Можете да допринесете към кода на GitHub и да ни следите в(ъв) Reddit и Medium, за да научите, когато се разширим към още платформи и добавим нови функции.", + "about-version": "Версия {version}", + "aws-lightsail-firewall-0": "Преминете към екрана с екземпляри на {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Кликнете върху екземпляра, където искате да хоствате Outline.", + "aws-lightsail-firewall-2": "Преминете към раздела Networking.", + "aws-lightsail-firewall-3": "В секцията Firewall кликнете върху Add another.", + "aws-lightsail-firewall-4": "За стойността на Application задайте All TCP+UDP.", + "aws-lightsail-firewall-5": "Кликнете върху Save.", + "cancel": "Отказ", + "close": "Затваряне", + "confirmation-server-destroy": "Съществуващите потребители ще загубят достъп. Това действие не може да бъде отменено.", + "confirmation-server-destroy-title": "Да се унищожи ли сървърът?", + "confirmation-server-remove": "Това действие премахва сървъра ви от Outline Manager, но не блокира достъпа на потребителите до прокси сървъра. Ще трябва ръчно да изтриете сървъра на Outline от хоста си.", + "confirmation-server-remove-title": "Да се премахне ли сървърът?", + "data-limit": "Ограничение за данните", + "data-limit-per-key": "Ограничение за данните за ключ", + "data-limits": "Ограничения за данните", + "data-limits-description": "Задайте 30-дневно оставящо следа ограничение за трафик на данни за ключовете за достъп на този сървър.", + "data-limits-dialog-text": "Отворете раздел „Настройки“, за да зададете ограничение за трафик на данни за ключовете за достъп на този сървър.", + "data-limits-dialog-title": "Избягване на излишък от данни", + "data-limits-disclaimer": "Тъй като понастоящем отчитате показатели, ще се включи използването на функцията за ограничение на данните. Моля, вижте {openLink}Правилата за събиране на данни{closeLink} за повече подробности.", + "data-limits-usage": "Използвани са {used} от {total}", + "destroy": "Унищожаване", + "digitalocean-disconnect-account": "Прекратяване на връзката с профила в DigitalOcean", + "digitalocean-unreachable": "Тази грешка може да се дължи на защитна стена в мрежата ви или на временни проблеми със свързаността на digitalocean.com.", + "disabled": "Деактивиране", + "disconnect": "Прекратяване на връзката", + "done": "Готово", + "enabled": "Активиране", + "error-connectivity": "Имаме проблем със свързването с профила ви в DigitalOcean. Това понякога е временен проблем с DigitalOcean или с връзката ви с интернет. Ако новият опит не бъде успешен, проблемът би трябвало да се реши с повторно влизане в профила в DigitalOcean.", + "error-connectivity-title": "Проблем с връзката", + "error-do-account-info": "Получаването на информация за профила в DigitalOcean не бе успешно", + "error-do-auth": "Удостоверяването в DigitalOcean не бе успешно", + "error-do-limit": "Профилът ви в DigitalOcean достигна ограничението от {num} дроплета. Можете да заявите увеличение на адрес https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Списъкът с регионите на предлагане на услугата не бе получен", + "error-do-warning": "Предупреждение от DigitalOcean: {message}", + "error-feedback": "Изпращането на отзиви не бе успешно. Моля, опитайте отново.", + "error-gcp-auth": "Неуспешно удостоверяване с Google Cloud Platform", + "error-hostname-invalid": "Трябва да бъде IP адрес или валидно име на хост.", + "error-key-add": "Добавянето на ключ не бе успешно", + "error-key-remove": "Премахването на ключа не бе успешно", + "error-key-rename": "Преименуването на ключа не бе успешно", + "error-keys-get": "Ключовете не се заредиха", + "error-keys-port-bad-input": "Портът трябва да е цяло число между 1 и 65 535.", + "error-keys-port-in-use": "Портър вече се използва на сървъра.", + "error-licenses": "Лицензите не можаха да се заредят.", + "error-metrics": "Грешка при активирането на показателите", + "error-network": "Възникна мрежова грешка.", + "error-not-saved": "Не бе запазено", + "error-remove-data-limit": "Стандартното ограничение за данните не бе деактивирано", + "error-remove-per-key-limit": "Ограничението за данните за този ключ за достъп не бе премахнато", + "error-server-creation": "При създаването на сървъра ви на Outline възникна грешка.", + "error-server-destroy": "Унищожаването на сървъра не бе успешно", + "error-server-removed": "{serverName} липсва в профила ви в DigitalOcean.", + "error-server-rename": "Преименуването на сървъра не бе успешно", + "error-server-unreachable": "Сървърът ви на Outline е инсталиран правилно, но не можем да се свържем с него. Най-вероятната причина е, че правилата в защитната му стена блокират входящите връзки. Моля, прегледайте ги и разрешете входящи TCP връзки на портове от 1024 до 65 535.", + "error-server-unreachable-title": "Няма връзка със сървъра ви на Outline", + "error-servers-removed": "{serverNames} липсват в профила ви в DigitalOcean.", + "error-set-data-limit": "Стандартното ограничение за данните не бе зададено", + "error-set-per-key-limit": "Не бе зададено ограничение за данните за този ключ за достъп", + "error-unexpected": "Възникна неочаквана грешка", + "experimental": "Експериментално", + "experiments": "Експерименти", + "experiments-description": "Изпробвайте новите функции и ни предоставете отзиви, преди те да бъдат пуснати.", + "experiments-disclaimer": "Експерименталните функции са в разработване и може да се променят или да бъдат премахнати от приложението. Ако понастоящем отчитате показатели, използването на тези функции ще бъде включено. Моля, вижте {openLink}Правилата за събиране на данни{closeLink} за повече подробности.", + "experiments-feedback": "Имате предложения? {openLink}Изпратете отзиви тук.{closeLink}", + "feedback-cloud-provider": "Изберете доставчик на облачни услуги", + "feedback-cloud-provider-error": "Моля, изберете доставчик на облачни услуги.", + "feedback-connection": "Не мога да се свържа със сървъра си", + "feedback-connection-others": "Хората не могат да се свържат със сървъра ми", + "feedback-disclaimer": "Моля, обърнете внимание, че екипът ни е в състояние да отговаря на отзиви само на английски.", + "feedback-email": "Имейл адрес (по избор)", + "feedback-error": "Моля, въведете отзив.", + "feedback-explanation-install": "При опита за инсталиране на Outline на сървъра ви възникна грешка. Ако не сте намерили решение, бихте могли да ни изпратите отзиви и да ни съобщите имейл адреса си (не е задължително), за да можем да се свържем с вас.", + "feedback-general": "Общи отзиви", + "feedback-install": "Имам проблем с инсталирането на Outline", + "feedback-label": "Вашият отзив", + "feedback-management": "Имам проблем с управлението на сървъра си", + "feedback-other": "Друг", + "feedback-privacy": "Вашият отзив, имейл адрес (ако е предоставен) и допълнителната информация, за която се говори в {openLink}Декларацията за поверителност{closeLink}, ще бъдат изпратени до екипа на Outline.", + "feedback-submit": "Изпращане", + "feedback-suggestion": "Предложения", + "feedback-title-generic": "Изпращане на отзиви", + "feedback-title-install": "Инсталирането на сървъра на Outline не бе успешно", + "gcp-billing-action": "Напред", + "gcp-billing-body": "Изчаква се да {openLink}добавите профил за таксуване в Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Отворете страницата за таксуване на Cloud Console{closeLink} и добавете профил, за да продължите.", + "gcp-billing-error": "Неуспешно получаване на информация за таксуване", + "gcp-billing-error-zero": "Преди да продължите, трябва да добавите профил за таксуване.", + "gcp-click-create": "Кликнете върху Create.", + "gcp-create-new-project": "{openLink}Създаване на нов проект в Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Създаване на нов екземпляр на виртуална машина{closeLink}.", + "gcp-create-project": "Създаване на проект в Google Cloud", + "gcp-create-server": "Създаване на проект в Google Cloud", + "gcp-create-vm": "Създаване на екземпляр на виртуална машина", + "gcp-disconnect-account": "Прекъсване на профил в Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Добавете ново правило в защитната стена{closeLink} на проекта си в Compute Engine.", + "gcp-firewall-create-1": "Въведете outline в полето Name.", + "gcp-firewall-create-2": "Въведете outline в полето Target tags.", + "gcp-firewall-create-3": "Въведете 0.0.0.0/0 в полето Source IP ranges.", + "gcp-firewall-create-4": "Изберете Allow all под Protocols and ports.", + "gcp-name-your-project": "Дайте име на проекта си в полето Project name.", + "gcp-project-setup-error": "Възникна грешка при настройването на проекта ви в Google Cloud", + "gcp-select-machine-type": "За Machine type изберете f1-micro", + "gcp-select-networking": "Кликнете върху Management, security, disks, networking, sole tenancy и след това – върху Networking", + "gcp-select-region": "Под Region изберете регион в близост до местата, където ще бъдат потребителите на сървъра.", + "gcp-type-network-tag": "Въведете outline в полето Network tags", + "gcp-type-outline-server": "Въведете outline-server в полето Name.", + "geo-amsterdam": "Амстердам", + "geo-bangalore": "Бангалор", + "geo-changhua-county": "Окръг Чанхуа", + "geo-delhi": "Делхи", + "geo-eemshaven": "Емсхавен", + "geo-frankfurt": "Франкфурт", + "geo-hamina": "Хамина", + "geo-hk": "Хонконг", + "geo-iowa": "Айова", + "geo-jakarta": "Джакарта", + "geo-jurong-west": "Джурон Уест", + "geo-las-vegas": "Лас Вегас", + "geo-london": "Лондон", + "geo-los-angeles": "Лос Анджелис", + "geo-melbourne": "Мелбърн", + "geo-montreal": "Монреал", + "geo-mumbai": "Мумбай", + "geo-new-york-city": "Ню Йорк", + "geo-northern-virginia": "Северна Вирджиния", + "geo-oregon": "Орегон", + "geo-osaka": "Осака", + "geo-salt-lake-city": "Солт Лейк Сити", + "geo-san-francisco": "Сан Франциско", + "geo-sao-paulo": "Сао Пауло", + "geo-seoul": "Сеул", + "geo-sg": "Сингапур", + "geo-south-carolina": "Южна Каролина", + "geo-st-ghislain": "Сен Гислен", + "geo-sydney": "Сидни", + "geo-tokyo": "Токио", + "geo-toronto": "Торонто", + "geo-warsaw": "Варшава", + "geo-zurich": "Цюрих", + "key": "Ключ {keyId}", + "manual-server-assign-firewall": "Задаване на правило в защитната стена", + "manual-server-assign-group": "Задаване на група за сигурност", + "manual-server-create-firewall": "Създаване на правило в защитната стена", + "manual-server-create-group": "Създаване на група за сигурност", + "manual-server-description": "Тези стъпки ще ви помогнат да инсталирате Outline на сървър с Linux от {cloudProvider}.", + "manual-server-firewall": "Конфигуриране на защитната стена", + "manual-server-install-paste": "Поставете тук изведения при инсталирането текст.", + "manual-server-install-run": "Влезте в сървъра си и изпълнете тази команда.", + "manual-server-instructions": "Инструкции", + "manual-server-show-me": "Показване на мястото", + "manual-server-title": "Изпълнете инструкциите по-долу", + "metrics-description": "Споделяйте анонимизирани показатели, за да помогнете за подобряване на надеждността и ефективността на Outline за вас и за хората, с които споделяте сървъра си. {openLink}Научете повече{closeLink}.", + "metrics-share": "Споделяне на показатели", + "metrics-skip": "Пропускане", + "metrics-title": "Споделяне на показатели", + "nav-about": "Информация", + "nav-data-collection": "Събиране на данни", + "nav-feedback": "Отзиви", + "nav-help": "Помощ", + "nav-licenses": "Лицензи", + "nav-privacy": "Поверителност", + "nav-terms": "Условия", + "no-data-limit": "Няма", + "notification-app-update": "Изтеглена бе актуализирана версия на Outline Manager. Ще бъде инсталирана, когато рестартирате приложението.", + "notification-feedback-thanks": "Благодарим ви, че ни помагате да се подобрим! Радваме се да чуем какво мислите.", + "notification-key-added": "Ключът бе добавен", + "notification-key-removed": "Ключът бе премахнат", + "notification-server-destroyed": "Сървърът бе унищожен", + "notification-server-exists": "Сървърът вече е добавен", + "notification-server-removed": "Сървърът бе премахнат", + "oauth-account-active": "Профилът ви в DigitalOcean бе активиран.", + "oauth-account-active-tag": "Профилът бе активиран. Зареждат се местоположенията на сървърите...", + "oauth-activate-account": "Активирайте профила си в DigitalOcean.", + "oauth-billing": "Въведете данните си за фактуриране в digitalocean.com и се върнете в приложението, когато приключите.", + "oauth-billing-tag": "Въведете данни за фактуриране...", + "oauth-connect-description": "С профила си и с Outline лесно можете да създадете сървър и да се свързвате с него.", + "oauth-connect-tag": "Чака се свързване на профила ви...", + "oauth-connect-title": "Влезте в профила си или си създайте такъв в DigitalOcean.", + "oauth-sign-out": "Изход", + "oauth-verify": "Проверете входящата си поща за имейл от DigitalOcean и кликнете върху връзката в него, за да потвърдите профила си.", + "oauth-verify-tag": "Потвърдете имейл адреса си...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Задаване на персонализирано ограничение за данните", + "per-key-data-limit-dialog-title": "Ограничение за данните – {keyName}", + "region-best-value": "Най-добра цена", + "region-description": "Работата ви с интернет ще се извършва от това място.", + "region-setup": "Настройване на Outline", + "region-title": "Изберете местоположението на сървъра си.", + "remove": "Премахване", + "retry": "Нов опит", + "save": "Запазване", + "saved": "Запазено", + "saving": "Запазва се...", + "server-access": "Достъп до сървъра", + "server-access-key-new": "Добавяне на нов ключ", + "server-access-key-rename": "Преименуване", + "server-access-keys": "Ключове за достъп", + "server-connections": "Връзки", + "server-data-transfer": "Трафик/за последните 30 дни", + "server-data-used": "Използвана квота/за последните 30 дни", + "server-destroy": "Унищожаване на сървъра", + "server-help-access-key-description": "Споделете ключовете за достъп с приятели, за да могат да се свържат към сървъра ви на Outline. Могат да използват един и същ ключ за достъп на всичките си устройства.", + "server-help-access-key-next": "Напред", + "server-help-access-key-title": "Създаване на ключове и споделяне на достъпа", + "server-help-connection-description": "Кликнете тук, за да инсталирате клиентското приложение Outline, като използвате личния си ключ за достъп до сървъра си на Outline.", + "server-help-connection-ok": "Добре, разбрах!", + "server-help-connection-title": "Още нямате връзка!", + "server-keys": "Ключове", + "server-my-access-key": "Моят ключ за достъп", + "server-name": "Сървър на Outline {serverLocation}", + "server-remove": "Премахване на сървъра", + "server-settings": "Настройки", + "server-unreachable": "Няма достъп до сървъра", + "server-unreachable-description": "Имаме проблеми с установяването на връзка с този сървър.", + "server-unreachable-managed-description": "Опитайте отново или премахнете сървъра от приложението.", + "server-unreachable-manual-description": "Опитайте отново или унищожете този сървър и виртуалния хост.", + "server-usage": "Използване (за последните 30 дни)", + "servers-add": "Добавяне на сървър", + "servers-digitalocean": "Сървъри на DigitalOcean", + "servers-gcp": "Сървъри на Google Cloud Platform", + "servers-manual": "Сървъри", + "settings-access-key-port": "Порт за нови ключове за достъп", + "settings-metrics-header": "Споделяне на анонимни показатели", + "settings-server-api-url": "URL адрес на приложния програмен интерфейс (API) за управление", + "settings-server-cost": "Цена на месец", + "settings-server-creation": "Създаване", + "settings-server-hostname": "Име на хост", + "settings-server-id": "Идент. № на сървъра", + "settings-server-info": "Информация за сървъра", + "settings-server-location": "Местоположение на сървъра", + "settings-server-name": "Име", + "settings-server-rename": "Задайте ново име на сървъра. Обърнете внимание, че това няма да се отрази в устройствата на потребителите, които сте поканили да се свързват с него.", + "settings-server-version": "Версия на сървъра", + "settings-transfer-limit": "Квота за трафик", + "setup-action": "Настройване", + "setup-advanced": "За напреднали", + "setup-anywhere": "Настройване на Outline където и да е", + "setup-cancel": "Анулиране по всяко време", + "setup-create": "Създаване на сървър", + "setup-description": "Нямате сървър? Създайте си профил в DigitalOcean.", + "setup-do-cost": "Само 6 щ.д. на месец", + "setup-do-create": "Създайте нов сървър с профила си в DigitalOcean за още 6 щ.д./30 дни за трафик от 1 ТБ.", + "setup-do-data": "Квота от 1 ТБ трафик", + "setup-do-description": "Това може да отнеме няколко минути. Можете да унищожите сървъра по всяко време.", + "setup-do-easiest": "Изключително лесно настройване", + "setup-do-title": "Outline се настройва.", + "setup-firewall-instructions": "Инструкции за защитната стена", + "setup-gcp-create": "Създаване на нов сървър с профил в Google. Разходите зависят от местоположението и начина на използване.", + "setup-gcp-easy": "Лесно настройване", + "setup-gcp-free-tier": "При работа на {openLinkFreeTier}безплатното ниво{closeLink} първият ви сървър започва от {openLinkIpPrice}3 щ.д. месечно{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90-дневен безплатен пробен период{closeLink} за нови потребители", + "setup-gcp-promo": "Изпробвайте новия автоматичен процес за създаване на сървъри на Outline за Google Cloud", + "setup-recommended": "Препоръчано", + "setup-simple-commands": "Лесни команди за инсталиране", + "setup-step-by-step": "Поетапно ръководство за настройване", + "setup-tested": "Тествано с VULTR, Linode и Liquid Web", + "setup-title": "Изберете облачна услуга, където да настроите Outline.", + "share-description": "Копирайте тази покана и я изпратете през средство за комуникация, на което имате доверие. {openLink}Нуждаете се от помощ?{closeLink}", + "share-invite-access-key-copied": "Ключът за достъп бе копиран в буферната памет", + "share-invite-copied": "Поканата бе копирана в буферната памет", + "share-invite-copy": "Копиране на поканата", + "share-invite-copy-access-key": "Копиране на ключа за достъп", + "share-invite-html": "Използвайте този сървър за безопасен достъп до интернет без ограничения:

1) Изтеглете и инсталирайте приложението Outline за устройството си:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Алтернативна връзка за Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Ще получите ключ за достъп, който започва с ss://. След като го получите, го копирайте.

3) Отворете клиентското приложението Outline. Ако ключът ви за достъп бъде открит автоматично, докоснете „Свързване“ и продължете. Ако ключът ви за достъп не бъде открит автоматично, поставете го в полето, след което докоснете „Свързване“ и продължете.

Вече можете да използвате интернет без ограничения! За да се уверите, че сте се свързали със сървъра, опитайте да потърсите „what is my ip“ с Google Търсене. IP адресът, който се показва в Google, трябва да съвпада с IP адреса в клиента на Outline.

Научете повече за Outline тук: https://getoutline.org/", + "share-invite-instructions": "Изпълнете инструкциите ни за покана в GitHub:", + "share-invite-trouble": "Имате проблем с достъпа до връзката за покана?", + "share-title": "Споделяне на достъпа", + "survey-data-limits-title": "Помогнете ни да разберем как да подобрим ограниченията за данните", + "survey-decline": "Отхвърляне", + "survey-disclaimer": "Когато кликнете върху „Напред“, ще преминете към кратка анкета в Google Формуляри. Препоръчваме да я попълните, докато сте установили връзка с Outline.", + "survey-go-to-survey": "Към анкетата", + "terms-of-service": "Прочетох и разбирам {openLink}Общите условия на Outline{closeLink}" +} diff --git a/server_manager/messages/bn.json b/server_manager/messages/bn.json new file mode 100644 index 0000000000..32397ac606 --- /dev/null +++ b/server_manager/messages/bn.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline হল Jigsaw-এর একটি ওপেন সোর্স প্রজেক্ট যা সংবাদ সংস্থা এবং সাংবাদিকদের জন্য ইন্টারনেট অ্যাক্সেস করার একটি নিরাপদ উপায় প্রদান করার উদ্দেশ্যে তৈরি করা হয়েছে।

Outline হল Shadowsocks-এর পরিচালিত একটি প্রোডাক্ট এবং এটি এখনও প্রথমিক পর্যায়ে আছে। আপনি GitHub-এর কোডে কন্ট্রিবিউট করতে পারেন এবং আমরা যখন আরও প্ল্যাটফর্মে পরিষেবা উপলভ্য করব এবং নতুন ফিচার যোগ করব তা জানার জন্য আমাদের Reddit এবং Medium-এ ফলো করতে পারেন।", + "about-version": "ভার্সন {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} দৃষ্টান্ত স্ক্রিনে নেভিগেট করুন।", + "aws-lightsail-firewall-1": "আপনি যে দৃষ্টান্তে Outline হোস্ট করতে চান সেটিতে ক্লিক করুন।", + "aws-lightsail-firewall-2": "'নেটওয়ার্কিং' (Networking) ট্যাবে নেভিগেট করুন।", + "aws-lightsail-firewall-3": "'ফায়ারওয়াল' (Firewall) বিভাগে, 'অন্য একটি যোগ করুন' (Add another) বিকল্পে ক্লিক করুন।", + "aws-lightsail-firewall-4": "'সব টিসিপি+ইউডিপি' (All TCP+UDP)-তে 'অ্যাপ্লিকেশন'-এর মান সেট করুন।", + "aws-lightsail-firewall-5": "'সেভ করুন' (Save) বিকল্পে ক্লিক করুন।", + "cancel": "বাতিল করুন", + "close": "বন্ধ করুন", + "confirmation-server-destroy": "বর্তমান ব্যবহারকারীদের অ্যাক্সেস চলে যাবে। একবার মুছে দিলে সার্ভারটি আর ফিরে পাবেন না।", + "confirmation-server-destroy-title": "সার্ভার মুছে দেবেন?", + "confirmation-server-remove": "এই কাজটি Outline Manager থেকে আপনার সার্ভার সরিয়ে দেবে, কিন্তু ব্যবহারকারীদের জন্য প্রক্সি অ্যাক্সেস ব্লক করবে না। আপনাকে এখনও নিজের হোস্ট মেশিন থেকে Outline সার্ভার ম্যানুয়ালি মুছতে হবে।", + "confirmation-server-remove-title": "সার্ভার সরিয়ে দেবেন?", + "data-limit": "ডেটা ব্যবহারের সীমা", + "data-limit-per-key": "প্রত্যেক 'কী' পিছু ডেটা ব্যবহারের সীমা", + "data-limits": "ডেটা ব্যবহারের সীমা", + "data-limits-description": "এই সার্ভারে 'অ্যাক্সেস কী'-এর জন্য ৩০ দিনের ট্রেলিং ডেটা ট্রান্সফার করার সীমা সেট করুন।", + "data-limits-dialog-text": "এই সার্ভারে 'অ্যাক্সেস কী'-এর জন্য ডেটা ট্রান্সফারের সীমা সেট করতে 'সেটিংস' ট্যাবে যান।", + "data-limits-dialog-title": "ডেটা ব্যবহারের সীমা পেরোনো এড়ান", + "data-limits-disclaimer": "আপনি এখন মেট্রিক্সের ব্যাপারে অভিযোগ জানাচ্ছেন বলে 'ডেটা ব্যবহারের সীমা' ফিচার কীভাবে ব্যবহার করা হয়েছে তা অন্তর্ভুক্ত করা হবে। আরও বিশদে জানার জন্য {openLink}তথ্য সংগ্রহ সংক্রান্ত নীতি{closeLink} দেখুন।", + "data-limits-usage": "{total}-এর মধ্যে {used} ব্যবহার করা হয়েছে", + "destroy": "মুছে দিন", + "digitalocean-disconnect-account": "DigitalOcean অ্যাকাউন্ট ডিসকানেক্ট করুন", + "digitalocean-unreachable": "এই সমস্যা আপনার নেটওয়ার্কের ফায়ারওয়াল বা digitalocean.com সাইটে কানেকশন সংক্রান্ত অস্থায়ী সমস্যার কারণে হতে পারে।", + "disabled": "বন্ধ করা আছে", + "disconnect": "ডিসকানেক্ট করুন", + "done": "হয়ে গেছে", + "enabled": "চালু করা আছে", + "error-connectivity": "আপনার DigitalOcean অ্যাকাউন্টের সাথে কানেক্ট করতে আমাদের সমস্যা হচ্ছে। এটি কখনও কখনও DigitalOcean বা আপনার ইন্টারনেট কানেকশনের সাথে হওয়া একটি অস্থায়ী সমস্যা। আবার চেষ্টা করলেও যদি কাজ না হয়, তাহলে DigitalOcean-এ আবার লগ-ইন করলে সমস্যার সমাধান হওয়ার কথা।", + "error-connectivity-title": "কানেকশন সংক্রান্ত সমস্যা", + "error-do-account-info": "DigitalOcean অ্যাকাউন্ট সংক্রান্ত তথ্য পাওয়া যায়নি", + "error-do-auth": "DigitalOcean-এর মাধ্যমে যাচাইকরণ সম্পূর্ণ করা যায়নি", + "error-do-limit": "আপনার DigitalOcean অ্যাকাউন্ট {num}টি ড্রপলেটের সীমাতে পৌঁছে গেছে। আপনি এখানে এটি বাড়ানোর অনুরোধ করতে পারবেন: https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "উপলভ্য অঞ্চলের তালিকা পাওয়া যায়নি", + "error-do-warning": "DigitalOcean-এর সতর্কতা: \"{message}\"", + "error-feedback": "মতামত জমা দেওয়া যায়নি। আবার চেষ্টা করুন।", + "error-gcp-auth": "Google Cloud Platform-এর মাধ্যমে যাচাই করা যায়নি", + "error-hostname-invalid": "এটি একটি IP অ্যাড্রেস বা বৈধ হোস্টনেম হতে হবে।", + "error-key-add": "'কী' যোগ করা যায়নি", + "error-key-remove": "'কী' সরিয়ে দেওয়া যায়নি", + "error-key-rename": "'কী'-এর নাম পরিবর্তন করা যায়নি", + "error-keys-get": "'কী' লোড করা যায়নি", + "error-keys-port-bad-input": "পোর্টটি অবশ্যই 1 এবং 65,535-এর মধ্যে একটি পূর্ণসংখ্যা হতে হবে।", + "error-keys-port-in-use": "পোর্টটি আগে থেকেই সার্ভারে ব্যবহার করা হচ্ছে।", + "error-licenses": "লাইসেন্স লোড করা যায়নি।", + "error-metrics": "সমস্যা সংক্রান্ত সেটিংয়ের মেট্রিক চালু করা হয়েছে", + "error-network": "নেটওয়ার্ক সংক্রান্ত সমস্যা হয়েছে।", + "error-not-saved": "সেভ করা হয়নি", + "error-remove-data-limit": "ডেটা ব্যবহারের ডিফল্ট সীমা বন্ধ করা যায়নি", + "error-remove-per-key-limit": "এই 'অ্যাক্সেস কী' থেকে ডেটা ব্যবহারের সীমা সরিয়ে দেওয়া যায়নি", + "error-server-creation": "আপনার Outline সার্ভার তৈরি করার সময় কোনও সমস্যা হয়েছে।", + "error-server-destroy": "সার্ভার মোছা যায়নি", + "error-server-removed": "আপনার DigitalOcean অ্যাকাউন্টে {serverName} আর উপস্থিত নেই।", + "error-server-rename": "সার্ভারের নাম পরিবর্তন করা যায়নি", + "error-server-unreachable": "আপনার Outline সার্ভার সঠিকভাবে ইনস্টল করা হয়েছে, কিন্তু আমরা এটির সাথে কানেক্ট করতে পারছি না। সম্ভবত, এটির কারণ হল আপনার সার্ভারের ফায়ারওয়াল সংক্রান্ত নিয়ম ইনকামিং কানেকশন ব্লক করছে। সেগুলি পর্যালোচনা করুন এবং 1024 থেকে 65535 পর্যন্ত পোর্টগুলিতে ইনকামিং TCP কানেকশনে অনুমতি দেওয়ার বিষয়টি নিশ্চিত করুন।", + "error-server-unreachable-title": "আপনার Outline সার্ভারে কানেক্ট করা যায়নি", + "error-servers-removed": "আপনার DigitalOcean অ্যাকাউন্টে {serverNames} আর উপস্থিত নেই।", + "error-set-data-limit": "ডেটা ব্যবহারের ডিফল্ট সীমা সেট করা যায়নি", + "error-set-per-key-limit": "এই 'অ্যাক্সেস কী'-এর জন্য ডেটা ব্যবহারের সীমা সেট করা যায়নি", + "error-unexpected": "কোনও অপ্রত্যাশিত সমস্যা হয়েছে।", + "experimental": "পরীক্ষামূলক", + "experiments": "পরীক্ষা", + "experiments-description": "বিভিন্ন নতুন ফিচার পরীক্ষা করুন এবং সেগুলি প্রকাশ হওয়ার আগেই আপনার মতামত আমাদের জানান।", + "experiments-disclaimer": "পরীক্ষা-নিরীক্ষা চলছে তাই ফিচারে পরিবর্তন হতে পারে বা ফিচার অ্যাপ থেকে সরিয়ে দেওয়া হতে পারে। আপনি যদি বর্তমানে মেট্রিক্স সম্পর্কে অভিযোগ জানাচ্ছেন, তাহলে পরীক্ষামূলক ফিচারের ব্যবহার অন্তর্ভুক্ত করা হবে। আরও বিশদে জানার জন্য {openLink}তথ্য সংগ্রহ সংক্রান্ত নীতি{closeLink} দেখুন।", + "experiments-feedback": "কোনও সাজেশন দিতে চান? {openLink}এখানে মতামত জমা দিন।{closeLink}", + "feedback-cloud-provider": "ক্লাউড পরিষেবা প্রদানকারী বেছে নিন", + "feedback-cloud-provider-error": "কোনও ক্লাউড পরিষেবা প্রদানকারী বেছে নিন।", + "feedback-connection": "আমার সার্ভারে কানেক্ট করা যাচ্ছে না", + "feedback-connection-others": "অন্যেরা আমার সার্ভারে কানেক্ট করতে পারছেন না", + "feedback-disclaimer": "মনে রাখবেন, আমাদের টিম শুধুমাত্র ইংরেজিতে মতামতের উত্তর দিতে পারে।", + "feedback-email": "ইমেল আইডি (ঐচ্ছিক)", + "feedback-error": "মতামত লিখুন।", + "feedback-explanation-install": "আপনার সার্ভারে Outline ইনস্টলেশনের চেষ্টা করার সময় কোনও সমস্যা হয়েছে। আপনি যদি কোনও সমাধান বের করতে না পারেন, তাহলে আমাদের মতামত পাঠানোর কথা বিবেচনা করুন এবং আপনার ইমেল আইডি (ঐচ্ছিক) বলুন যাতে আমরা আপনাকে সাহায্য করতে পারি।", + "feedback-general": "সাধারণ মতামত", + "feedback-install": "Outline ইনস্টল করতে সমস্যা হচ্ছে", + "feedback-label": "আপনার মতামত", + "feedback-management": "আমার সার্ভার ম্যানেজ করতে সমস্যা হচ্ছে", + "feedback-other": "অন্য", + "feedback-privacy": "আপনার মতামত, ইমেল আইডি (যদি প্রদান করা হয়) এবং {openLink}গোপনীয়তা নীতিতে{closeLink} উল্লেখ করা অতিরিক্ত তথ্য Outline টিমের কাছে পাঠানো হবে।", + "feedback-submit": "জমা দিন", + "feedback-suggestion": "সাজেশন", + "feedback-title-generic": "মতামত জানান", + "feedback-title-install": "Outline সার্ভার ইনস্টল করা যায়নি", + "gcp-billing-action": "পরবর্তী", + "gcp-billing-body": "{openLink}Google Cloud-এ আপনার একটি বিলিং অ্যাকাউন্ট যোগ করার{closeLink} জন্য অপেক্ষা করা হচ্ছে", + "gcp-billing-description": "{openLink}Cloud Console বিলিং পৃষ্ঠা{closeLink} খুলুন এবং এগিয়ে যাওয়ার জন্য একটি অ্যাকাউন্ট যোগ করুন।", + "gcp-billing-error": "বিলিং তথ্য ফিরিয়ে আনা যায়নি", + "gcp-billing-error-zero": "এগিয়ে যাওয়ার আগে আপনাকে অবশ্যই একটি বিলিং অ্যাকাউন্ট যোগ করতে হবে।", + "gcp-click-create": "'তৈরি করুন' (Create) বিকল্পে ক্লিক করুন।", + "gcp-create-new-project": "{openLink}নতুন Google Cloud প্রোজেক্ট তৈরি করা{closeLink}।", + "gcp-create-new-vm": "{openLink}নতুন VM দৃষ্টান্ত তৈরি করুন{closeLink}।", + "gcp-create-project": "Google Cloud প্রোজেক্ট তৈরি করা", + "gcp-create-server": "আপনার Google Cloud প্রোজেক্ট তৈরি করা", + "gcp-create-vm": "VM দৃষ্টান্ত তৈরি করা", + "gcp-disconnect-account": "Google Cloud Platform অ্যাকাউন্ট ডিসকানেক্ট করুন", + "gcp-firewall-create-0": "আপনার Compute Engine প্রোজেক্টে {openLink}একটি নতুন ফায়ারওয়াল নিয়ম যোগ করা{closeLink}।", + "gcp-firewall-create-1": "'নাম' (Name) ফিল্ডে 'আউটলাইন' (Outline) লিখুন।", + "gcp-firewall-create-2": "'টার্গেট ট্যাগ' (Target tags) ফিল্ডে 'Outline' লিখুন।", + "gcp-firewall-create-3": "'সোর্স IP ব্যাপ্তি' (Source IP ranges) ফিল্ডে '0.0.0.0/0' লিখুন।", + "gcp-firewall-create-4": "'প্রোটোকল এবং পোর্ট' (Protocols and ports) বিকল্পে গিয়ে 'সবকটিতে অনুমতি দিতে চাই' (Allow all) বিকল্প বেছে নিন।", + "gcp-name-your-project": "'প্রোজেক্টের নাম' (Project name) ফিল্ডে আপনার প্রোজেক্টের নাম লিখুন।", + "gcp-project-setup-error": "আপনার Google Cloud প্রোজেক্ট সেট-আপ করার সময় কোনও সমস্যা হয়েছে", + "gcp-select-machine-type": "'মেশিনের ধরন' (Machine type) বিকল্পে গিয়ে 'এফ১-মাইক্রো' (f1-micro) বেছে নিন", + "gcp-select-networking": "'ম্যানেজমেন্ট (Management), নিরাপত্তা (security), ডিস্ক (disks), নেটওয়ার্কিং (networking), সোল টেনেন্সি' (sole tenancy) বিকল্পে ক্লিক করার পরে 'নেটওয়ার্কিং' (Networking) বিকল্পে ক্লিক করুন", + "gcp-select-region": "সার্ভারের ব্যবহারকারীরা যেখানে আছেন বলে উল্লেখ করবেন 'অঞ্চল' (Region) বিকল্পে গিয়ে তার কাছাকাছি কোনও অঞ্চল বেছে নিন।", + "gcp-type-network-tag": "'নেটওয়ার্ক ট্যাগ' (Network tags) ফিল্ডে 'আউটলাইন' (Outline) লিখুন", + "gcp-type-outline-server": "'নাম' (Name) ফিল্ডে 'Outline-সার্ভার' লিখুন।", + "geo-amsterdam": "আমস্টারডাম", + "geo-bangalore": "বেঙ্গালুরু", + "geo-changhua-county": "চাংহুয়া কাউন্টি", + "geo-delhi": "দিল্লি", + "geo-eemshaven": "ইমশ্যাভেন", + "geo-frankfurt": "ফ্রাঙ্কফুর্ট", + "geo-hamina": "হামিনা", + "geo-hk": "হংকং", + "geo-iowa": "আইওয়া", + "geo-jakarta": "জাকার্তা", + "geo-jurong-west": "জুরং ওয়েস্ট", + "geo-las-vegas": "লাস ভেগাস", + "geo-london": "লন্ডন", + "geo-los-angeles": "লস অ্যাঞ্জেলেস", + "geo-melbourne": "মেলবার্ন", + "geo-montreal": "মন্ট্রিয়ল", + "geo-mumbai": "মুম্বাই", + "geo-new-york-city": "নিউ ইয়র্ক", + "geo-northern-virginia": "উত্তর ভার্জিনিয়া", + "geo-oregon": "অরেগন", + "geo-osaka": "ওসাকা", + "geo-salt-lake-city": "সল্ট লেক সিটি", + "geo-san-francisco": "সান ফ্রান্সিসকো", + "geo-sao-paulo": "সাও পাওলো", + "geo-seoul": "সিওল", + "geo-sg": "সিঙ্গাপুর", + "geo-south-carolina": "সাউথ ক্যারোলিনা", + "geo-st-ghislain": "সেন্ট ঘিসলেন", + "geo-sydney": "সিডনি", + "geo-tokyo": "টোকিও", + "geo-toronto": "টরোন্টো", + "geo-warsaw": "ওয়ারশ", + "geo-zurich": "জুরিখ", + "key": "{keyId} কী", + "manual-server-assign-firewall": "ফায়ারওয়াল সংক্রান্ত নিয়ম অ্যাসাইন করা", + "manual-server-assign-group": "নিরাপত্তা গ্রুপ অ্যাসাইন করা", + "manual-server-create-firewall": "ফায়ারওয়াল সংক্রান্ত নিয়ম তৈরি করা", + "manual-server-create-group": "একটি নিরাপত্তা গ্রুপ তৈরি করা", + "manual-server-description": "এইসব ধাপ আপনাকে {cloudProvider} Linux সার্ভারে Outline ইনস্টল করতে সাহায্য করবে।", + "manual-server-firewall": "আপনার ফায়ারওয়াল কনফিগার করা", + "manual-server-install-paste": "আপনার ইনস্টলেশন আউটপুট এখানে পেস্ট করুন।", + "manual-server-install-run": "আপনার সার্ভারে লগ-ইন করে এই কমান্ড রান করুন।", + "manual-server-instructions": "নির্দেশাবলী", + "manual-server-show-me": "কোথায় আছে আমি তা দেখতে চাই", + "manual-server-title": "নিচে উল্লেখ করা নির্দেশাবলী অনুসরণ করুন", + "metrics-description": "আপনার জন্য এবং আপনি যাদের সাথে নিজের সার্ভার শেয়ার করেন তাদের জন্য Outline-এর নির্ভরযোগ্যতা এবং পারফর্ম্যান্স উন্নত করতে পরিচয় গোপন করা মেট্রিক্স শেয়ার করুন। {openLink}আরও জানুন।{closeLink}", + "metrics-share": "মেট্রিক্স শেয়ার করুন", + "metrics-skip": "এড়িয়ে যান", + "metrics-title": "মেট্রিক্স শেয়ার করা", + "nav-about": "সম্পর্কে", + "nav-data-collection": "ডেটা সংগ্রহ", + "nav-feedback": "মতামত", + "nav-help": "সহায়তা", + "nav-licenses": "লাইসেন্স", + "nav-privacy": "গোপনীয়তা", + "nav-terms": "শর্তাবলী", + "no-data-limit": "কোনওটিই নয়", + "notification-app-update": "Outline Manager-এর একটি আপডেট করা ভার্সন ডাউনলোড করা হয়েছে। আপনি অ্যাপ্লিকেশন রিস্টার্ট করলে, এটি ইনস্টল হয়ে যাবে।", + "notification-feedback-thanks": "আমাদের পরিষেবা আরও উন্নত করতে সাহায্য করার জন্য ধন্যবাদ! আমরা আপনার মতামত জানতে পছন্দ করি।", + "notification-key-added": "'কী' যোগ করা হয়েছে", + "notification-key-removed": "'কী' সরিয়ে দেওয়া হয়েছে", + "notification-server-destroyed": "সার্ভার মুছে দেওয়া হয়েছে", + "notification-server-exists": "সার্ভার আগেই যোগ করা হয়েছে", + "notification-server-removed": "সার্ভার সরিয়ে দেওয়া হয়েছে", + "oauth-account-active": "আপনার DigitalOcean অ্যাকাউন্ট অ্যাক্টিভেট করা হয়েছে।", + "oauth-account-active-tag": "অ্যাকাউন্ট অ্যাক্টিভেট করা হয়েছে! সার্ভারের লোকেশন লোড করা হচ্ছে...", + "oauth-activate-account": "আপনার DigitalOcean অ্যাকাউন্ট অ্যাক্টিভেট করুন।", + "oauth-billing": "digitalocean.com সাইটে আপনার বিলিং তথ্য লিখুন এবং আপনার কাজ হয়ে গেলে অ্যাপে ফিরে যান।", + "oauth-billing-tag": "বিলিং তথ্য লিখুন...", + "oauth-connect-description": "Outline, আপনার অ্যাকাউন্টের মাধ্যমে একটি সার্ভার তৈরি ও কানেক্ট করা সহজ করে তোলে।", + "oauth-connect-tag": "আপনার অ্যাকাউন্টে কানেক্ট করার জন্য অপেক্ষা করা হচ্ছে...", + "oauth-connect-title": "সাইন-ইন করুন বা DigitalOcean-এর সাথে একটি অ্যাকাউন্ট তৈরি করুন।", + "oauth-sign-out": "সাইন-আউট করুন", + "oauth-verify": "DigitalOcean-এর পাঠানো ইমেলের জন্য আপনার ইনবক্স চেক করুন, এবং আপনার অ্যাকাউন্ট কনফার্ম করতে এটির লিঙ্কে ক্লিক করুন।", + "oauth-verify-tag": "আপনার ইমেল আইডি কনফার্ম করুন...", + "okay": "ঠিক আছে", + "per-key-data-limit-dialog-set-custom": "ডেটা ব্যবহারের কাস্টম সীমা সেট করুন", + "per-key-data-limit-dialog-title": "ডেটা ব্যবহারের সীমা - {keyName}", + "region-best-value": "সেরা দাম", + "region-description": "আপনি এখান থেকেই ইন্টারনেট ব্যবহারের অভিজ্ঞতা পাবেন।", + "region-setup": "Outline সেট-আপ করুন", + "region-title": "আপনার সার্ভারের লোকেশন বেছে নিন।", + "remove": "সরিয়ে দিন", + "retry": "আবার চেষ্টা করুন", + "save": "সেভ করুন", + "saved": "সেভ করা হয়েছে", + "saving": "সেভ করা হচ্ছে...", + "server-access": "সার্ভার অ্যাক্সেস", + "server-access-key-new": "নতুন 'কী' যোগ করুন", + "server-access-key-rename": "নাম পরিবর্তন করুন", + "server-access-keys": "অ্যাক্সেস কী", + "server-connections": "কানেকশন", + "server-data-transfer": "ডেটা ট্রান্সফার করা হয়েছে / গত ৩০ দিনে", + "server-data-used": "অনুমতি ব্যবহার করা হয়েছে / গত ৩০ দিনে", + "server-destroy": "সার্ভার মুছে দিন", + "server-help-access-key-description": "বন্ধুদের সাথে 'অ্যাক্সেস কী' শেয়ার করুন, যাতে তারা আপনার Outline সার্ভারের সাথে কানেক্ট করতে পারেন। তারা তাদের সব ডিভাইসে একই 'অ্যাক্সেস কী' ব্যবহার করতে পারবেন।", + "server-help-access-key-next": "পরবর্তী", + "server-help-access-key-title": "'কী' তৈরি করে অ্যাক্সেস শেয়ার করুন", + "server-help-connection-description": "আপনার Outline সার্ভারে নিজের ব্যক্তিগত 'অ্যাক্সেস কী' ব্যবহার করে Outline ক্লায়েন্ট অ্যাপ ইনস্টল করতে এখানে ক্লিক করুন।", + "server-help-connection-ok": "ঠিক আছে, বুঝেছি!", + "server-help-connection-title": "আপনি এখনও কানেক্ট করে নেই!", + "server-keys": "কী", + "server-my-access-key": "আমার 'অ্যাক্সেস কী'", + "server-name": "Outline সার্ভার {serverLocation}", + "server-remove": "সার্ভার সরিয়ে দিন", + "server-settings": "সেটিংস", + "server-unreachable": "সার্ভারে পৌঁছানো যাচ্ছে না", + "server-unreachable-description": "এই সার্ভারের সাথে কানেক্ট করতে আমাদের সমস্যা হচ্ছে।", + "server-unreachable-managed-description": "আবার চেষ্টা করুন বা অ্যাপ্লিকেশন থেকে এই সার্ভার সরিয়ে দিন।", + "server-unreachable-manual-description": "আবার চেষ্টা করুন বা এই সার্ভার এবং ভার্চুয়াল হোস্ট মুছে দিন।", + "server-usage": "ব্যবহার (গত ৩০ দিনে)", + "servers-add": "সার্ভার যোগ করুন", + "servers-digitalocean": "DigitalOcean সার্ভার", + "servers-gcp": "Google Cloud Platform সার্ভার", + "servers-manual": "সার্ভার", + "settings-access-key-port": "নতুন 'অ্যাক্সেস কী'-এর জন্য পোর্ট", + "settings-metrics-header": "পরিচয় গোপন করা মেট্রিক্স শেয়ার করুন", + "settings-server-api-url": "ম্যানেজমেন্ট API URL", + "settings-server-cost": "মাসিক খরচ", + "settings-server-creation": "তৈরি করা হয়েছে", + "settings-server-hostname": "হোস্টনেম", + "settings-server-id": "সার্ভার আইডি", + "settings-server-info": "সার্ভার সংক্রান্ত তথ্য", + "settings-server-location": "সার্ভার লোকেশন", + "settings-server-name": "নাম", + "settings-server-rename": "আপনার সার্ভারের জন্য একটি নতুন নাম সেট করা। মনে রাখবেন, আপনি এতে কানেক্ট করার জন্য যেসব ব্যবহারকারীকে আমন্ত্রণ জানিয়েছেন তাদের ডিভাইসে এই নাম প্রতিফলিত হবে না।", + "settings-server-version": "সার্ভারের ভার্সন", + "settings-transfer-limit": "ডেটা ট্রান্সফার করার অনুমতি দেওয়া", + "setup-action": "সেট-আপ করুন", + "setup-advanced": "উন্নত", + "setup-anywhere": "যেকোনও জায়গায় Outline সেট-আপ করা", + "setup-cancel": "যেকোনও সময় বাতিল করুন", + "setup-create": "সার্ভার তৈরি করুন", + "setup-description": "কোনও সার্ভার নেই? DigitalOcean-এ অ্যাকাউন্ট তৈরি করুন।", + "setup-do-cost": "কেবল মাসে US$৬", + "setup-do-create": "১ টিবি (TB) ডেটা ট্রান্সফার করতে প্রত্যেক ৩০ দিনের জন্য অতিরিক্ত US$৬ খরচ করে আপনার DigitalOcean অ্যাকাউন্ট দিয়ে একটি নতুন সার্ভার তৈরি করুন।", + "setup-do-data": "১ টিবি (TB) ডেটা ট্রান্সফারের অনুমতি দেওয়া", + "setup-do-description": "এতে কিছুটা সময় লাগতে পারে। আপনি এই সার্ভার যেকোনও সময় মুছে দিতে পারবেন।", + "setup-do-easiest": "সেট-আপের প্রসেস সবচেয়ে সহজ", + "setup-do-title": "Outline সেট-আপ করা হচ্ছে।", + "setup-firewall-instructions": "ফায়ারওয়াল সংক্রান্ত নির্দেশাবলী", + "setup-gcp-create": "আপনার Google অ্যাকাউন্ট ব্যবহার করে একটি নতুন সার্ভার তৈরি করুন। লোকেশন ও ব্যবহার অনুযায়ী মূল্যে পার্থক্য হতে পারে।", + "setup-gcp-easy": "সেট-আপের প্রসেস খুবই সহজ", + "setup-gcp-free-tier": "{openLinkFreeTier}ফ্রি টিয়ারের{closeLink} সাথে, {openLinkIpPrice}মাসে US$৩{closeLink} মূল্যে আপনার প্রথম সার্ভার শুরু করুন", + "setup-gcp-free-trial": "নতুন ব্যবহারকারীদের জন্য{openLinkFreeTrial}৯০ দিনের ফ্রি ট্রায়াল{closeLink}", + "setup-gcp-promo": "Google Cloud-এর জন্য নতুন অটোমেটিক Outline সার্ভার তৈরির প্রসেস ব্যবহার করে দেখুন", + "setup-recommended": "সাজেস্ট করা হয়েছে", + "setup-simple-commands": "ইনস্টল করার সহজ কমান্ড", + "setup-step-by-step": "ধাপে-ধাপে সেট-আপ করার গাইড", + "setup-tested": "VULTR, Linode ও Liquid Web-এ পরীক্ষিত", + "setup-title": "Outline সেট-আপ করতে একটি ক্লাউড পরিষেবা বেছে নিন।", + "share-description": "এই আমন্ত্রণটি কপি করুন এবং আপনার বিশ্বাসযোগ্য কোনও যোগাযোগের টুল ব্যবহার করে এটি পাঠান। {openLink}সাহায্য চান?{closeLink}", + "share-invite-access-key-copied": "ক্লিপবোর্ডে 'অ্যাক্সেস কী' কপি করা হয়েছে", + "share-invite-copied": "ক্লিপবোর্ডে আমন্ত্রণ কপি করা হয়েছে", + "share-invite-copy": "আমন্ত্রণ কপি করুন", + "share-invite-copy-access-key": "'অ্যাক্সেস কী' কপি করুন", + "share-invite-html": "ওপেন ইন্টারনেট নিরাপদে অ্যাক্সেস করতে এই সার্ভার ব্যবহার করুন:

১) আপনার ডিভাইসে Outline অ্যাপ ডাউনলোড করে ইনস্টল করুন:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android-এর জন্য বিকল্প লিঙ্ক: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

২) আপনি একটি 'অ্যাক্সেস কী' পাবেন যা ss:// দিয়ে শুরু হবে। আপনি 'অ্যাক্সেস কী' পাওয়ার পরে সেটি কপি করুন।

৩) Outline ক্লায়েন্ট অ্যাপ খুলুন। আপনার 'অ্যাক্সেস কী' অটোমেটিক শনাক্ত করা হলে, \"কানেক্ট করুন\" বিকল্পে ট্যাপ করে এগিয়ে যান। আপনার 'অ্যাক্সেস কী' যদি অটোমেটিক শনাক্ত না হয়, তাহলে এটিকে সংশ্লিষ্ট ফিল্ডে পেস্ট করুন, তারপরে \"কানেক্ট করুন\" বিকল্পে ট্যাপ করুন এবং এগিয়ে যান।

আপনি ওপেন ইন্টারনেট ব্যবহার করার জন্য প্রস্তুত! আপনি সার্ভারের সাথে কানেক্ট হয়েছেন কিনা তা নিশ্চিত করতে, Google Search-এ \"আমার ip কী\" (what is my ip) সার্চ করে দেখুন। Google-এ দেখানো আইপি অ্যাড্রেসটি Outline ক্লায়েন্টের আইপি অ্যাড্রেসের সাথে মেলার কথা।

Outline সম্পর্কে এখানে আরও জানুন: https://getoutline.org/", + "share-invite-instructions": "GitHub-এ আমাদের আমন্ত্রণ সংক্রান্ত নির্দেশাবলী অনুসরণ করুন:", + "share-invite-trouble": "আমন্ত্রণের লিঙ্ক অ্যাক্সেস করতে সমস্যা হচ্ছে?", + "share-title": "অ্যাক্সেস শেয়ার করুন", + "survey-data-limits-title": "কীভাবে ডেটা ব্যবহারের সীমা বাড়ানো যাবে তা বুঝতে আমাদের সাহায্য করুন", + "survey-decline": "প্রত্যাখ্যান করুন", + "survey-disclaimer": "'এগিয়ে যান' বিকল্পে ক্লিক করলে, আপনাকে Google Forms-এ হোস্ট করা একটি ছোট সমীক্ষায় পাঠানো হবে। Outline-এ কানেক্ট থাকাকালীন সমীক্ষায় অংশ নিতে আমরা সাজেস্ট করি।", + "survey-go-to-survey": "সমীক্ষাতে যান", + "terms-of-service": "আমি {openLink}Outline পরিষেবার শর্তাবলী{closeLink} পড়েছি ও তা বুঝে নিয়েছি" +} diff --git a/server_manager/messages/bs.json b/server_manager/messages/bs.json new file mode 100644 index 0000000000..0fa975b4c5 --- /dev/null +++ b/server_manager/messages/bs.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline je projekat otvorenog koda iz kompanije Jigsaw koji novinskim agencijama i novinarima pruža sigurniji način pristupa internetu.

Outline omogućava Shadowsocks i još uvijek je proizvod u ranoj fazi razvoja. Kodu možete doprinijeti na web lokaciji GitHub i pratiti nas na mrežama Reddit i Medium da saznate kada se proširimo na više platformi i dodamo nove funkcije.", + "about-version": "Verzija {version}", + "aws-lightsail-firewall-0": "Pređite na ekran instanci za {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Kliknite na instancu na kojoj želite hostirati Outline.", + "aws-lightsail-firewall-2": "Pređite na karticu Umrežavanje (\"Networking\").", + "aws-lightsail-firewall-3": "U odjeljku Zaštitni zid (\"Firewall\") kliknite na Dodaj drugi (\"Add another\").", + "aws-lightsail-firewall-4": "Postavite vrijednost Aplikacija (\"Application\") na Svi TCP+UDP (\"All TCP+UDP\").", + "aws-lightsail-firewall-5": "Kliknite na Sačuvaj (\"Save\").", + "cancel": "Otkaži", + "close": "Zatvori", + "confirmation-server-destroy": "Postojeći korisnici će izgubiti pristup. Ovu radnju nije moguće opozvati.", + "confirmation-server-destroy-title": "Eliminirati server?", + "confirmation-server-remove": "Ova radnja uklanja vaš server iz Outline Managera, ali ne blokira korisnicima pristup proksi serveru. I dalje ćete morati ručno izbrisati Outline server s host računara.", + "confirmation-server-remove-title": "Ukloniti server?", + "data-limit": "Ograničenje prijenosa podataka", + "data-limit-per-key": "Ograničenje podataka po ključu", + "data-limits": "Ograničenja prijenosa podataka", + "data-limits-description": "Postavite prateće ograničenje za prijenos podataka od 30 dana za pristupne ključeve na ovom serveru.", + "data-limits-dialog-text": "Idite na karticu Postavke da postavite ograničenje prijenosa podataka za pristupne ključeve na ovom serveru.", + "data-limits-dialog-title": "Izbjegnite prekomjernu potrošnju prijenosa podataka", + "data-limits-disclaimer": "Pošto trenutno imate izvještavanje o pokazateljima, bit će uključeno korištenje funkcije za ograničenje prijenosa podataka. Više detalja pogledajte u {openLink}pravilima za prikupljanje podataka{closeLink}.", + "data-limits-usage": "Iskorišteno {used} od {total}", + "destroy": "Eliminiraj", + "digitalocean-disconnect-account": "Prekinite vezu s DigitalOcean računom", + "digitalocean-unreachable": "Ova greška se možda pojavila zbog zaštitnog zida na vašoj mreži ili privremenog problema s povezivanjem na digitalocean.com.", + "disabled": "Onemogućeno", + "disconnect": "Prekini vezu", + "done": "Gotovo", + "enabled": "Omogućeno", + "error-connectivity": "Imamo poteškoća s povezivanjem na vaš DigitalOcean račun. Ovo je privremeni problem koji se ponekad javlja s DigitalOceanom ili vašom internetskom vezom. Pokušajte ponovo. Ako to ne uspije, ponovno prijavljivanje na DigitalOcean bi trebalo riješiti problem.", + "error-connectivity-title": "Problem s povezivanjem", + "error-do-account-info": "Preuzimanje informacija o DigitalOcean računu nije uspjelo", + "error-do-auth": "Autentifikacija na DigitalOceanu nije uspjela", + "error-do-limit": "Vaš DigitalOcean račun je dostignuo ograničenje dropleta od {num}. Možete zatražiti povećanje na https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Preuzimanje liste dostupnih regija nije uspjelo", + "error-do-warning": "Upozorenje za DigitalOcean: \"{message}\"", + "error-feedback": "Slanje povratnih informacija nije uspjelo. Pokušajte ponovo.", + "error-gcp-auth": "Autentifikacija pomoću Google Cloud Platforme nije uspjela", + "error-hostname-invalid": "Mora biti IP adresa ili važeći naziv host računara.", + "error-key-add": "Dodavanje ključa nije uspjelo", + "error-key-remove": "Uklanjanje ključa nije uspjelo", + "error-key-rename": "Promjena naziva ključa nije uspjela", + "error-keys-get": "Učitavanje ključeva nije uspjelo", + "error-keys-port-bad-input": "Priključak mora biti cijeli broj između 1 i 65.535.", + "error-keys-port-in-use": "Priključak se već koristi na drugom serveru.", + "error-licenses": "Učitavanje licenci nije uspjelo.", + "error-metrics": "Greška prilikom omogućavanja pokazatelja", + "error-network": "Došlo je do greške na mreži.", + "error-not-saved": "Nije sačuvano", + "error-remove-data-limit": "Onemogućavanje zadanog ograničenja za prijenos podataka nije uspjelo", + "error-remove-per-key-limit": "Uklanjanje ograničenja za prijenos podataka na ovom pristupnom ključu nije uspjelo", + "error-server-creation": "Došlo je do greške prilikom kreiranja Outline servera.", + "error-server-destroy": "Eliminiranje servera nije uspjelo", + "error-server-removed": "{serverName} se više ne prikazuje na vašem DigitalOcean računu.", + "error-server-rename": "Promjena naziva servera nije uspjela", + "error-server-unreachable": "Vaš Outline server je ispravno instaliran, ali se nismo mogli povezati s njim. To je najvjerovatnije zato što pravila zaštitnog zida servera blokiraju dolazne veze. Pregledajte ih i obavezno dozvolite dolazne TCP veze na priključcima u rasponu od 1024 do 65535.", + "error-server-unreachable-title": "Nije moguće povezivanje na vaš Outline server", + "error-servers-removed": "{serverNames} se više ne prikazuju na vašem DigitalOcean računu.", + "error-set-data-limit": "Postavljanje zadanog ograničenja za prijenos podataka nije uspjelo", + "error-set-per-key-limit": "Postavljanje ograničenja za prijenos podataka za ovaj pristupni ključ nije uspjelo", + "error-unexpected": "Došlo je do neočekivane greške.", + "experimental": "Eksperimentalno", + "experiments": "Eksperimenti", + "experiments-description": "Testirajte nove funkcije i pošaljite nam povratne informacije prije nego što ih objavimo.", + "experiments-disclaimer": "Eksperimenti su u razvoju i mogu se izmijeniti ili ukloniti iz aplikacije. Ako trenutno imate izvještavanje o pokazateljima, bit će uključeno korištenje eksperimentalnih funkcija. Više detalja pogledajte u {openLink}pravilima za prikupljanje podataka{closeLink}.", + "experiments-feedback": "Imate prijedloge? {openLink}Pošaljite povratne informacije ovdje.{closeLink}", + "feedback-cloud-provider": "Odaberite pružaoca usluge oblaka", + "feedback-cloud-provider-error": "Odaberite pružaoca usluge oblaka.", + "feedback-connection": "Ne mogu se povezati sa svojim serverom", + "feedback-connection-others": "Drugi se ne mogu povezati s mojim serverom", + "feedback-disclaimer": "Imajte na umu da naš tim može odgovoriti na povratne informacije samo na engleskom.", + "feedback-email": "Adresa e-pošte (nije obavezno)", + "feedback-error": "Unesite povratne informacije.", + "feedback-explanation-install": "Došlo je do greške prilikom pokušaja instalacije Outlinea na vašem serveru. Ako niste uspjeli pronaći rješenje, možete razmotriti da nam pošaljete povratne informacije i navedete adresu e-pošte (nije obavezno) kako bismo vam mogli odgovoriti.", + "feedback-general": "Opće povratne informacije", + "feedback-install": "Imam poteškoća s instaliranjem Outlinea", + "feedback-label": "Vaše povratne informacije", + "feedback-management": "Imam poteškoća s upravljanjem serverom", + "feedback-other": "Ostalo", + "feedback-privacy": "Vaše povratne informacije, adresa e-pošte (ako je navedete) i dodatne informacije koje se spominju u {openLink}pravilima privatnosti{closeLink} poslat će se timu Outlinea.", + "feedback-submit": "Pošalji", + "feedback-suggestion": "Prijedlozi", + "feedback-title-generic": "Slanje povratnih informacija", + "feedback-title-install": "Instalacija Outline servera nije uspjela", + "gcp-billing-action": "Naprijed", + "gcp-billing-body": "Čekamo da {openLink}dodate račun za naplatu na Google Cloudu{closeLink}", + "gcp-billing-description": "{openLink}Otvorite stranicu za naplatu na konzoli Cloud Console{closeLink} i dodajte račun da nastavite.", + "gcp-billing-error": "Nije moguće preuzeti podatke o naplati", + "gcp-billing-error-zero": "Morate dodati račun za naplatu prije nego što nastavite.", + "gcp-click-create": "Kliknite na Kreiraj (\"Create\").", + "gcp-create-new-project": "{openLink}Kreirajte novi Google Cloud projekat{closeLink}.", + "gcp-create-new-vm": "{openLink}Kreirajte novu VM instancu{closeLink}.", + "gcp-create-project": "Kreiranje Google Cloud projekta", + "gcp-create-server": "Kreirajte Google Cloud projekat", + "gcp-create-vm": "Kreirajte VM instancu", + "gcp-disconnect-account": "Prekini vezu s Google Cloud Platform računom", + "gcp-firewall-create-0": "{openLink}Dodajte novo pravilo zaštitnog zida{closeLink} u svoj projekat Compute Engine.", + "gcp-firewall-create-1": "Upišite \"outline\" u polje Naziv (\"Name\").", + "gcp-firewall-create-2": "Upišite \"outline\" u polje Ciljane oznake (\"Target tags\").", + "gcp-firewall-create-3": "Upišite \"0.0.0.0/0\" u polje Rasponi IP-a izvora (\"Source IP ranges\").", + "gcp-firewall-create-4": "Odaberite Dozvoli sve (\"Allow all\") u opciji Protokoli i priključci (\"Protocols and ports\").", + "gcp-name-your-project": "Dajte naziv svom projektu u polju Naziv projekta (\"Project name\").", + "gcp-project-setup-error": "Došlo je do greške prilikom postavljanja Google Cloud projekta", + "gcp-select-machine-type": "Odaberite \"f1-micro\" u opciji Vrsta mašine \"Machine type\"", + "gcp-select-networking": "Kliknite na Upravljanje, sigurnost, diskovi, umrežavanje, jedan klijent (\"Management, security, disks, networking, sole tenancy\"), zatim na Umrežavanje (\"Networking\")", + "gcp-select-region": "Izaberite regiju u blizini budućih korisnika u opciji Regija (\"Region\").", + "gcp-type-network-tag": "Upišite \"outline\" u polje Oznake mreže (\"Network tags\").", + "gcp-type-outline-server": "Upišite \"outline-server\" u polje Naziv (\"Name\").", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Okrug Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Džakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Anđeles", + "geo-melbourne": "Melburn", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Sjeverna Virdžinija", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisko", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seul", + "geo-sg": "Singapur", + "geo-south-carolina": "Južna Karolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sidnej", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varšava", + "geo-zurich": "Cirih", + "key": "Ključ {keyId}", + "manual-server-assign-firewall": "Dodijelite pravilo zaštitnog zida", + "manual-server-assign-group": "Dodijelite sigurnosnu grupu", + "manual-server-create-firewall": "Kreirajte pravilo zaštitnog zida", + "manual-server-create-group": "Kreirajte sigurnosnu grupu", + "manual-server-description": "Ovi koraci će vam pomoći da instalirate Outline na {cloudProvider} Linux serveru.", + "manual-server-firewall": "Konfigurirajte zaštitni zid", + "manual-server-install-paste": "Ovdje zalijepite izlaz instalacije.", + "manual-server-install-run": "Prijavite se na svoj server i izvršite ovu komandu.", + "manual-server-instructions": "Uputstva", + "manual-server-show-me": "Pokaži mi gdje", + "manual-server-title": "Slijedite uputstva u nastavku", + "metrics-description": "Dijelite anonimizirane pokazatelje i pomozite u poboljšanju pouzdanosti i performansi Outlinea, za vas i one s kojima dijelite server. {openLink}Saznajte više{closeLink}", + "metrics-share": "Dijeli pokazatelje", + "metrics-skip": "Preskoči", + "metrics-title": "Dijeljenje pokazatelja", + "nav-about": "O aplikaciji", + "nav-data-collection": "Prikupljanje podataka", + "nav-feedback": "Povratne informacije", + "nav-help": "Pomoć", + "nav-licenses": "Licence", + "nav-privacy": "Privatnost", + "nav-terms": "Uslovi", + "no-data-limit": "Bez ograničenja", + "notification-app-update": "Preuzeta je ažurirana verzija Outline Managera. Instalirat će se kada ponovo pokrenete ovu aplikaciju.", + "notification-feedback-thanks": "Hvala vam što nam pomažete da se poboljšamo! Volimo čuti vaše mišljenje.", + "notification-key-added": "Dodan je ključ", + "notification-key-removed": "Ključ je uklonjen", + "notification-server-destroyed": "Server je eliminiran", + "notification-server-exists": "Server je već dodan", + "notification-server-removed": "Server je uklonjen", + "oauth-account-active": "Vaš DigitalOcean račun je aktiviran.", + "oauth-account-active-tag": "Račun je aktiviran! Učitavanje lokacija servera...", + "oauth-activate-account": "Aktivirajte DigitalOcean račun.", + "oauth-billing": "Unesite podatke o naplati na web lokaciji digitalocean.com i vratite se u aplikaciju kada završite.", + "oauth-billing-tag": "Unesite podatke o naplati...", + "oauth-connect-description": "Uz račun možete lakše kreirati server i povezati se pomoću Outlinea.", + "oauth-connect-tag": "Čeka se povezivanje s vašim računom...", + "oauth-connect-title": "Prijavite se ili kreirajte račun na DigitalOceanu.", + "oauth-sign-out": "Odjavi me", + "oauth-verify": "Provjerite imate li e-poruku od DigitalOceana u pristigloj pošti i kliknite na link u njoj da potvrdite svoj račun.", + "oauth-verify-tag": "Potvrdite adresu e-pošte...", + "okay": "Uredu", + "per-key-data-limit-dialog-set-custom": "Postavite prilagođeno ograničenje za prijenos podataka", + "per-key-data-limit-dialog-title": "Ograničenje prijenosa podataka – {keyName}", + "region-best-value": "Najbolja vrijednost", + "region-description": "S ovog mjesta će dolaziti vaše iskustvo korištenja interneta.", + "region-setup": "Postavi Outline", + "region-title": "Odaberite lokaciju servera.", + "remove": "Ukloni", + "retry": "Pokušaj ponovo", + "save": "Sačuvaj", + "saved": "Sačuvano", + "saving": "Pohranjivanje...", + "server-access": "Pristup serveru", + "server-access-key-new": "Dodaj novi ključ", + "server-access-key-rename": "Promijeni naziv", + "server-access-keys": "Pristupni ključevi", + "server-connections": "Veze", + "server-data-transfer": "Preneseni podaci / posljednjih 30 dana", + "server-data-used": "Iskorištena dozvoljena količina / posljednjih 30 dana", + "server-destroy": "Ukloni server", + "server-help-access-key-description": "Podijelite pristupne ključeve s prijateljima kako bi se mogli povezati na vaš Outline server. Isti pristupni ključ mogu koristiti na svim svojim uređajima.", + "server-help-access-key-next": "Naprijed", + "server-help-access-key-title": "Kreirajte ključeve, dijelite pristup", + "server-help-connection-description": "Kliknite ovdje da instalirate aplikaciju Outline klijenta pomoću ličnog pristupnog ključa za Outline server.", + "server-help-connection-ok": "Uredu, razumijem!", + "server-help-connection-title": "Još niste povezani!", + "server-keys": "Ključevi", + "server-my-access-key": "Moj pristupni ključ", + "server-name": "Outline server {serverLocation}", + "server-remove": "Ukloni server", + "server-settings": "Postavke", + "server-unreachable": "Server je nedostupan", + "server-unreachable-description": "Postoje problemi s povezivanjem s ovim serverom.", + "server-unreachable-managed-description": "Pokušajte ponovo ili uklonite ovaj server iz aplikacije.", + "server-unreachable-manual-description": "Pokušajte ponovo ili eliminirajte ovaj server i virtuelni host računar.", + "server-usage": "Korištenje (posljednjih 30 dana)", + "servers-add": "Dodaj server", + "servers-digitalocean": "DigitalOcean serveri", + "servers-gcp": "Google Cloud Platform serveri", + "servers-manual": "Serveri", + "settings-access-key-port": "Priključak za nove pristupne ključeve", + "settings-metrics-header": "Dijeljenje anonimnih pokazatelja", + "settings-server-api-url": "URL API-ja za upravljanje", + "settings-server-cost": "Mjesečni troškovi", + "settings-server-creation": "Kreirano", + "settings-server-hostname": "Naziv host računara", + "settings-server-id": "ID servera", + "settings-server-info": "Informacije o serveru", + "settings-server-location": "Lokacija servera", + "settings-server-name": "Naziv", + "settings-server-rename": "Postavite novi naziv servera. Imajte na umu da se on neće prikazivati na uređajima korisnika koje ste pozvali da se povežu sa serverom.", + "settings-server-version": "Verzija servera", + "settings-transfer-limit": "Dozvoljeni prijenos podataka", + "setup-action": "Postavi", + "setup-advanced": "Napredno", + "setup-anywhere": "Postavite Outline bilo gdje", + "setup-cancel": "Otkažite u bilo kojem trenutku", + "setup-create": "Kreiraj server", + "setup-description": "Nemate server? Kreirajte račun na DigitalOceanu.", + "setup-do-cost": "Samo 6 USD mjesečno", + "setup-do-create": "Kreirajte novi server pomoću DigitalOcean računa za dodatnih 6 USD za 30 dana i 1 TB prijenosa podataka.", + "setup-do-data": "Dozvoljen 1 TB prijenosa podataka", + "setup-do-description": "Ovo može potrajati nekoliko minuta. Uvijek možete eliminirati ovaj server.", + "setup-do-easiest": "Najjednostavniji postupak postavljanja", + "setup-do-title": "Postavljanje Outlinea.", + "setup-firewall-instructions": "Uputstva za zaštitni zid", + "setup-gcp-create": "Kreirajte novi server pomoću Google računa. Cijena zavisi od lokacije i korištenja.", + "setup-gcp-easy": "Jednostavan postupak postavljanja", + "setup-gcp-free-tier": "Uz paket {openLinkFreeTier}Free Tier{closeLink} početna cijena za prvi server je {openLinkIpPrice}3 USD mjesečno{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Besplatni probni period od 90 dana{closeLink} za nove korisnike", + "setup-gcp-promo": "Isprobajte novi automatski postupak kreiranja Outline servera za Google Cloud", + "setup-recommended": "Preporučeno", + "setup-simple-commands": "Jednostavne komande instaliranja", + "setup-step-by-step": "Detaljni vodič za postavljanje", + "setup-tested": "Testirano za VULTR, Linode i Liquid Web", + "setup-title": "Odaberite uslugu oblaka da postavite Outline.", + "share-description": "Kopirajte ovu pozivnicu i pošaljite je iz alata za komunikaciju u koji imate povjerenje. {openLink}Trebate pomoć?{closeLink}", + "share-invite-access-key-copied": "Pristupni ključ je kopiran u međumemoriju", + "share-invite-copied": "Pozivnica je kopirana u međumemoriju", + "share-invite-copy": "Kopiraj pozivnicu", + "share-invite-copy-access-key": "Kopiraj pristupni ključ", + "share-invite-html": "Koristite ovaj server da sigurno pristupate otvorenom internetu:

1) Preuzmite i instalirajte aplikaciju Outline za svoj uređaj:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741,
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125,
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe,
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage,
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client,
– alternativni link za Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk.

2) Primit ćete pristupni ključ koji započinje sa ss://. Kada primite pristupni ključ, kopirajte ga.

3) Otvorite aplikaciju klijenta za Outline. Ako je pristupni ključ automatski otkriven, dodirnite \"Poveži\" i nastavite. Ako pristupni ključ nije automatski otkriven, zalijepite ga u polje, a zatim dodirnite \"Poveži\" i nastavite.

Spremni ste da koristite otvoreni internet! Da provjerite jeste li se uspješno povezali sa serverom, pokušajte pretraživati frazu \"koji je moj IP\" u Google Pretraživanju. IP adresa prikazana na Googleu se mora podudarati s IP adresom u klijentu za Outline.

Saznajte više o Outlineu ovdje: https://getoutline.org/", + "share-invite-instructions": "Pratite naša uputstva za pozivnice na GitHubu:", + "share-invite-trouble": "Imate poteškoće s pristupom linku pozivnice?", + "share-title": "Dijeljenje pristupa", + "survey-data-limits-title": "Pomozite nam da razumijemo kako da poboljšamo ograničenja prijenosa podataka", + "survey-decline": "Odbij", + "survey-disclaimer": "Ako kliknete na Nastavi bit ćete preusmjereni na kratku anketu na Google Formsu. Preporučujemo vam da popunite anketu dok ste povezani na Outline.", + "survey-go-to-survey": "Idi na anketu", + "terms-of-service": "Pročitao/la sam i razumijem {openLink}Uslove korištenja usluge Outline{closeLink}" +} diff --git a/server_manager/messages/ca.json b/server_manager/messages/ca.json new file mode 100644 index 0000000000..50526879fe --- /dev/null +++ b/server_manager/messages/ca.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline és un projecte de codi obert creat per Jigsaw amb l'objectiu d'oferir a les agències d'informació i als periodistes una manera més segura d'accedir a Internet.

Outline funciona amb la tecnologia de Shadowsocks i encara es troba en una fase inicial. Pots contribuir al codi des de GitHub, i seguir-nos a Reddit i Medium per saber quan ampliem el projecte a més plataformes i afegim funcions noves.", + "about-version": "Versió {version}", + "aws-lightsail-firewall-0": "Navega fins a la pantalla d'instàncies d'{openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Fes clic a la instància en què vulguis allotjar Outline.", + "aws-lightsail-firewall-2": "Navega fins a la pestanya Networking (Xarxes).", + "aws-lightsail-firewall-3": "A la secció Firewall (Tallafoc), fes clic a Add another (Afegeix un altre).", + "aws-lightsail-firewall-4": "Estableix el valor d'Application (Aplicació) en All TCP+UDP (Tots els TCP i UDP).", + "aws-lightsail-firewall-5": "Fes clic a Save (Desa).", + "cancel": "Cancel·la", + "close": "Tanca", + "confirmation-server-destroy": "Els usuaris existents perdran l'accés. Aquesta acció no es pot desfer.", + "confirmation-server-destroy-title": "Vols suprimir el servidor?", + "confirmation-server-remove": "Amb aquesta acció es traurà el servidor del Gestor d'Outline, però els usuaris podran continuar accedint al servidor intermediari. Hauràs de suprimir manualment el servidor d'Outline de l'equip amfitrió.", + "confirmation-server-remove-title": "Vols treure el servidor?", + "data-limit": "Límit de dades", + "data-limit-per-key": "Límit de dades per clau", + "data-limits": "Límits de dades", + "data-limits-description": "Estableix un límit de transferència de dades de 30 dies consecutius per a les claus d'accés d'aquest servidor.", + "data-limits-dialog-text": "Ves a la pestanya Configuració per establir un límit de transferència de dades per a les claus d'accés d'aquest servidor.", + "data-limits-dialog-title": "Evita els excedents de dades", + "data-limits-disclaimer": "Com que estàs creant informes de mètriques, s'hi inclourà l'ús de la funció de límits de dades. Consulta la {openLink}política sobre la recollida de dades{closeLink} per obtenir més informació.", + "data-limits-usage": "Dades utilitzades: {used} de {total}", + "destroy": "Suprimeix", + "digitalocean-disconnect-account": "Desconnecta el compte de DigitalOcean", + "digitalocean-unreachable": "Aquest error pot estar relacionat amb un tallafoc de la xarxa o bé amb problemes de connectivitat temporals amb digitalocean.com.", + "disabled": "Desactivat", + "disconnect": "Desconnecta", + "done": "Fet", + "enabled": "Activat", + "error-connectivity": "No podem connectar amb el teu compte de DigitalOcean. De vegades es tracta d'un problema temporal amb DigitalOcean o amb la teva connexió a Internet. Si en tornar-ho a provar encara no funciona, torna a iniciar la sessió a DigitalOcean per corregir el problema.", + "error-connectivity-title": "Problema de connexió", + "error-do-account-info": "No s'ha pogut obtenir informació del compte de DigitalOcean", + "error-do-auth": "No s'ha pogut autenticar amb DigitalOcean", + "error-do-limit": "El teu compte de DigitalOcean ha arribat al límit de {num} droplets. Pots sol·licitar un augment a https://cloud.digitalocean.com/account/team/droplet_limit_increase.", + "error-do-regions": "No s'ha pogut obtenir la llista de regions disponibles", + "error-do-warning": "Advertiment de DigitalOcean: \"{message}\"", + "error-feedback": "No s'han pogut enviar els suggeriments. Torna-ho a provar.", + "error-gcp-auth": "Error d'autenticació amb Google Cloud Platform", + "error-hostname-invalid": "Ha de ser una adreça IP o un nom d'amfitrió vàlids.", + "error-key-add": "No s'ha pogut afegir la clau", + "error-key-remove": "No s'ha pogut suprimir la clau", + "error-key-rename": "No s'ha pogut canviar el nom de la clau", + "error-keys-get": "No s'han pogut carregar les claus", + "error-keys-port-bad-input": "El port ha de ser un nombre enter entre 1 i 65535.", + "error-keys-port-in-use": "Aquest port ja s'utilitza al servidor.", + "error-licenses": "No es poden carregar les llicències.", + "error-metrics": "S'ha produït un error en activar les mètriques", + "error-network": "S'ha produït un error a la xarxa.", + "error-not-saved": "No s'ha desat", + "error-remove-data-limit": "No s'ha pogut desactivar el límit de dades predeterminat", + "error-remove-per-key-limit": "No s'ha pogut suprimir el límit de dades d'aquesta clau d'accés", + "error-server-creation": "S'ha produït un error en crear el teu servidor d'Outline.", + "error-server-destroy": "No s'ha pogut suprimir el servidor", + "error-server-removed": "Els servidors {serverName} ja no estan presents al teu compte de DigitalOcean.", + "error-server-rename": "No s'ha pogut canviar el nom del servidor", + "error-server-unreachable": "El servidor d'Outline s'ha instal·lat correctament, però no ens hi podem connectar. El més probable és que això passi perquè les regles del tallafoc del servidor bloquegen les connexions entrants. Revisa-les i assegura't de permetre les connexions de TCP entrants als ports que van del 1024 al 65535.", + "error-server-unreachable-title": "No es pot connectar amb el servidor d'Outline", + "error-servers-removed": "Els servidors {serverNames} ja no estan presents al teu compte de DigitalOcean.", + "error-set-data-limit": "No s'ha pogut establir un límit de dades predeterminat", + "error-set-per-key-limit": "No s'ha pogut establir un límit de dades per a aquesta clau d'accés", + "error-unexpected": "S'ha produït un error inesperat.", + "experimental": "Experimental", + "experiments": "Experiments", + "experiments-description": "Prova les funcions noves i envia'ns els teus suggeriments abans que es llancin.", + "experiments-disclaimer": "Els experiments estan en fase de desenvolupament i és possible que canviïn o se suprimeixin de l'aplicació. Si estàs creant informes de mètriques, s'hi inclourà l'ús de les funcions experimentals. Consulta la {openLink}política sobre la recollida de dades{closeLink} per obtenir més informació.", + "experiments-feedback": "Tens cap comentari? {openLink}Envia els teus suggeriments{closeLink}.", + "feedback-cloud-provider": "Selecciona un proveïdor de serveis al núvol", + "feedback-cloud-provider-error": "Selecciona un proveïdor de serveis al núvol.", + "feedback-connection": "No em puc connectar al meu servidor", + "feedback-connection-others": "Els altres usuaris no es poden connectar al meu servidor", + "feedback-disclaimer": "Tingues en compte que el nostre equip només pot respondre en anglès als comentaris.", + "feedback-email": "Adreça electrònica (opcional)", + "feedback-error": "Introdueix els suggeriments.", + "feedback-explanation-install": "S'ha produït un error en provar d'instal·lar Outline al servidor. Si no has trobat cap solució, envia'ns els teus comentaris i indica'ns la teva adreça electrònica (opcional) perquè et puguem respondre.", + "feedback-general": "Suggeriments generals", + "feedback-install": "Tinc problemes per instal·lar Outline", + "feedback-label": "Els teus comentaris", + "feedback-management": "Tinc problemes per gestionar el servidor", + "feedback-other": "Altres", + "feedback-privacy": "Els teus suggeriments, l'adreça electrònica (si l'has facilitat) i qualsevol altra informació a què es faci referència a la {openLink}política de privadesa{closeLink} s'enviarà a l'equip d'Outline.", + "feedback-submit": "Envia", + "feedback-suggestion": "Suggeriments", + "feedback-title-generic": "Envia suggeriments", + "feedback-title-install": "Ha fallat la instal·lació del servidor d'Outline", + "gcp-billing-action": "Següent", + "gcp-billing-body": "S'està esperant que {openLink}afegeixis un compte de facturació a Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Obre la pàgina de facturació de la consola de Cloud{closeLink} i afegeix un compte per poder continuar.", + "gcp-billing-error": "No es pot recuperar la informació de facturació", + "gcp-billing-error-zero": "Has d'afegir un compte de facturació per poder continuar.", + "gcp-click-create": "Fes clic a Create (Crea).", + "gcp-create-new-project": "{openLink}Crea un projecte de Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Crea una instància de màquina virtual{closeLink}.", + "gcp-create-project": "Crea un projecte de Google Cloud", + "gcp-create-server": "Crea el projecte de Google Cloud", + "gcp-create-vm": "Crea una instància de màquina virtual", + "gcp-disconnect-account": "Desconnecta el compte de Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Afegeix una regla de tallafoc nova{closeLink} al projecte de Compute Engine.", + "gcp-firewall-create-1": "Escriu \"outline\" al camp Name (Nom).", + "gcp-firewall-create-2": "Escriu \"outline\" al camp Target tags (Etiquetes objectiu).", + "gcp-firewall-create-3": "Escriu \"0.0.0.0/0\"·al camp Source IP ranges (Intervals d'IP d'origen).", + "gcp-firewall-create-4": "Selecciona Allow all (Permet-ho tot ) a Protocols and ports (Protocols i ports).", + "gcp-name-your-project": "Proporciona un nom per al projecte al camp Project name (Nom del projecte).", + "gcp-project-setup-error": "S'ha produït un error en configurar el teu projecte de Google Cloud", + "gcp-select-machine-type": "Selecciona f1-micro a Machine type (Tipus de màquina)", + "gcp-select-networking": "Fes clic a Management, security, disks, networking, sole tenancy (Gestió, seguretat, discs, xarxes, client únic) i, després, a Networking (Xarxes)", + "gcp-select-region": "A Region (Regió), selecciona una regió que sigui a prop d'on seran els usuaris del servidor.", + "gcp-type-network-tag": "Escriu \"outline\" al camp Network tags (Etiquetes de xarxa)", + "gcp-type-outline-server": "Escriu \"outline-server\" al camp Name (Nom).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Comtat de Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londres", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Mont-real", + "geo-mumbai": "Bombai", + "geo-new-york-city": "Nova York", + "geo-northern-virginia": "Virgínia del Nord", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "Sao Paulo", + "geo-seoul": "Seül", + "geo-sg": "Singapur", + "geo-south-carolina": "Carolina del Sud", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tòquio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsòvia", + "geo-zurich": "Zuric", + "key": "Clau {keyId}", + "manual-server-assign-firewall": "Assigna una regla de tallafoc", + "manual-server-assign-group": "Assigna un grup de seguretat", + "manual-server-create-firewall": "Crea una regla de tallafoc", + "manual-server-create-group": "Crea un grup de seguretat", + "manual-server-description": "Aquests passos t'ajudaran a instal·lar Outline en un servidor Linux del proveïdor {cloudProvider}.", + "manual-server-firewall": "Configura el tallafoc", + "manual-server-install-paste": "Enganxa el resultat de la instal·lació aquí.", + "manual-server-install-run": "Inicia la sessió al servidor i executa aquesta ordre.", + "manual-server-instructions": "Instruccions", + "manual-server-show-me": "Mostra'm on", + "manual-server-title": "Segueix les instruccions que trobaràs a continuació", + "metrics-description": "Comparteix mètriques anonimitzades per contribuir a millorar la fiabilitat i el rendiment d'Outline per a tu i per a les persones amb qui comparteixis el servidor. {openLink}Més informació{closeLink}", + "metrics-share": "Comparteix les mètriques", + "metrics-skip": "Omet", + "metrics-title": "Ús compartit de mètriques", + "nav-about": "Informació", + "nav-data-collection": "Recollida de dades", + "nav-feedback": "Suggeriments", + "nav-help": "Ajuda", + "nav-licenses": "Llicències", + "nav-privacy": "Privadesa", + "nav-terms": "Condicions", + "no-data-limit": "Cap", + "notification-app-update": "S'ha baixat una versió actualitzada del Gestor d'Outline. S'instal·larà quan reiniciïs l'aplicació.", + "notification-feedback-thanks": "Gràcies per ajudar-nos a millorar! Apreciem molt els teus comentaris.", + "notification-key-added": "S'ha afegit una clau", + "notification-key-removed": "S'ha suprimit la clau", + "notification-server-destroyed": "S'ha suprimit el servidor", + "notification-server-exists": "Ja s'ha afegit el servidor", + "notification-server-removed": "S'ha tret el servidor", + "oauth-account-active": "El teu compte de DigitalOcean s'ha activat.", + "oauth-account-active-tag": "S'ha activat el compte. S'estan carregant les ubicacions del servidor...", + "oauth-activate-account": "Activa el compte de DigitalOcean.", + "oauth-billing": "Introdueix la teva informació de facturació a digitalocean.com i torna a l'aplicació quan hagis acabat.", + "oauth-billing-tag": "Introdueix la informació de facturació...", + "oauth-connect-description": "Amb el teu compte, Outline permet crear un servidor i establir una connexió més fàcilment.", + "oauth-connect-tag": "Estem esperant per connectar el compte...", + "oauth-connect-title": "Inicia la sessió o crea un compte amb DigitalOcean.", + "oauth-sign-out": "Tanca la sessió", + "oauth-verify": "Comprova si tens un correu electrònic de DigitalOcean a la safata d'entrada i fes clic a l'enllaç que conté per confirmar el compte.", + "oauth-verify-tag": "Confirma el correu electrònic...", + "okay": "D'acord", + "per-key-data-limit-dialog-set-custom": "Estableix un límit de dades personalitzat", + "per-key-data-limit-dialog-title": "Límit de dades: {keyName}", + "region-best-value": "Millor oferta", + "region-description": "La teva experiència a Internet s'originarà en aquesta ubicació.", + "region-setup": "Configura Outline", + "region-title": "Selecciona la ubicació del teu servidor.", + "remove": "Suprimeix", + "retry": "Torna-ho a provar", + "save": "Desa", + "saved": "S'ha desat", + "saving": "S'està desant...", + "server-access": "Accés al servidor", + "server-access-key-new": "Afegeix una altra clau", + "server-access-key-rename": "Canvia el nom", + "server-access-keys": "Claus d'accés", + "server-connections": "Connexions", + "server-data-transfer": "Dades transferides durant els últims 30 dies", + "server-data-used": "Capacitat utilitzada durant els últims 30 dies", + "server-destroy": "Suprimeix el servidor", + "server-help-access-key-description": "Comparteix les claus d'accés amb els amics perquè es puguin connectar al teu servidor d'Outline. Podran fer servir la mateixa clau d'accés en tots els seus dispositius.", + "server-help-access-key-next": "Següent", + "server-help-access-key-title": "Crea claus i comparteix l'accés", + "server-help-connection-description": "Fes clic aquí per instal·lar l'aplicació client Outline fent servir la teva clau d'accés personal per al servidor d'Outline.", + "server-help-connection-ok": "Entesos", + "server-help-connection-title": "Encara no t'has connectat.", + "server-keys": "Claus", + "server-my-access-key": "La meva clau d'accés", + "server-name": "Servidor d'Outline a {serverLocation}", + "server-remove": "Treu el servidor", + "server-settings": "Configuració", + "server-unreachable": "No es pot accedir al servidor", + "server-unreachable-description": "No podem connectar amb aquest servidor.", + "server-unreachable-managed-description": "Torna-ho a provar o treu aquest servidor de l'aplicació.", + "server-unreachable-manual-description": "Torna-ho a provar o suprimeix aquest servidor i l'amfitrió virtual.", + "server-usage": "Ús (últims 30 dies)", + "servers-add": "Afegeix el servidor", + "servers-digitalocean": "Servidors de DigitalOcean", + "servers-gcp": "Servidors de Google Cloud Platform", + "servers-manual": "Servidors", + "settings-access-key-port": "Port per a les claus d'accés noves", + "settings-metrics-header": "Comparteix mètriques anònimes", + "settings-server-api-url": "URL de l'API de gestió", + "settings-server-cost": "Cost mensual", + "settings-server-creation": "Data de creació", + "settings-server-hostname": "Nom d'amfitrió", + "settings-server-id": "Identificador del servidor", + "settings-server-info": "Informació del servidor", + "settings-server-location": "Ubicació del servidor", + "settings-server-name": "Nom", + "settings-server-rename": "Estableix un altre nom per al servidor. Tingues en compte que aquest canvi no es reflectirà als dispositius dels usuaris que hagis convidat a connectar-s'hi.", + "settings-server-version": "Versió del servidor", + "settings-transfer-limit": "Capacitat de la transferència de dades", + "setup-action": "Configura", + "setup-advanced": "Configuració avançada", + "setup-anywhere": "Configura Outline en qualsevol lloc", + "setup-cancel": "Pots cancel·lar-ho en qualsevol moment", + "setup-create": "Crea un servidor", + "setup-description": "No tens cap servidor? Crea un compte amb DigitalOcean.", + "setup-do-cost": "Només 6 USD al mes", + "setup-do-create": "Crea un servidor amb el compte de DigitalOcean per 6 USD més cada 30 dies i obtén una transferència de dades d'1 TB.", + "setup-do-data": "Capacitat de transferència de dades d'1 TB", + "setup-do-description": "Aquest procés pot tardar uns quants minuts. Pots suprimir aquest servidor en qualsevol moment.", + "setup-do-easiest": "Procés de configuració més senzill", + "setup-do-title": "S'està configurant Outline.", + "setup-firewall-instructions": "Instruccions del tallafoc", + "setup-gcp-create": "Crea un servidor nou amb el teu Compte de Google. El cost varia en funció de la ubicació i de l'ús.", + "setup-gcp-easy": "Procés de configuració senzill", + "setup-gcp-free-tier": "Amb el {openLinkFreeTier}nivell gratuït{closeLink}, aconsegueix el teu primer servidor a partir de {openLinkIpPrice}3 USD al mes{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Prova gratuïta de 90 dies{closeLink} per a usuaris nous", + "setup-gcp-promo": "Prova el nou procés de creació automàtic del servidor d'Outline per a Google Cloud", + "setup-recommended": "Opció recomanada", + "setup-simple-commands": "Ordres d'instal·lació senzilles", + "setup-step-by-step": "Guia de configuració pas a pas", + "setup-tested": "S'ha provat a VULTR, Linode i Liquid Web", + "setup-title": "Tria un servei al núvol per configurar Outline.", + "share-description": "Copia aquesta invitació i envia-la des d'una eina de comunicació en què confiïs. {openLink}Necessites ajuda?{closeLink}", + "share-invite-access-key-copied": "S'ha copiat la clau d'accés al porta-retalls", + "share-invite-copied": "S'ha copiat la invitació al porta-retalls", + "share-invite-copy": "Copia la invitació", + "share-invite-copy-access-key": "Copia la clau d'accés", + "share-invite-html": "Utilitza aquest servidor per accedir de manera segura a la Internet oberta:

1) Baixa i instal·la l'aplicació Outline per al teu dispositiu:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Enllaç alternatiu d'Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Rebràs una clau d'accés que començarà per ss://. Quan la rebis, copia-la.

3) Obre l'aplicació client Outline. Si la clau d'accés es detecta automàticament, toca \"Connecta\" i continua. En cas contrari, enganxa-la al camp, toca \"Connecta\" i continua.

Ja pots utilitzar la Internet oberta. Per assegurar-te que t'hagis connectat correctament al servidor, prova de cercar \"quina és la meva adreça IP\" a la Cerca de Google. L'adreça IP que es mostri a Google hauria de coincidir amb l'adreça IP del client Outline.

Obtén més informació sobre Outline aquí: https://getoutline.org/.", + "share-invite-instructions": "Segueix les instruccions sobre la invitació a GitHub:", + "share-invite-trouble": "Tens problemes per accedir a l'enllaç d'invitació?", + "share-title": "Comparteix l'accés", + "survey-data-limits-title": "Ajuda'ns a entendre com podem millorar els límits de dades", + "survey-decline": "Rebutja", + "survey-disclaimer": "En fer clic a l'opció per continuar, se't dirigirà a una enquesta breu a Formularis de Google. Et recomanem que hi contestis mentre estàs connectat a Outline.", + "survey-go-to-survey": "Ves a l'enquesta", + "terms-of-service": "He llegit i entenc les {openLink}condicions del servei d'Outline{closeLink}" +} diff --git a/server_manager/messages/cs.json b/server_manager/messages/cs.json new file mode 100644 index 0000000000..48e202ea25 --- /dev/null +++ b/server_manager/messages/cs.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline je open-sourceový projekt od společnosti Jigsaw, který si klade za cíl poskytnout novinářům a zpravodajským organizacím bezpečný přístup k internetu.

Outline je postaven na technologiích Shadowsocks a je stále v raných fázích vývoje. Kód můžete rozšiřovat na GitHubu, a pokud se chcete dozvědět, když přidáme nové funkce nebo podporu dalších platforem, sledujte nás ve službách RedditMedium.", + "about-version": "Verze {version}", + "aws-lightsail-firewall-0": "Přejděte na obrazovku s instancemi virtuálního počítače {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Klikněte na instanci, kde chcete Outline hostovat.", + "aws-lightsail-firewall-2": "Přejděte na kartu Síť (Networking).", + "aws-lightsail-firewall-3": "V sekci Brána firewall (Firewall) klikněte na Přidat další (Add another).", + "aws-lightsail-firewall-4": "Hodnotu Aplikace (Application) nastavte na Všechny aplikace TCP a UDP (All TCP+UDP).", + "aws-lightsail-firewall-5": "Klikněte na Uložit (Save).", + "cancel": "Zrušit", + "close": "Zavřít", + "confirmation-server-destroy": "Stávající uživatelé ztratí přístup. Tuto akci není možné vrátit.", + "confirmation-server-destroy-title": "Zničit server?", + "confirmation-server-remove": "Tato akce odebere váš server ze Správce Outline, ale nezablokuje uživatelům přístup přes proxy. Stále budete svůj server Outline muset ručně smazat z hostitelského počítače.", + "confirmation-server-remove-title": "Odebrat server?", + "data-limit": "Datový limit", + "data-limit-per-key": "Datový limit pro klíč", + "data-limits": "Datové limity", + "data-limits-description": "Nastavte si limit přenesených dat pro přístupové klíče na tomto serveru podle využití v posledních 30 dnech.", + "data-limits-dialog-text": "Přejděte na kartu Nastavení a nastavte limit přenesených dat pro přístupové klíče na tomto serveru.", + "data-limits-dialog-title": "Vyhněte se nadbytečné spotřebě dat", + "data-limits-disclaimer": "Protože momentálně posíláte přehledy metrik, používání funkce limitů dat v nich bude zahrnuto. Další podrobnosti najdete v {openLink}zásadách sběru dat{closeLink}.", + "data-limits-usage": "Využito {used} z {total}", + "destroy": "Zničit", + "digitalocean-disconnect-account": "Odpojit účet DigitalOcean", + "digitalocean-unreachable": "Tuto chybu mohl zapříčinit firewall na vaší síti nebo dočasný problém s připojením na digitalocean.com.", + "disabled": "Vypnuto", + "disconnect": "Odpojit", + "done": "Hotovo", + "enabled": "Zapnuto", + "error-connectivity": "Máme potíže s připojením k vašemu účtu DigitalOcean. Může se jednat o dočasný problém se službou DigitalOcean nebo s vaším připojením k internetu. Pokud se ti nedaří ani po opakovaných pokusech, problém by mělo vyřešit přihlásit se do služby DigitalOcean znovu.", + "error-connectivity-title": "Problém s připojením", + "error-do-account-info": "Údaje o účtu DigitalOcean se nepodařilo načíst", + "error-do-auth": "Ověření u DigitalOcean se nezdařilo", + "error-do-limit": "V účtu DigitalOcean jste dosáhli maximálního povoleného počtu serverů Droplet ({num}). O zvýšení limitu můžete požádat na stránce https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Seznam dostupných oblastí se nepodařilo načíst", + "error-do-warning": "Upozornění ze služby DigitalOcean: {message}", + "error-feedback": "Zpětnou vazbu se nepodařilo odeslat. Zkuste to znovu.", + "error-gcp-auth": "Ověření přes Google Cloud Platform se nepodařilo", + "error-hostname-invalid": "Musí se jednat o IP adresu nebo platný název hostitele.", + "error-key-add": "Klíč se nepodařilo přidat", + "error-key-remove": "Klíč se nepodařilo odebrat", + "error-key-rename": "Klíč se nepodařilo přejmenovat", + "error-keys-get": "Klíče se nepodařilo načíst", + "error-keys-port-bad-input": "Hodnota portu musí být celé číslo mezi 1 a 65 535.", + "error-keys-port-in-use": "Tento port už se na serveru používá.", + "error-licenses": "Licence se nepodařilo načíst.", + "error-metrics": "Při zapínání metrik došlo k chybě", + "error-network": "Došlo k chybě sítě.", + "error-not-saved": "Neuloženo", + "error-remove-data-limit": "Výchozí datový limit klíče se nepodařilo vypnout", + "error-remove-per-key-limit": "Datový limit z tohoto přístupového klíče se nepodařilo odstranit", + "error-server-creation": "Při vytváření vašeho serveru Outline došlo k chybě.", + "error-server-destroy": "Server se nepodařilo zničit", + "error-server-removed": "Server {serverName} už není ve vašem účtu DigitalOcean.", + "error-server-rename": "Server se nepodařilo přejmenovat", + "error-server-unreachable": "Váš server Outline se nainstaloval správně, ale nedaří se nám k němu připojit. Pravděpodobně je tomu tak proto, že pravidla firewallu vašeho serveru blokují příchozí připojení. Zkontrolujte je a povolte příchozí připojení TCP na portech v rozsahu od 1024 do 65535.", + "error-server-unreachable-title": "K vašemu serveru Outline se nepodařilo připojit", + "error-servers-removed": "Servery {serverNames} už nejsou ve vašem účtu DigitalOcean.", + "error-set-data-limit": "Výchozí datový limit se nepodařilo nastavit", + "error-set-per-key-limit": "Datový limit pro tento přístupový klíč se nepodařilo nastavit", + "error-unexpected": "Došlo k neočekávané chybě.", + "experimental": "Experimentální", + "experiments": "Experimenty", + "experiments-description": "Vyzkoušejte nové funkce a dejte nám k nim zpětnou vazbu, než budou vydány.", + "experiments-disclaimer": "Experimenty jsou funkce ve vývoji, které se mohou změnit nebo mohou být z aplikace odebrány. Pokud momentálně posíláte přehledy metrik, používání experimentálních funkcí v nich bude zahrnuto. Další podrobnosti najdete v {openLink}zásadách sběru dat{closeLink}.", + "experiments-feedback": "Máte nějaké návrhy? {openLink}Pošlete nám zpětnou vazbu{closeLink}.", + "feedback-cloud-provider": "Vyberte poskytovatele cloudu", + "feedback-cloud-provider-error": "Vyberte poskytovatele cloudu.", + "feedback-connection": "Nedaří se mi připojit k serveru", + "feedback-connection-others": "Jiným lidem se nedaří připojit k mému serveru", + "feedback-disclaimer": "Vezměte v potaz, že náš tým dokáže odpovídat jen na zpětnou vazbu v angličtině.", + "feedback-email": "E-mailová adresa (nepovinné)", + "feedback-error": "Zadejte zpětnou vazbu.", + "feedback-explanation-install": "Při pokusu o instalaci aplikace Outline na váš server došlo k chybě. Pokud se vám nepodařilo chybu vyřešit, můžete nám poslat zpětnou vazbu a případně nám k ní uvést svou e-mailovou adresu, abychom vám mohli odpovědět.", + "feedback-general": "Obecná zpětná vazba", + "feedback-install": "Mám potíže s instalací aplikace Outline", + "feedback-label": "Vaše zpětná vazba", + "feedback-management": "Mám potíže se správou svého serveru", + "feedback-other": "Jiný", + "feedback-privacy": "Vaše zpětná vazba, e-mailová adresa (pokud jste ji uvedli) a další údaje zmíněné v {openLink}zásadách ochrany soukromí{closeLink} budou odeslány týmu služby Outline.", + "feedback-submit": "Odeslat", + "feedback-suggestion": "Návrhy", + "feedback-title-generic": "Poslat zpětnou vazbu", + "feedback-title-install": "Instalace serveru Outline se nezdařila", + "gcp-billing-action": "Další", + "gcp-billing-body": "Čeká se, než {openLink}ve službě Google Cloud přidáte fakturační účet{closeLink}", + "gcp-billing-description": "Pokračujte tím, že {openLink}v nástroji Cloud Console otevřete stránku fakturace{closeLink} a přidáte účet.", + "gcp-billing-error": "Nepodařilo se načíst fakturační údaje", + "gcp-billing-error-zero": "Než budete moct pokračovat, přidejte fakturační účet.", + "gcp-click-create": "Klikněte na Create (Vytvořit).", + "gcp-create-new-project": "{openLink}Vytvořte nový cloudový projekt Google{closeLink}.", + "gcp-create-new-vm": "{openLink}Vytvořte novou instanci virtuálního počítače{closeLink}.", + "gcp-create-project": "Vytvořte cloudový projekt Google", + "gcp-create-server": "Vytvořte cloudový projekt Google", + "gcp-create-vm": "Vytvořte instanci virtuálního počítače", + "gcp-disconnect-account": "Odpojte účet Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Přidejte do svého projektu Compute Engine nové pravidlo pro firewall{closeLink}.", + "gcp-firewall-create-1": "Do pole Name (Název) napište „outline“.", + "gcp-firewall-create-2": "Do pole Target tags (Značky cíle) napište „outline“.", + "gcp-firewall-create-3": "Do pole Source IP ranges (Rozsahy IP zdrojů) zadejte „0.0.0.0/0“.", + "gcp-firewall-create-4": "V sekci Protocols and ports (Protokoly a porty) vyberte možnost Allow all (Povolit vše).", + "gcp-name-your-project": "Do pole Název projektu (Project name) zadejte název projektu.", + "gcp-project-setup-error": "Při nastavování vašeho projektu Google Cloud došlo k chybě", + "gcp-select-machine-type": "V části Typ počítače (Machine type) vyberte „f1-micro“", + "gcp-select-networking": "Klikněte na Správa, zabezpečení, disky, síť, jeden tenant (Management, security, disks, networking, sole tenancy) a potom na Síť (Networking)", + "gcp-select-region": "V části Oblast (Region) vyberte oblast nacházející se blízko uživatelů serveru.", + "gcp-type-network-tag": "Do pole Značky sítě (Network tags) napište „outline“.", + "gcp-type-outline-server": "Do pole Název (Name) napište „outline-server“.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bengalúr", + "geo-changhua-county": "Okres Čang-chua", + "geo-delhi": "Dillí", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londýn", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Bombaj", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Severní Virginie", + "geo-oregon": "Oregon", + "geo-osaka": "Ósaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Soul", + "geo-sg": "Singapur", + "geo-south-carolina": "Jižní Karolína", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varšava", + "geo-zurich": "Curych", + "key": "Klíč {keyId}", + "manual-server-assign-firewall": "Přiřazení pravidla pro firewall", + "manual-server-assign-group": "Přiřazení bezpečnostní skupiny", + "manual-server-create-firewall": "Vytvoření pravidla pro firewall", + "manual-server-create-group": "Vytvoření bezpečnostní skupiny", + "manual-server-description": "Tyto kroky vám pomohou nainstalovat Outline na linuxový server {cloudProvider}.", + "manual-server-firewall": "Konfigurace vašeho firewallu", + "manual-server-install-paste": "Sem vložte výstup z instalace.", + "manual-server-install-run": "Přihlaste se ke svému serveru a spusťte tento příkaz.", + "manual-server-instructions": "Pokyny", + "manual-server-show-me": "Ukázat kde", + "manual-server-title": "Postupujte podle pokynů níže", + "metrics-description": "Sdílejte anonymní metriky, které nám pomohou zlepšovat spolehlivost a výkon služby Outline pro vás a další lidi, s nimiž sdílíte server. {openLink}Další informace{closeLink}.", + "metrics-share": "Sdílet metriky", + "metrics-skip": "Přeskočit", + "metrics-title": "Sdílení metrik", + "nav-about": "O aplikaci", + "nav-data-collection": "Sběr dat", + "nav-feedback": "Zpětná vazba", + "nav-help": "Nápověda", + "nav-licenses": "Licence", + "nav-privacy": "Ochrana soukromí", + "nav-terms": "Podmínky", + "no-data-limit": "Žádný", + "notification-app-update": "Byla stažena aktualizovaná verze aplikace Správce Outline. Bude nainstalována, až aplikaci restartujete.", + "notification-feedback-thanks": "Děkujeme, že nám pomáháte se zlepšovat! Jsme rádi, že nám píšete.", + "notification-key-added": "Klíč byl přidán", + "notification-key-removed": "Klíč byl odebrán", + "notification-server-destroyed": "Server byl zničen", + "notification-server-exists": "Server už je přidán", + "notification-server-removed": "Server byl odebrán", + "oauth-account-active": "Váš účet DigitalOcean byl aktivován.", + "oauth-account-active-tag": "Účet byl aktivován! Načítáme umístění serveru...", + "oauth-activate-account": "Aktivujte svůj účet DigitalOcean.", + "oauth-billing": "Na adrese digitalocean.com zadejte své fakturační údaje a pak se vraťte do aplikace.", + "oauth-billing-tag": "Zadejte fakturační údaje...", + "oauth-connect-description": "S přístupem k vašemu účtu je snadné si v aplikaci Outline vytvořit server a připojit se.", + "oauth-connect-tag": "Čekání na připojení vašeho účtu...", + "oauth-connect-title": "Přihlaste se nebo si vytvořte účet u DigitalOcean.", + "oauth-sign-out": "Odhlásit se", + "oauth-verify": "Zkontrolujte, jestli vám do poštovní schránky přišel e-mail od DigitalOcean, a kliknutím na odkaz v něm ověřte svůj účet.", + "oauth-verify-tag": "Ověřte svůj e-mail...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Nastavit vlastní datový limit", + "per-key-data-limit-dialog-title": "Datový limit – {keyName}", + "region-best-value": "Výhodná cena", + "region-description": "Přes toto místo se budete připojovat k internetu.", + "region-setup": "Nastavit Outline", + "region-title": "Vyberte umístění svého serveru.", + "remove": "Odebrat", + "retry": "Zkusit znovu", + "save": "Uložit", + "saved": "Uloženo", + "saving": "Ukládání...", + "server-access": "Přístup k serveru", + "server-access-key-new": "Přidat nový klíč", + "server-access-key-rename": "Přejmenovat", + "server-access-keys": "Přístupové klíče", + "server-connections": "Připojení", + "server-data-transfer": "Přenesená data / posledních 30 dní", + "server-data-used": "Využité povolené vytížení / posledních 30 dní", + "server-destroy": "Zničit server", + "server-help-access-key-description": "Sdílejte přístupové klíče s přáteli, aby se mohli připojit k vašemu serveru Outline. Mohou používat jeden přístupový klíč na všech svých zařízeních.", + "server-help-access-key-next": "Další", + "server-help-access-key-title": "Vytvořte klíče a sdílejte přístup", + "server-help-connection-description": "Kliknutím sem nainstalujete klienta Outline s použitím svého osobního přístupového klíče k serveru Outline.", + "server-help-connection-ok": "OK, rozumím", + "server-help-connection-title": "Ještě nejste připojeni!", + "server-keys": "Klíče", + "server-my-access-key": "Můj přístupový klíč", + "server-name": "Server Outline {serverLocation}", + "server-remove": "Odebrat server", + "server-settings": "Nastavení", + "server-unreachable": "Server není dostupný", + "server-unreachable-description": "Máme potíže s připojením k tomuto serveru.", + "server-unreachable-managed-description": "Zkuste to znovu nebo tento server z aplikace odeberte.", + "server-unreachable-manual-description": "Zkuste to znovu nebo tento server a virtuálního hostitele zničte.", + "server-usage": "Využití (za posledních 30 dní)", + "servers-add": "Přidat server", + "servers-digitalocean": "Servery DigitalOcean", + "servers-gcp": "Servery Google Cloud Platform", + "servers-manual": "Servery", + "settings-access-key-port": "Port pro nové přístupové klíče", + "settings-metrics-header": "Sdílet anonymní metriky", + "settings-server-api-url": "Adresa rozhraní API pro správu", + "settings-server-cost": "Cena za měsíc", + "settings-server-creation": "Vytvořeno", + "settings-server-hostname": "Název hostitele", + "settings-server-id": "ID serveru", + "settings-server-info": "Informace o serveru", + "settings-server-location": "Umístění serveru", + "settings-server-name": "Název", + "settings-server-rename": "Nastavte svému serveru nový název. Upozorňujeme, že tato změna se neprojeví na zařízeních uživatelů, které jste pozvali, aby se k němu připojili.", + "settings-server-version": "Verze serveru", + "settings-transfer-limit": "Povolený přenos dat", + "setup-action": "Nastavit", + "setup-advanced": "Pokročilé", + "setup-anywhere": "Nastavte si Outline kdekoli", + "setup-cancel": "Zrušit to můžete kdykoli", + "setup-create": "Vytvořit server", + "setup-description": "Nemáte server? Vytvořte si účet u DigitalOcean.", + "setup-do-cost": "Jen za 6 $ za měsíc", + "setup-do-create": "S účtem DigitalOcean si můžete vytvořit nový server za doplatek 6 $ za 30 dní. Povolený přenos dat činí 1 TB.", + "setup-do-data": "Povolený přenos dat: 1 TB", + "setup-do-description": "Může to trvat několik minut. Server můžete kdykoli zničit.", + "setup-do-easiest": "Snadný proces nastavení", + "setup-do-title": "Nastavování služby Outline.", + "setup-firewall-instructions": "Pokyny k firewallu", + "setup-gcp-create": "Vytvořte pomocí svého účtu Google nový server. Ceny se liší podle místa a míry využití.", + "setup-gcp-easy": "Snadný proces nastavení", + "setup-gcp-free-tier": "Na {openLinkFreeTier}úrovni Free{closeLink} začíná cena za první server na {openLinkIpPrice}3 $ měsíčně{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90denní bezplatná zkušební verze{closeLink} pro nové uživatele", + "setup-gcp-promo": "Vyzkoušejte nový automatický proces vytváření serverů Outline pro Google Cloud", + "setup-recommended": "Doporučeno", + "setup-simple-commands": "Jednoduché instalační příkazy", + "setup-step-by-step": "Podrobný návod k nastavení", + "setup-tested": "Otestováno u poskytovatelů VULTR, Linode a Liquid Web", + "setup-title": "Vyberte cloudovou službu, kde chcete Outline nastavit.", + "share-description": "Zkopírujte si tuto pozvánku a pošlete ji komunikačním kanálem, kterému důvěřujete. {openLink}Potřebujete pomoc?{closeLink}", + "share-invite-access-key-copied": "Přístupový klíč byl zkopírován do schránky", + "share-invite-copied": "Pozvánka byla zkopírována do schránky", + "share-invite-copy": "Zkopírovat pozvánku", + "share-invite-copy-access-key": "Kopírovat přístupový klíč", + "share-invite-html": "K bezpečnému přístupu ke svobodnému internetu použijte tento server:

1) Stáhněte si a nainstalujte aplikaci Outline pro svoje zařízení:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Alternativní odkaz pro Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Obdržíte přístupový klíč začínající řetězcem ss://. Až vám klíč přijde, zkopírujte si ho.

3) Otevřete klientskou aplikaci Outline. Pokud byl váš přístupový klíč rozpoznán automaticky, klepněte na Připojit a pokračujte. Pokud se přístupový klíč automaticky nerozpozná, vložte ho do příslušného pole. Pak klepněte na Připojit a pokračujte.

Můžete začít používat svobodný internet! Pokud se chcete ujistit, že jste se k serveru úspěšně připojili, zkuste ve Vyhledávání Google zadat dotaz „jakou mám IP adresu“. IP adresa zobrazená na Googlu by se měla shodovat s IP adresou v klientovi Outline.

Další informace o aplikaci Outline najdete tady: https://getoutline.org/", + "share-invite-instructions": "Postupujte podle našeho návodu k pozvánce na GitHubu:", + "share-invite-trouble": "Máte potíže s otevřením odkazu s pozvánkou?", + "share-title": "Sdílet přístup", + "survey-data-limits-title": "Pomozte nám zjistit, jak můžeme vylepšit limity dat", + "survey-decline": "Odmítnout", + "survey-disclaimer": "Kliknutím na Pokračovat přejdete na krátký průzkum ve Formulářích Google. Doporučujeme dotazník vyplňovat, když jste připojeni k Outline.", + "survey-go-to-survey": "Přejít na dotazník", + "terms-of-service": "Přečetl(a) jsem si {openLink}smluvní podmínky služby Outline{closeLink} a jsem s nimi srozuměn(a)" +} diff --git a/server_manager/messages/da.json b/server_manager/messages/da.json new file mode 100644 index 0000000000..7ea94deb86 --- /dev/null +++ b/server_manager/messages/da.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline er et open source-projekt, der er oprettet af Jigsaw, for at gøre det nemmere for nyhedsorganisationer og journalister at få adgang til internettet.

Outline leveres af Shadowsocks og er stadig på et tidligt stadie i udviklingsprocessen. Du kan bidrage til koden på GitHub og følge os på Reddit og Medium for at høre, hvornår vi udvider til andre platforme og tilføjer nye funktioner.", + "about-version": "Version {version}", + "aws-lightsail-firewall-0": "Gå til skærmen med {openLink}Amazon Lightsail{closeLink}-forekomster.", + "aws-lightsail-firewall-1": "Klik på den forekomst, du vil hoste Outline på.", + "aws-lightsail-firewall-2": "Gå til fanen \"Netværk\" (Networking).", + "aws-lightsail-firewall-3": "Klik på \"Tilføj en anden\" (Add another) i sektionen \"Firewall\" (Firewall).", + "aws-lightsail-firewall-4": "Angiv værdien \"Anvendelse\" (Application) til \"Alle TCP og UDP\" (All TCP+UDP)", + "aws-lightsail-firewall-5": "Klik på \"Gem\" (Save).", + "cancel": "Annuller", + "close": "Luk", + "confirmation-server-destroy": "Eksisterende brugere mister adgang. Denne handling kan ikke fortrydes.", + "confirmation-server-destroy-title": "Vil du slette serveren?", + "confirmation-server-remove": "Denne handling fjerner din server fra Outline Manager, men blokerer ikke proxyadgang til brugerne. Du skal stadig manuelt slette Outline-serveren fra din hostenhed.", + "confirmation-server-remove-title": "Vil du fjerne serveren?", + "data-limit": "Datagrænse", + "data-limit-per-key": "Datagrænse pr. nøgle", + "data-limits": "Datagrænser", + "data-limits-description": "Angiv en grænse for den datamængde, der må overføres i løbet af 30 dage, for adgangsnøgler på denne server.", + "data-limits-dialog-text": "Gå til fanen Indstillinger for at angive en grænse for den datamængde, der må overføres, for adgangsnøgler på denne server.", + "data-limits-dialog-title": "Undgå overforbrug af data", + "data-limits-disclaimer": "Da du i øjeblikket rapporterer metrics, bliver brug af datagrænsefunktionen inkluderet. Få flere oplysninger i {openLink}politikken for indsamling af data{closeLink}.", + "data-limits-usage": "{used} af {total} er brugt", + "destroy": "Slet", + "digitalocean-disconnect-account": "Vil du fjerne forbindelsen til denne DigitalOcean-konto?", + "digitalocean-unreachable": "Denne fejl kan skyldes, at der er en firewall på dit netværk, eller at der er midlertidige problemer med forbindelsen til digitalocean.com.", + "disabled": "Deaktiveret", + "disconnect": "Afbryd forbindelsen", + "done": "Udfør", + "enabled": "Aktiveret", + "error-connectivity": "Der er problemer med at oprette forbindelse til din DigitalOcean-konto. Dette er nogle gange et midlertidigt problem, der påvirker DigitalOcean eller din internetforbindelse. Hvis det ikke virker at prøve igen, bør det hjælpe at logge ind på DigitalOcean igen.", + "error-connectivity-title": "Forbindelsesproblem", + "error-do-account-info": "Det lykkedes ikke at hente DigitalOcean-kontooplysninger", + "error-do-auth": "Godkendelse med DigitalOcean lykkedes ikke", + "error-do-limit": "Din DigitalOcean-konto har nået grænsen på {num} Droplets. Du kan anmode om en forøgelse på https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Det lykkedes ikke at hente listen med tilgængelige regioner", + "error-do-warning": "DigitalOcean-advarsel: \"{message}\"", + "error-feedback": "Det lykkedes ikke at sende feedback. Prøv igen.", + "error-gcp-auth": "Godkendelsen med Google Cloud Platform mislykkedes", + "error-hostname-invalid": "Skal være en IP-adresse eller et gyldigt hostname.", + "error-key-add": "Det lykkedes ikke at tilføje nøglen", + "error-key-remove": "Det lykkedes ikke at fjerne nøglen", + "error-key-rename": "Det lykkedes ikke at omdøbe nøglen", + "error-keys-get": "Nøglerne kunne ikke indlæses", + "error-keys-port-bad-input": "Porten skal være et heltal mellem 1 og 65.535.", + "error-keys-port-in-use": "Porten anvendes allerede på serveren.", + "error-licenses": "Licenserne kunne ikke indlæses.", + "error-metrics": "Der opstod en fejl i forbindelse med aktivering af metrics", + "error-network": "Der opstod en netværksfejl.", + "error-not-saved": "Ikke gemt", + "error-remove-data-limit": "Standardgrænsen for dataoverførsel kunne ikke deaktiveres", + "error-remove-per-key-limit": "Datagrænsen kunne ikke fjernes fra denne adgangsnøgle", + "error-server-creation": "Der opstod en fejl, da din Outline-server skulle oprettes.", + "error-server-destroy": "Det lykkedes ikke at slette serveren", + "error-server-removed": "{serverName} findes ikke længere på din DigitalOcean-konto.", + "error-server-rename": "Det lykkedes ikke at omdøbe serveren", + "error-server-unreachable": "Din Outline-server blev korrekt installeret, men vi kunne ikke oprette forbindelse til den. Det skyldes sikkert, at din servers firewallregler blokerer indgående forbindelser. Gennemgå reglerne, og sørg for, at du tillader indgående TCP-forbindelser på portene i intervallet 1024 til 65535.", + "error-server-unreachable-title": "Der kan ikke oprettes forbindelse til din Outline-server", + "error-servers-removed": "{serverNames} findes ikke længere på din DigitalOcean-konto.", + "error-set-data-limit": "Der kunne ikke angives en standardgrænse for dataoverførsel", + "error-set-per-key-limit": "Der kunne ikke angives en datagrænse for denne adgangsnøgle", + "error-unexpected": "Der opstod en uventet fejl.", + "experimental": "Eksperimenterende", + "experiments": "Eksperimenter", + "experiments-description": "Test nye funktioner, og giv os feedback, før de udgives.", + "experiments-disclaimer": "Eksperimenterne er under udvikling og kan ændres eller fjernes fra appen. Hvis du rapporterer metrics i øjeblikket, medtages din brug af eksperimentelle funktioner. Få flere oplysninger i {openLink}politikken for indsamling af data{closeLink}.", + "experiments-feedback": "Har du nogen forslag? {openLink}Indsend feedback her.{closeLink}", + "feedback-cloud-provider": "Vælg skyudbyder", + "feedback-cloud-provider-error": "Vælg en skyudbyder.", + "feedback-connection": "Der kan ikke oprettes forbindelse til min server", + "feedback-connection-others": "Andre kan ikke oprette forbindelse til min server", + "feedback-disclaimer": "Bemærk! Vores team kan kun besvare feedback på engelsk.", + "feedback-email": "Mailadresse (valgfrit)", + "feedback-error": "Skriv din feedback.", + "feedback-explanation-install": "Der opstod en fejl, da Outline skulle installeres på din server. Hvis du ikke kan finde en løsning, kan du overveje at sende os feedback og give os din mailadresse (valgfrit), så vi kan kontakte dig.", + "feedback-general": "Overordnet feedback", + "feedback-install": "Jeg har problemer med at installere Outline", + "feedback-label": "Din feedback", + "feedback-management": "Jeg har problemer med at administrere min server", + "feedback-other": "Andre", + "feedback-privacy": "Din feedback sendes til Outline-teamet sammen med din mailadresse (hvis den er oplyst) og yderligere oplysninger, der henvises til i {openLink}privatlivspolitikken{closeLink}.", + "feedback-submit": "Send", + "feedback-suggestion": "Forslag", + "feedback-title-generic": "Send feedback", + "feedback-title-install": "Outline-serveren kunne ikke installeres", + "gcp-billing-action": "Næste", + "gcp-billing-body": "Der ventes på, at du {openLink}føjer en faktureringskonto til Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Åbn Cloud Console-faktureringssiden{closeLink}, og tilføje en konto for at fortsætte.", + "gcp-billing-error": "Faktureringsoplysningerne kunne ikke hentes", + "gcp-billing-error-zero": "Du skal tilføje en faktureringskonto for at fortsætte.", + "gcp-click-create": "Klik på \"Create\" (Opret).", + "gcp-create-new-project": "{openLink}Opret et nyt Google Cloud-projekt{closeLink}.", + "gcp-create-new-vm": "{openLink}Opret en ny VM-forekomst{closeLink}.", + "gcp-create-project": "Opret et Google Cloud-projekt", + "gcp-create-server": "Opret dit Google Cloud-projekt", + "gcp-create-vm": "Opret en VM-forekomst", + "gcp-disconnect-account": "Fjern tilknytningen af Google Cloud Platform-kontoen", + "gcp-firewall-create-0": "{openLink}Tilføj en ny firewallregel{closeLink} til dit Compute Engine-projekt.", + "gcp-firewall-create-1": "Skriv \"outline\" i feltet \"Name\" (Navn).", + "gcp-firewall-create-2": "Skriv \"outline\" i feltet \"Måltags\" (Target tags).", + "gcp-firewall-create-3": "Skriv \"0.0.0.0/0\" i feltet \"Source IP ranges\" (Kildens IP-områder).", + "gcp-firewall-create-4": "Vælg \"Allow all\" (Tillad alle) under \"Protocols and ports\" (Protokoller og porte).", + "gcp-name-your-project": "Giv dit projekt et navn i feltet \"Projektnavn\" (Project name).", + "gcp-project-setup-error": "Der opstod en fejl, da Google Cloud-projektet skulle konfigureres", + "gcp-select-machine-type": "Vælg \"f1-micro\" under \"Maskintype\" (Machine type)", + "gcp-select-networking": "Klik på \"Administration, sikkerhed, diske, netværk, eksklusiv adgang\" (Management, security, disks, networking, sole tenancy) og så på \"Netværk\" (Networking)", + "gcp-select-region": "Vælg et område i nærheden af, hvor serverens brugere er, under \"Område\" (Region).", + "gcp-type-network-tag": "Skriv \"outline\" i feltet \"Network tags\" (Netværkstags)", + "gcp-type-outline-server": "Skriv \"outline-server\" i feltet \"Navn\" (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua County", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Nordlige Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warszawa", + "geo-zurich": "Zürich", + "key": "Nøgle {keyId}", + "manual-server-assign-firewall": "Tildel firewallregel", + "manual-server-assign-group": "Tildel sikkerhedsgruppe", + "manual-server-create-firewall": "Opret en firewallregel", + "manual-server-create-group": "Opret en sikkerhedsgruppe", + "manual-server-description": "Med denne vejledning kan du installere Outline på en Linux-server fra {cloudProvider}.", + "manual-server-firewall": "Konfigurer din firewall", + "manual-server-install-paste": "Indsæt output fra installationen her.", + "manual-server-install-run": "Log ind på din server, og kør denne kommando.", + "manual-server-instructions": "Vejledning", + "manual-server-show-me": "Vis mig hvor", + "manual-server-title": "Følg vejledningen nedenfor", + "metrics-description": "Del anonyme metrics for at hjælpe med at gøre Outline bedre og mere stabilt både for dig selv og for andre, du deler serveren med. {openLink}Få flere oplysninger.{closeLink}", + "metrics-share": "Del metrics", + "metrics-skip": "Spring over", + "metrics-title": "Deling af metrics", + "nav-about": "Om", + "nav-data-collection": "Datasamling", + "nav-feedback": "Feedback", + "nav-help": "Hjælp", + "nav-licenses": "Licenser", + "nav-privacy": "Privatliv", + "nav-terms": "Vilkår", + "no-data-limit": "Ingen", + "notification-app-update": "En opdateret version af Outline Manager downloades. Den installeres, når du genstarter appen.", + "notification-feedback-thanks": "Tak, fordi du hjælper os med at forbedre produktet. Vi sætter stor pris på din mening.", + "notification-key-added": "Nøglen er tilføjet", + "notification-key-removed": "Nøglen er fjernet", + "notification-server-destroyed": "Serveren er slettet", + "notification-server-exists": "Serveren er allerede tilføjet", + "notification-server-removed": "Serveren er fjernet", + "oauth-account-active": "Din DigitalOcean-konto er aktiveret.", + "oauth-account-active-tag": "Kontoen er aktiveret. Indlæser serverplaceringer…", + "oauth-activate-account": "Aktivér din DigitalOcean-konto.", + "oauth-billing": "Angiv dine faktureringsoplysninger på digitalocean.com, og gå tilbage til appen, når du er færdig.", + "oauth-billing-tag": "Angiv faktureringsoplysninger...", + "oauth-connect-description": "Outline gør det nemt at oprette en server og få forbindelse ved brug af din konto.", + "oauth-connect-tag": "Venter på at oprette forbindelse til din konto...", + "oauth-connect-title": "Log ind på DigitalOcean, eller opret en konto.", + "oauth-sign-out": "Log ud", + "oauth-verify": "Tjek, om der er mail fra DigitalOcean i din indbakke, og klik på linket i mailen for at bekræfte din konto.", + "oauth-verify-tag": "Bekræft din mailadresse...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Angiv en brugerdefineret datagrænse", + "per-key-data-limit-dialog-title": "Datagrænse – {keyName}", + "region-best-value": "Bedste værdi", + "region-description": "Her kommer din internetoplevelse fra.", + "region-setup": "Konfigurer Outline", + "region-title": "Vælg din servers placering.", + "remove": "Fjern", + "retry": "Prøv igen", + "save": "Gem", + "saved": "Gemt", + "saving": "Gemmer…", + "server-access": "Serveradgang", + "server-access-key-new": "Tilføj en ny nøgle", + "server-access-key-rename": "Omdøb", + "server-access-keys": "Adgangsnøgler", + "server-connections": "Forbindelser", + "server-data-transfer": "Overførte data i løbet af de seneste 30 dage", + "server-data-used": "Procentdel af de tilladte data, der er blevet brugt i løbet af de seneste 30 dage", + "server-destroy": "Slet server", + "server-help-access-key-description": "Del din adgangsnøgle med dine venner, så de kan forbinde til din Outline-server. De kan bruge samme adgangsnøgle på alle deres enheder.", + "server-help-access-key-next": "Næste", + "server-help-access-key-title": "Opret nøgler og del adgang", + "server-help-connection-description": "Klik her for at installere Outline-klienten, og brug din personlige adgangsnøgle til din Outline-server.", + "server-help-connection-ok": "OK", + "server-help-connection-title": "Du har ikke forbindelse endnu.", + "server-keys": "Nøgler", + "server-my-access-key": "Min adgangsnøgle", + "server-name": "Outline-server {serverLocation}", + "server-remove": "Fjern server", + "server-settings": "Indstillinger", + "server-unreachable": "Serveren er uden for rækkevidde", + "server-unreachable-description": "Vi har problemer med at oprette forbindelse til denne server.", + "server-unreachable-managed-description": "Prøv igen, eller fjern denne server fra programmet.", + "server-unreachable-manual-description": "Prøv igen, eller slet denne server og den virtuelle host.", + "server-usage": "Forbrug (seneste 30 dage)", + "servers-add": "Tilføj server", + "servers-digitalocean": "DigitalOcean-servere", + "servers-gcp": "Google Cloud Platform-servere", + "servers-manual": "Servere", + "settings-access-key-port": "Port til nye adgangsnøgler", + "settings-metrics-header": "Del anonyme metrics", + "settings-server-api-url": "Webadresse til Management API", + "settings-server-cost": "Pris pr. måned", + "settings-server-creation": "Oprettet", + "settings-server-hostname": "Hostname", + "settings-server-id": "Server-id", + "settings-server-info": "Serveroplysninger", + "settings-server-location": "Serverplacering", + "settings-server-name": "Navn", + "settings-server-rename": "Angiv et nyt navn til din server. Bemærk! Navnet vises ikke på enhederne for de brugere, du har inviteret til at oprette forbindelse til serveren.", + "settings-server-version": "Serverversion", + "settings-transfer-limit": "Maks. datamængde, du kan overføre", + "setup-action": "Konfigurer", + "setup-advanced": "Avanceret", + "setup-anywhere": "Konfigurer Outline hvor som helst", + "setup-cancel": "Du kan opsige når som helst", + "setup-create": "Opret server", + "setup-description": "Har du ikke en server? Opret en konto med DigitalOcean.", + "setup-do-cost": "Kun 6 USD om måneden", + "setup-do-create": "Opret en ny server med din DigitalOcean-konto for yderligere 6 USD om måneden for at overføre op til 1 TB data.", + "setup-do-data": "Du kan overføre op til 1 TB data", + "setup-do-description": "Dette kan tage flere minutter. Du kan slette denne server når som helst.", + "setup-do-easiest": "Nemmeste konfigurationsproces", + "setup-do-title": "Konfiguration af Outline.", + "setup-firewall-instructions": "Vejledning til firewall", + "setup-gcp-create": "Opret en ny server med din Google-konto. Omkostningerne varierer efter land og forbrug.", + "setup-gcp-easy": "Nem konfigurationsproces", + "setup-gcp-free-tier": "Med {openLinkFreeTier}Free Tier{closeLink} koster din første server{openLinkIpPrice}3 USD om måneden{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Gratis prøveperiode på 90 dage{closeLink} til nye brugere", + "setup-gcp-promo": "Prøv den automatiske proces til oprettelse af Outline-server til Google Cloud", + "setup-recommended": "Anbefalet", + "setup-simple-commands": "Enkle installationskommandoer", + "setup-step-by-step": "Trinvis konfigurationsvejledning", + "setup-tested": "Testet på VULTR, Linode og Liquid Web", + "setup-title": "Vælg en skytjeneste for at konfigurere Outline.", + "share-description": "Kopiér denne invitation, og send den via et kommunikationsværktøj, du har tiltro til. {openLink}Har du brug for hjælp?{closeLink}", + "share-invite-access-key-copied": "Adgangsnøglen blev kopieret til udklipsholderen", + "share-invite-copied": "Invitationen blev kopieret til udklipsholderen", + "share-invite-copy": "Kopiér invitation", + "share-invite-copy-access-key": "Kopiér adgangsnøgle", + "share-invite-html": "Brug denne server til at få sikker adgang til det åbne internet:

1) Download og installer Outline-appen på din enhed:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Alternativt link til Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Du modtager en adgangsnøgle, som starter med ss://. Når du har modtaget den, skal du kopiere den pågældende adgangsnøgle.

3) Åbn Outline-klientappen. Hvis din adgangsnøgle registreres automatisk, skal du trykke på \"Opret forbindelse\" og fortsætte. Hvis din adgangsnøgle ikke registreres automatisk, kan du indsætte den i feltet og derefter trykke på \"Opret forbindelse\" og fortsætte.

Du er klar til at bruge det åbne internet. Du kan prøve at søge efter \"hvad er min IP-adresse\" i Google Søgning for at sikre, at du har forbindelse til serveren. Den IP-adresse, der vises på Google, skal stemme overens med IP-adressen i Outline-klienten.

Få flere oplysninger om Outline her: https://getoutline.org/", + "share-invite-instructions": "Følg vores invitationsvejledning på GitHub:", + "share-invite-trouble": "Har du problemer med at bruge invitationslinket?", + "share-title": "Del adgang", + "survey-data-limits-title": "Hjælp os med at forstå, hvordan vi kan forbedre datagrænserne", + "survey-decline": "Afvis", + "survey-disclaimer": "Hvis du klikker på Fortsæt, omdirigeres du til et kort spørgeskema i Google Analyse. Vi anbefaler, at du udfylder spørgeskemaet, mens du har forbindelse til Outline.", + "survey-go-to-survey": "Gå til spørgeskema", + "terms-of-service": "Jeg har læst og forstår {openLink}servicevilkårene for Outline{closeLink}" +} diff --git a/server_manager/messages/de.json b/server_manager/messages/de.json new file mode 100644 index 0000000000..67e1a64914 --- /dev/null +++ b/server_manager/messages/de.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline ist ein Open-Source-Projekt von Jigsaw, das Nachrichtenagenturen und Journalisten mithilfe des Proxys Shadowsocks einen sichereren Zugriff auf das Internet ermöglicht.

Da es sich noch in einem frühen Stadium befindet, können Sie über GitHub am Code mitarbeiten. Außerdem haben Sie die Möglichkeit, uns über Reddit und Medium zu folgen, um über neue Funktionen und die Verfügbarkeit auf weiteren Plattformen auf dem Laufenden zu bleiben.", + "about-version": "Version {version}", + "aws-lightsail-firewall-0": "Gehen Sie zum Bildschirm mit den {openLink}Amazon Lightsail{closeLink}-Instanzen.", + "aws-lightsail-firewall-1": "Klicken Sie auf die Instanz, auf der Sie Outline hosten möchten.", + "aws-lightsail-firewall-2": "Gehen Sie zum Tab \"Netzwerke\" (Networking).", + "aws-lightsail-firewall-3": "Klicken Sie im Abschnitt \"Firewall\" auf \"Weitere hinzufügen\" (Add another).", + "aws-lightsail-firewall-4": "Setzen Sie den Wert unter \"Anwendung\" (Application) auf \"Alle TCP und UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Klicken Sie auf \"Speichern\" (Save).", + "cancel": "Abbrechen", + "close": "Schließen", + "confirmation-server-destroy": "Bestehende Nutzer haben dann keinen Zugriff mehr. Dieser Vorgang kann nicht rückgängig gemacht werden.", + "confirmation-server-destroy-title": "Server löschen?", + "confirmation-server-remove": "Durch diesen Vorgang wird der Server aus dem Outline-Manager entfernt, der Proxyzugriff für Nutzer wird jedoch nicht blockiert. Sie müssen den Outline-Server dennoch manuell von Ihrem Hostcomputer löschen.", + "confirmation-server-remove-title": "Server entfernen?", + "data-limit": "Datenlimit", + "data-limit-per-key": "Datenlimit pro Schlüssel", + "data-limits": "Datenlimits", + "data-limits-description": "Hiermit können Sie ein Datenübertragungslimit für die Zugriffsschlüssel auf diesem Server festlegen, bei dem jeweils die letzten 30 Tage berücksichtigt werden.", + "data-limits-dialog-text": "Gehen Sie zum Tab \"Einstellungen\", um ein Datenübertragungslimit für die Zugriffsschlüssel auf diesem Server festzulegen.", + "data-limits-dialog-title": "Überschreitung von Datenvolumen vermeiden", + "data-limits-disclaimer": "Da Sie die Berichterstellung mit Messwerten nutzen, wird auch die Funktion zum Datenlimit berücksichtigt. Weitere Informationen finden Sie in unseren {openLink}Richtlinien zur Datenerhebung{closeLink}.", + "data-limits-usage": "{used} von {total} belegt", + "destroy": "Löschen", + "digitalocean-disconnect-account": "Verbindung zum DigitalOcean-Konto trennen", + "digitalocean-unreachable": "Dieser Fehler wird möglicherweise durch eine Firewall in Ihrem Netzwerk oder vorübergehende Verbindungsprobleme mit digitalocean.com verursacht.", + "disabled": "Deaktiviert", + "disconnect": "Verbindung trennen", + "done": "Fertig", + "enabled": "Aktiviert", + "error-connectivity": "Wir können keine Verbindung zu Ihrem DigitalOcean-Konto herstellen. Das kann an einem vorübergehenden Problem mit DigitalOcean oder Ihrer Internetverbindung liegen. Falls auch der nächste Versuch fehlschlägt, sollte sich das Problem durch erneute Anmeldung bei DigitalOcean lösen lassen.", + "error-connectivity-title": "Verbindungsproblem", + "error-do-account-info": "Es konnten keine Kontoinformationen von DigitalOcean abgerufen werden", + "error-do-auth": "Authentifizierung bei DigitalOcean fehlgeschlagen", + "error-do-limit": "Ihr DigitalOcean-Konto hat das Limit von {num} Droplets erreicht. Sie können hier eine Erhöhung beantragen: https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Die Liste der verfügbaren Regionen konnte nicht abgerufen werden", + "error-do-warning": "DigitalOcean-Warnung: „{message}“", + "error-feedback": "Das Feedback konnte nicht gesendet werden. Bitte versuchen Sie es noch einmal.", + "error-gcp-auth": "Authentifizierung in Google Cloud Platform fehlgeschlagen", + "error-hostname-invalid": "Hier muss eine IP-Adresse oder ein gültiger Hostname angegeben werden.", + "error-key-add": "Schlüssel konnte nicht hinzugefügt werden", + "error-key-remove": "Schlüssel konnte nicht entfernt werden", + "error-key-rename": "Schlüssel konnte nicht umbenannt werden", + "error-keys-get": "Schlüssel konnten nicht geladen werden", + "error-keys-port-bad-input": "Der Port muss als ganze Zahl zwischen 1 und 65.535 angegeben werden.", + "error-keys-port-in-use": "Der Port wird auf dem Server bereits verwendet.", + "error-licenses": "Lizenzen konnten nicht geladen werden.", + "error-metrics": "Fehler beim Aktivieren der Messwerte", + "error-network": "Ein Netzwerkfehler ist aufgetreten.", + "error-not-saved": "Nicht gespeichert", + "error-remove-data-limit": "Standard-Datenlimit konnte nicht deaktiviert werden", + "error-remove-per-key-limit": "Datenlimit dieses Zugriffsschlüssels konnte nicht entfernt werden", + "error-server-creation": "Beim Erstellen des Outline-Servers ist ein Fehler aufgetreten.", + "error-server-destroy": "Server konnte nicht gelöscht werden", + "error-server-removed": "{serverName} befindet sich nicht mehr in Ihrem DigitalOcean-Konto.", + "error-server-rename": "Server konnte nicht umbenannt werden", + "error-server-unreachable": "Ihr Outline-Server wurde erfolgreich installiert, es kann jedoch keine Verbindung hergestellt werden. Wahrscheinlich werden eingehende Verbindungen von den Firewallregeln Ihres Servers blockiert. Überprüfen Sie die Regeln und achten Sie darauf, dass eingehende TCP-Verbindungen für die Ports 1024 bis 65535 zugelassen werden.", + "error-server-unreachable-title": "Es kann keine Verbindung zu Ihrem Outline-Server hergestellt werden", + "error-servers-removed": "{serverNames} befinden sich nicht mehr in Ihrem DigitalOcean-Konto.", + "error-set-data-limit": "Standard-Datenlimit konnte nicht festgelegt werden", + "error-set-per-key-limit": "Für diesen Zugriffsschlüssel konnte kein Datenlimit festgelegt werden", + "error-unexpected": "Ein unerwarteter Fehler ist aufgetreten.", + "experimental": "Experimentell", + "experiments": "Experimentelle Funktionen", + "experiments-description": "Sie können neue Funktionen vor dem Release testen und uns Feedback senden.", + "experiments-disclaimer": "Experimentelle Funktionen befinden sich in der Entwicklungsphase und können geändert oder aus der App entfernt werden. Die Verwendung dieser Funktionen wird bei der Berichterstellung mit Messwerten berücksichtigt. Weitere Informationen finden Sie in unseren {openLink}Richtlinien zur Datenerhebung{closeLink}.", + "experiments-feedback": "Haben Sie Vorschläge? {openLink}Hier können Sie uns Feedback senden.{closeLink}", + "feedback-cloud-provider": "Cloudanbieter auswählen", + "feedback-cloud-provider-error": "Wählen Sie bitte einen Cloudanbieter aus.", + "feedback-connection": "Verbindung zu meinem Server kann nicht hergestellt werden", + "feedback-connection-others": "Andere Nutzer können keine Verbindung zu meinem Server herstellen", + "feedback-disclaimer": "Hinweis: Unser Team kann nur Feedback auf Englisch beantworten.", + "feedback-email": "E-Mail-Adresse (optional)", + "feedback-error": "Geben Sie bitte Ihr Feedback ein.", + "feedback-explanation-install": "Beim Versuch, Outline auf Ihrem Server zu installieren, ist ein Fehler aufgetreten. Wenn Sie das Problem nicht lösen können, senden Sie uns bitte Feedback und optional auch Ihre E-Mail-Adresse, damit wir Sie kontaktieren können.", + "feedback-general": "Allgemeines Feedback", + "feedback-install": "Probleme bei der Outline-Installation", + "feedback-label": "Ihr Feedback", + "feedback-management": "Probleme bei der Serververwaltung", + "feedback-other": "Sonstige", + "feedback-privacy": "Ihr Feedback, Ihre E-Mail-Adresse (falls angegeben) und weitere in der {openLink}Datenschutzerklärung{closeLink} genannten Informationen werden an das Outline-Team gesendet.", + "feedback-submit": "Einreichen", + "feedback-suggestion": "Vorschläge", + "feedback-title-generic": "Feedback senden", + "feedback-title-install": "Installation des Outline-Servers fehlgeschlagen", + "gcp-billing-action": "Weiter", + "gcp-billing-body": "Sie müssen ein {openLink}Rechnungskonto in Google Cloud hinzufügen{closeLink}", + "gcp-billing-description": "{openLink}Öffnen Sie in der Cloud Console die Seite mit den Zahlungsinformationen{closeLink} und geben Sie ein Konto an, um fortzufahren.", + "gcp-billing-error": "Zahlungsinformationen können nicht abgerufen werden", + "gcp-billing-error-zero": "Sie müssen ein Rechnungskonto angeben, um fortfahren zu können.", + "gcp-click-create": "Klicken Sie auf \"Erstellen\".", + "gcp-create-new-project": "{openLink}Erstellen Sie ein neues Google Cloud-Projekt.{closeLink}", + "gcp-create-new-vm": "{openLink}Erstellen Sie eine neue VM-Instanz.{closeLink}", + "gcp-create-project": "Google Cloud-Projekt erstellen", + "gcp-create-server": "Google Cloud-Projekt erstellen", + "gcp-create-vm": "VM-Instanz erstellen", + "gcp-disconnect-account": "Verbindung mit Google Cloud Platform-Konto trennen", + "gcp-firewall-create-0": "{openLink}Fügen Sie Ihrem Compute Engine-Projekt eine neue Firewallregel hinzu.{closeLink}", + "gcp-firewall-create-1": "Geben Sie \"outline\" in das Feld \"Name\" ein.", + "gcp-firewall-create-2": "Geben Sie \"outline\" in das Feld \"Zieltags\" ein.", + "gcp-firewall-create-3": "Geben Sie \"0.0.0.0/0\" in das Feld \"Quell-IP-Bereiche\" ein.", + "gcp-firewall-create-4": "Wählen Sie unter \"Protokolle und Ports\" die Option \"Alle zulassen\" aus.", + "gcp-name-your-project": "Geben Sie einen Namen für Ihr Projekt in das Feld \"Projektname\" (Project name) ein.", + "gcp-project-setup-error": "Fehler beim Einrichten Ihres Google Cloud-Projekts", + "gcp-select-machine-type": "Wählen Sie unter \"Maschinentyp\" (Machine type) die Option \"f1-micro\" aus.", + "gcp-select-networking": "Klicken Sie auf \"Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten\" (Management, security, disks, networking, sole tenancy) und dann auf \"Netzwerke\" (Networking)", + "gcp-select-region": "Wählen Sie unter \"Region\" eine Region in der Nähe der Nutzer des Servers aus.", + "gcp-type-network-tag": "Geben Sie \"outline\" in das Feld \"Netzwerk-Tags\" (Network tags) ein", + "gcp-type-outline-server": "Geben Sie \"outline-server\" in das Feld \"Name\" ein.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Landkreis Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Northern Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapur", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Warschau", + "geo-zurich": "Zürich", + "key": "Schlüssel: {keyId}", + "manual-server-assign-firewall": "Firewallregel zuweisen", + "manual-server-assign-group": "Sicherheitsgruppe zuweisen", + "manual-server-create-firewall": "Firewallregel erstellen", + "manual-server-create-group": "Sicherheitsgruppe erstellen", + "manual-server-description": "Mithilfe dieser Schritte können Sie Outline auf einem Linux-Server von {cloudProvider} installieren.", + "manual-server-firewall": "Firewall konfigurieren", + "manual-server-install-paste": "Fügen Sie die Ausgabe der Installation hier ein.", + "manual-server-install-run": "Melden Sie sich bei Ihrem Server an und führen Sie diesen Befehl aus.", + "manual-server-instructions": "Anleitung", + "manual-server-show-me": "Wo kann ich das tun?", + "manual-server-title": "Befolgen Sie die Anleitung unten", + "metrics-description": "Hiermit können Sie anonymisierte Messwerte freigeben, um die Zuverlässigkeit und Leistung von Outline für Sie selbst und die Nutzer Ihres Servers zu verbessern. {openLink}Weitere Informationen{closeLink}", + "metrics-share": "Messwerte freigeben", + "metrics-skip": "Überspringen", + "metrics-title": "Messwerte freigeben", + "nav-about": "Informationen zu Outline", + "nav-data-collection": "Datenerhebung", + "nav-feedback": "Feedback", + "nav-help": "Hilfe", + "nav-licenses": "Lizenzen", + "nav-privacy": "Datenschutz", + "nav-terms": "Nutzungsbedingungen", + "no-data-limit": "–", + "notification-app-update": "Eine aktualisierte Version des Outline-Managers wurde heruntergeladen. Sie wird beim nächsten Neustart der Anwendung installiert.", + "notification-feedback-thanks": "Vielen Dank, dass Sie uns helfen, Outline zu verbessern.", + "notification-key-added": "Schlüssel hinzugefügt", + "notification-key-removed": "Schlüssel entfernt", + "notification-server-destroyed": "Server gelöscht", + "notification-server-exists": "Der Server wurde bereits hinzugefügt", + "notification-server-removed": "Server entfernt", + "oauth-account-active": "Ihr DigitalOcean-Konto wurde aktiviert.", + "oauth-account-active-tag": "Das Konto wurde aktiviert. Serverstandorte werden geladen...", + "oauth-activate-account": "Aktivieren Sie Ihr DigitalOcean-Konto.", + "oauth-billing": "Geben Sie Ihre Zahlungsinformationen auf digitalocean.com ein und kehren Sie dann zur App zurück.", + "oauth-billing-tag": "Geben Sie die Zahlungsinformationen ein…", + "oauth-connect-description": "Über Ihr Konto können Sie mit Outline einfach einen Server erstellen und eine Verbindung herstellen.", + "oauth-connect-tag": "Es wird darauf gewartet, dass das Konto verbunden werden kann…", + "oauth-connect-title": "Melden Sie sich an oder erstellen Sie ein Konto bei DigitalOcean.", + "oauth-sign-out": "Abmelden", + "oauth-verify": "Sehen Sie in Ihrem Posteingang nach, ob Sie eine E-Mail von DigitalOcean erhalten haben, und klicken Sie darin auf den Link, um Ihr Konto zu bestätigen.", + "oauth-verify-tag": "Bestätigen Sie Ihre E-Mail-Adresse…", + "okay": "Ok", + "per-key-data-limit-dialog-set-custom": "Benutzerdefiniertes Datenlimit festlegen", + "per-key-data-limit-dialog-title": "Datenlimit für {keyName}", + "region-best-value": "Bestes Preis-Leistungs-Verhältnis", + "region-description": "Von diesem Serverstandort aus wird die Internetverbindung hergestellt.", + "region-setup": "Outline einrichten", + "region-title": "Wählen Sie den Standort Ihres Servers aus.", + "remove": "Entfernen", + "retry": "Noch einmal versuchen", + "save": "Speichern", + "saved": "Gespeichert", + "saving": "Wird gespeichert…", + "server-access": "Serverzugriff", + "server-access-key-new": "Neuen Schlüssel hinzufügen", + "server-access-key-rename": "Umbenennen", + "server-access-keys": "Zugriffsschlüssel", + "server-connections": "Verbindungen", + "server-data-transfer": "Übertragene Daten / letzte 30 Tage", + "server-data-used": "Genutztes Datenvolumen / letzte 30 Tage", + "server-destroy": "Server löschen", + "server-help-access-key-description": "Geben Sie Zugriffsschlüssel für andere frei, damit sie eine Verbindung zu Ihrem Outline-Server herstellen können. Auf allen Geräten kann derselbe Zugriffsschlüssel verwendet werden.", + "server-help-access-key-next": "Weiter", + "server-help-access-key-title": "Schlüssel erstellen und Zugriff freigeben", + "server-help-connection-description": "Klicken Sie hier, um die Client-App von Outline zu installieren und mit Ihrem persönlichen Zugriffsschlüssel eine Verbindung zum Outline-Server herzustellen.", + "server-help-connection-ok": "Ok.", + "server-help-connection-title": "Sie sind noch nicht verbunden.", + "server-keys": "Schlüssel", + "server-my-access-key": "Mein Zugriffsschlüssel", + "server-name": "Outline-Server {serverLocation}", + "server-remove": "Server entfernen", + "server-settings": "Einstellungen", + "server-unreachable": "Server nicht erreichbar", + "server-unreachable-description": "Wir können keine Verbindung zu diesem Server herstellen.", + "server-unreachable-managed-description": "Versuchen Sie es noch einmal oder entfernen Sie den Server aus der Anwendung.", + "server-unreachable-manual-description": "Versuchen Sie es noch einmal oder löschen Sie den Server und den virtuellen Host.", + "server-usage": "Nutzung (letzte 30 Tage)", + "servers-add": "Server hinzufügen", + "servers-digitalocean": "DigitalOcean-Server", + "servers-gcp": "Google Cloud Platform-Server", + "servers-manual": "Server", + "settings-access-key-port": "Port für neue Zugriffsschlüssel", + "settings-metrics-header": "Anonymisierte Messwerte freigeben", + "settings-server-api-url": "URL der Management API", + "settings-server-cost": "Monatliche Kosten", + "settings-server-creation": "Erstellt", + "settings-server-hostname": "Hostname", + "settings-server-id": "Server-ID", + "settings-server-info": "Serverinformationen", + "settings-server-location": "Serverstandort", + "settings-server-name": "Name", + "settings-server-rename": "Legen Sie einen neuen Namen für den Server fest. Nutzer, die Sie dazu eingeladen haben, eine Verbindung zu diesem Server herzustellen, können den Namen auf ihren Geräten nicht sehen.", + "settings-server-version": "Serverversion", + "settings-transfer-limit": "Verfügbares Datenvolumen", + "setup-action": "Einrichten", + "setup-advanced": "Fortgeschritten", + "setup-anywhere": "Outline überall einrichten", + "setup-cancel": "Jederzeit kündbar", + "setup-create": "Server erstellen", + "setup-description": "Sie haben keinen Server? Erstellen Sie einfach ein Konto bei DigitalOcean.", + "setup-do-cost": "Nur 6 $ pro Monat", + "setup-do-create": "Erstellen Sie mit Ihrem DigitalOcean-Konto für zusätzliche 6 $/30 Tage einen neuen Server mit 1 TB Datenvolumen.", + "setup-do-data": "1 TB verfügbares Datenvolumen", + "setup-do-description": "Das kann einige Minuten dauern. Sie können diesen Server jederzeit löschen.", + "setup-do-easiest": "Leicht einzurichten", + "setup-do-title": "Outline wird eingerichtet.", + "setup-firewall-instructions": "Anleitung zur Firewall", + "setup-gcp-create": "Erstellen Sie mit Ihrem Google-Konto einen neuen Server. Die Kosten variieren je nach Standort und Nutzung.", + "setup-gcp-easy": "Leicht einzurichten", + "setup-gcp-free-tier": "Mit der {openLinkFreeTier}kostenlosen Stufe{closeLink} zahlen Sie für Ihren ersten Server anfangs nur {openLinkIpPrice}3 US-$ pro Monat{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90-tägiger kostenloser Testzeitraum{closeLink} für neue Nutzer", + "setup-gcp-promo": "Outline-Server für Google Cloud mit neuem automatischem Vorgang erstellen", + "setup-recommended": "Empfohlen", + "setup-simple-commands": "Einfache Installationsbefehle", + "setup-step-by-step": "Detaillierte Anleitung für die Einrichtung", + "setup-tested": "Getestet auf VULTR, Linode und Liquid Web", + "setup-title": "Wählen Sie einen Clouddienst aus, um Outline einzurichten.", + "share-description": "Kopieren Sie diese Einladung und senden Sie sie über ein Kommunikationstool Ihrer Wahl. {openLink}Brauchen Sie Hilfe?{closeLink}", + "share-invite-access-key-copied": "Zugriffsschlüssel in Zwischenablage kopiert", + "share-invite-copied": "Einladung in Zwischenablage kopiert", + "share-invite-copy": "Einladung kopieren", + "share-invite-copy-access-key": "Zugriffsschlüssel kopieren", + "share-invite-html": "Verwenden Sie diesen Server, um sicher auf das offene Internet zuzugreifen:

1) Laden Sie die Outline App für Ihr Gerät herunter und installieren Sie sie:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Alternativer Android-Link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Sie erhalten einen Zugriffsschlüssel, der mit „ss://“ beginnt. Kopieren Sie diesen Zugriffsschlüssel.

3) Öffnen Sie die Outline-Client-App. Wenn Ihr Zugriffsschlüssel automatisch erkannt wird, tippen Sie auf „Verbinden“ und fahren Sie fort. Wenn Ihr Zugriffsschlüssel nicht automatisch erkannt wird, fügen Sie ihn in das Feld ein, tippen Sie auf „Verbinden“ und fahren Sie fort.

Sie können jetzt das offene Internet nutzen. Um zu sehen, ob Sie wirklich eine Verbindung zum Server hergestellt haben, suchen Sie in der Google Suche nach „what is my ip“. Die in Google angezeigte IP-Adresse sollte der IP-Adresse im Outline-Client entsprechen.

Weitere Informationen zu Outline finden Sie hier: https://getoutline.org/", + "share-invite-instructions": "Führen Sie die Anleitung in der Einladung auf GitHub aus:", + "share-invite-trouble": "Sie können nicht auf den Einladungslink zugreifen?", + "share-title": "Zugriff freigeben", + "survey-data-limits-title": "Helfen Sie uns, die Funktion \"Datenlimits\" zu verbessern", + "survey-decline": "Nein, danke", + "survey-disclaimer": "Wenn Sie auf \"Weiter\" (Continue) klicken, gelangen Sie zu einer kurzen Umfrage in Google Formulare. Wir empfehlen Ihnen, die Fragen zu beantworten, während eine Verbindung zu Outline besteht.", + "survey-go-to-survey": "Zur Umfrage", + "terms-of-service": "Ich habe die {openLink}Nutzungsbedingungen von Outline{closeLink} gelesen und verstanden" +} diff --git a/server_manager/messages/el.json b/server_manager/messages/el.json new file mode 100644 index 0000000000..a5a0284e98 --- /dev/null +++ b/server_manager/messages/el.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Το Outline είναι ένα έργο λογισμικού ανοικτού κώδικα το οποίο έχει δημιουργηθεί από την Jigsaw με στόχο να προσφέρει στους ειδησεογραφικούς οργανισμούς και τους δημοσιογράφους έναν ασφαλέστερο τρόπο πρόσβασης στο διαδίκτυο.

Το Outline παρέχεται με την υποστήριξη της Shadowsocks και εξακολουθεί να βρίσκεται σε πρώιμο στάδιο ανάπτυξης. Μπορείτε να συνεισφέρετε στον κώδικα στο GitHub και να μας ακολουθήσετε στο Reddit και το Medium, για να ενημερωθείτε σχετικά με την επέκταση σε περισσότερες πλατφόρμες και την προσθήκη νέων λειτουργιών.", + "about-version": "Έκδοση {version}", + "aws-lightsail-firewall-0": "Μεταβείτε στην οθόνη παρουσιών {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Κάντε κλικ στην παρουσία στην οποία θέλετε να φιλοξενήσετε το Outline.", + "aws-lightsail-firewall-2": "Μεταβείτε στην καρτέλα Δικτύωση (Networking).", + "aws-lightsail-firewall-3": "Στην ενότητα Τείχος προστασίας (Firewall), κάντε κλικ στην επιλογή Προσθήκη νέου (Add another).", + "aws-lightsail-firewall-4": "Ορίστε την τιμή Εφαρμογή (Application) σε Όλα TCP+UDP (All TCP+UDP).", + "aws-lightsail-firewall-5": "Κάντε κλικ στην Αποθήκευση.", + "cancel": "Ακύρωση", + "close": "Κλείσιμο", + "confirmation-server-destroy": "Οι υπάρχοντες χρήστες θα χάσουν την πρόσβαση. Δεν είναι δυνατή η αναίρεση αυτής της ενέργειας.", + "confirmation-server-destroy-title": "Διαγραφή διακομιστή;", + "confirmation-server-remove": "Αυτή η ενέργεια καταργεί τον διακομιστή σας από το Outline Manager, αλλά δεν αποκλείει την πρόσβαση των χρηστών στον διακομιστή μεσολάβησης. Θα χρειαστεί να διαγράψετε με μη αυτόματο τρόπο τον διακομιστή Outline από τον κεντρικό υπολογιστή σας.", + "confirmation-server-remove-title": "Κατάργηση διακομιστή;", + "data-limit": "Όριο δεδομένων", + "data-limit-per-key": "Όριο δεδομένων ανά κλειδί", + "data-limits": "Όρια δεδομένων", + "data-limits-description": "Ορίστε ένα όριο λήξης μεταφοράς δεδομένων 30 ημερών για τα κλειδιά πρόσβασης σε αυτόν τον διακομιστή.", + "data-limits-dialog-text": "Μεταβείτε στην καρτέλα Ρυθμίσεις για να ορίσετε ένα όριο μεταφοράς δεδομένων για τα κλειδιά πρόσβασης σε αυτόν τον διακομιστή.", + "data-limits-dialog-title": "Αποφύγετε την υπέρβαση των ορίων για τη χρήση δεδομένων", + "data-limits-disclaimer": "Εφόσον στέλνετε αναφορές μετρήσεων αυτήν τη στιγμή, θα συμπεριληφθεί η χρήση της λειτουργίας ορίων δεδομένων. Ανατρέξτε στην {openLink}πολιτική συλλογής δεδομένων{closeLink} για περισσότερες λεπτομέρειες.", + "data-limits-usage": "Χρησιμοποιούνται {used} από {total}", + "destroy": "Διαγραφή", + "digitalocean-disconnect-account": "Αποσύνδεση λογαριασμού DigitalOcean", + "digitalocean-unreachable": "Αυτό το σφάλμα μπορεί να οφείλεται σε ένα τείχος προστασίας στο δίκτυό σας ή σε προσωρινά προβλήματα σύνδεσης με τη διεύθυνση digitalocean.com.", + "disabled": "Απενεργοποίηση", + "disconnect": "Αποσύνδεση", + "done": "Τέλος", + "enabled": "Ενεργοποίηση", + "error-connectivity": "Αντιμετωπίζουμε πρόβλημα με τη σύνδεση με τον λογαριασμό σας DigitalOcean. Αυτό μερικές φορές αποτελεί ένα προσωρινό πρόβλημα με το DigitalOcean ή με τη σύνδεσή σας στο διαδίκτυο. Εάν δοκιμάσετε ξανά και δεν διορθωθεί το πρόβλημά σας, θα πρέπει να διορθωθεί με την επανάληψη της σύνδεσης στο DigitalOcean.", + "error-connectivity-title": "Πρόβλημα σύνδεσης", + "error-do-account-info": "Αποτυχία λήψης πληροφοριών λογαριασμού DigitalOcean", + "error-do-auth": "Ο έλεγχος ταυτότητας με το DigitalOcean απέτυχε.", + "error-do-limit": "Ο λογαριασμός σας DigitalOcean συμπλήρωσε το όριο των {num} σταγονιδίων. Μπορείτε να ζητήσετε αύξηση στη διεύθυνση https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Αποτυχία λήψης της λίστας των διαθέσιμων περιοχών", + "error-do-warning": "Προειδοποίηση DigitalOcean: \"{message}\"", + "error-feedback": "Αποτυχία υποβολής σχολίων. Δοκιμάστε ξανά.", + "error-gcp-auth": "Ο έλεγχος ταυτότητας στο Google Cloud Platform απέτυχε.", + "error-hostname-invalid": "Πρέπει να είναι μια διεύθυνση IP ή έγκυρο όνομα κεντρικού υπολογιστή.", + "error-key-add": "Αποτυχία προσθήκης κλειδιού", + "error-key-remove": "Αποτυχία κατάργησης κλειδιού", + "error-key-rename": "Αποτυχία μετονομασίας κλειδιού", + "error-keys-get": "Δεν ήταν δυνατή η φόρτωση των κλειδιών", + "error-keys-port-bad-input": "Η θύρα θα πρέπει να είναι ακέραιος μεταξύ του 1 και του 65.535.", + "error-keys-port-in-use": "Η θύρα χρησιμοποιείται ήδη στον διακομιστή.", + "error-licenses": "Δεν ήταν δυνατή η φόρτωση των αδειών.", + "error-metrics": "Σφάλμα με την ενεργοποίηση της ρύθμισης μετρήσεων", + "error-network": "Παρουσιάστηκε σφάλμα δικτύου.", + "error-not-saved": "Δεν αποθηκεύτηκε", + "error-remove-data-limit": "Δεν ήταν δυνατή η απενεργοποίηση του προσαρμοσμένου ορίου δεδομένων", + "error-remove-per-key-limit": "Δεν ήταν δυνατή η κατάργηση του ορίου δεδομένων από αυτό το κλειδί πρόσβασης", + "error-server-creation": "Παρουσιάστηκε σφάλμα κατά τη δημιουργία του διακομιστή Outline.", + "error-server-destroy": "Αποτυχία διαγραφής διακομιστή", + "error-server-removed": "Ο διακομιστής {serverName} δεν βρίσκεται πλέον στον λογαριασμό σας DigitalOcean.", + "error-server-rename": "Αποτυχία μετονομασίας διακομιστή", + "error-server-unreachable": "Ο διακομιστής σας Outline εγκαταστάθηκε σωστά, αλλά δεν είναι δυνατή η σύνδεση σε αυτόν. Η πιο πιθανή αιτία είναι ότι οι κανόνες του τείχους προστασίας του διακομιστή σας αποκλείουν τις εισερχόμενες συνδέσεις. Ελέγξτε τους και βεβαιωθείτε ότι επιτρέπετε τις εισερχόμενες συνδέσεις TCP στις θύρες από 1024 έως 65535.", + "error-server-unreachable-title": "Δεν είναι δυνατή η σύνδεση με τον διακομιστή Outline", + "error-servers-removed": "Ο διακομιστής {serverNames} δεν βρίσκεται πλέον στον λογαριασμό σας DigitalOcean.", + "error-set-data-limit": "Δεν ήταν δυνατός ο ορισμός του προεπιλεγμένου ορίου δεδομένων", + "error-set-per-key-limit": "Δεν ήταν δυνατός ο ορισμός του ορίου δεδομένων για αυτό το κλειδί πρόσβασης", + "error-unexpected": "Παρουσιάστηκε μη αναμενόμενο σφάλμα.", + "experimental": "Πειραματικό", + "experiments": "Πειράματα", + "experiments-description": "Δοκιμάστε νέες λειτουργίες και παρέχετε σχόλια πριν από την κυκλοφορία τους.", + "experiments-disclaimer": "Τα πειράματα βρίσκονται υπό ανάπτυξη και μπορεί να αλλάξουν ή να καταργηθούν από την εφαρμογή. Αν αναφέρετε μετρήσεις αυτήν τη στιγμή, θα συμπεριληφθεί η χρήση των πειραματικών λειτουργιών. Ανατρέξτε στην {openLink}πολιτική συλλογής δεδομένων{closeLink} για περισσότερες λεπτομέρειες.", + "experiments-feedback": "Έχετε κάποια πρόταση; {openLink}Υποβάλλετε σχόλια εδώ.{closeLink}", + "feedback-cloud-provider": "Επιλέξτε πάροχο cloud", + "feedback-cloud-provider-error": "Επιλέξτε πάροχο cloud.", + "feedback-connection": "Δεν μπορώ να συνδεθώ στον διακομιστή μου", + "feedback-connection-others": "Οι άλλοι χρήστες δεν μπορούν να συνδεθούν στον διακομιστή μου.", + "feedback-disclaimer": "Λάβετε υπόψη ότι η ομάδα μας μπορεί να απαντήσει σε σχόλια μόνο στα αγγλικά.", + "feedback-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικά)", + "feedback-error": "Εισαγάγετε σχόλια.", + "feedback-explanation-install": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια εγκατάστασης του Outline στον διακομιστή σας. Εάν δεν καταφέρατε να βρείτε λύση, στείλτε μας σχόλια και υποδείξτε μας τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας (προαιρετικά), ώστε να μπορέσουμε να επικοινωνήσουμε μαζί σας.", + "feedback-general": "Γενικά σχόλια", + "feedback-install": "Παρουσιάστηκε πρόβλημα με την εγκατάσταση του Outline.", + "feedback-label": "Τα σχόλιά σας", + "feedback-management": "Παρουσιάστηκε πρόβλημα με τη διαχείριση του διακομιστή μου.", + "feedback-other": "Άλλο", + "feedback-privacy": "Τα σχόλια, η διεύθυνση ηλεκτρονικού ταχυδρομείου σας (αν έχει δοθεί) και οι πρόσθετες πληροφορίες που αναφέρονται στην {openLink}πολιτική απορρήτου{closeLink} θα αποσταλούν στην ομάδα του Outline.", + "feedback-submit": "Υποβολή", + "feedback-suggestion": "Προτάσεις", + "feedback-title-generic": "Αποστολή σχολίων", + "feedback-title-install": "Η εγκατάσταση του διακομιστή Outline απέτυχε", + "gcp-billing-action": "Επόμενο", + "gcp-billing-body": "Περιμένουμε να {openLink}προσθέσετε έναν λογαριασμό χρέωσης στο Google Cloud{closeLink}.", + "gcp-billing-description": "{openLink}Ανοίξτε τη σελίδα χρέωσης του Cloud Console{closeLink} και προσθέστε έναν λογαριασμό, για να συνεχίσετε.", + "gcp-billing-error": "Δεν είναι δυνατή η ανάκτηση στοιχείων χρέωσης.", + "gcp-billing-error-zero": "Πρέπει να προσθέσετε έναν λογαριασμό χρέωσης, για να συνεχίσετε.", + "gcp-click-create": "Κάντε κλικ στη Δημιουργία (Create).", + "gcp-create-new-project": "{openLink}Δημιουργία νέου έργου Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Δημιουργία νέας παρουσίας VM{closeLink}.", + "gcp-create-project": "Δημιουργήστε ένα έργο Google Cloud", + "gcp-create-server": "Δημιουργία έργου Google Cloud", + "gcp-create-vm": "Δημιουργήστε μια παρουσία VM", + "gcp-disconnect-account": "Αποσύνδεση λογαριασμού Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Προσθέστε έναν κανόνα τείχους προστασίας{closeLink} στο έργο Compute Engine.", + "gcp-firewall-create-1": "Πληκτρολογήστε \"outline\" στο πεδίο Όνομα (Name).", + "gcp-firewall-create-2": "Πληκτρολογήστε \"outline\" στο πεδίο Στοχευόμενες ετικέτες (Target tags).", + "gcp-firewall-create-3": "Πληκτρολογήστε 0.0.0.0/0 στο πεδίο Εύρη IP πηγής (Source IP ranges).", + "gcp-firewall-create-4": "Επιλέξτε Αποδοχή όλων (Allow all) στην ενότητα Πρωτόκολλα και θύρες (Protocols and ports).", + "gcp-name-your-project": "Ονομάστε το έργο σας στο πεδίο Όνομα έργου (Project name).", + "gcp-project-setup-error": "Παρουσιάστηκε σφάλμα κατά τη ρύθμιση του έργου σας Google Cloud.", + "gcp-select-machine-type": "Επιλέξτε \"f1-micro\" στην ενότητα Τύπος μηχανήματος (Machine type).", + "gcp-select-networking": "Κάντε κλικ στην επιλογή Διαχείριση, ασφάλεια, δίσκοι, δικτύωση, αποκλειστική μίσθωση (Management, security, disks, networking, sole tenancy), και έπειτα στην επιλογή Δικτύωση (Networking).", + "gcp-select-region": "Επιλέξτε μια περιοχή κοντά στην οποία θα βρίσκονται οι χρήστες του διακομιστή στην ενότητα Περιοχή (Region).", + "gcp-type-network-tag": "Πληκτρολογήστε \"outline\" στο πεδίο Ετικέτες δικτύου (Network tags).", + "gcp-type-outline-server": "Πληκτρολογήστε \"outline-server\" στο πεδίο Όνομα (Name).", + "geo-amsterdam": "Άμστερνταμ", + "geo-bangalore": "Μπανγκαλόρ", + "geo-changhua-county": "Κομητεία Τσάνγκουα", + "geo-delhi": "Δελχί", + "geo-eemshaven": "Εμσχάφεν", + "geo-frankfurt": "Φρανκφούρτη", + "geo-hamina": "Χάμινα", + "geo-hk": "Χονγκ Κονγκ", + "geo-iowa": "Αϊόβα", + "geo-jakarta": "Τζακάρτα", + "geo-jurong-west": "Δυτική Τζουρόνγκ", + "geo-las-vegas": "Λας Βέγκας", + "geo-london": "Λονδίνο", + "geo-los-angeles": "Λος Άντζελες", + "geo-melbourne": "Μελβούρνη", + "geo-montreal": "Μόντρεαλ", + "geo-mumbai": "Μουμπάι", + "geo-new-york-city": "Νέα Υόρκη", + "geo-northern-virginia": "Βόρεια Βιρτζίνια", + "geo-oregon": "Όρεγκον", + "geo-osaka": "Οσάκα", + "geo-salt-lake-city": "Σολτ Λέικ Σίτι", + "geo-san-francisco": "Σαν Φρανσίσκο", + "geo-sao-paulo": "Σάο Πάολο", + "geo-seoul": "Σεούλ", + "geo-sg": "Σιγκαπούρη", + "geo-south-carolina": "Νότια Καρολίνα", + "geo-st-ghislain": "Σεν Ζισλέν", + "geo-sydney": "Σίδνεϊ", + "geo-tokyo": "Τόκιο", + "geo-toronto": "Τορόντο", + "geo-warsaw": "Βαρσοβία", + "geo-zurich": "Ζυρίχη", + "key": "Κλειδί {keyId}", + "manual-server-assign-firewall": "Εκχώρηση κανόνα τείχους προστασίας", + "manual-server-assign-group": "Εκχώρηση ομάδας ασφάλειας", + "manual-server-create-firewall": "Δημιουργήστε έναν κανόνα τείχους προστασίας", + "manual-server-create-group": "Δημιουργήστε μια ομάδα ασφάλειας", + "manual-server-description": "Αυτά τα βήματα θα σας βοηθήσουν να εγκαταστήσετε το Outline σε έναν διακομιστή Linux {cloudProvider}.", + "manual-server-firewall": "Διαμόρφωση τείχους προστασίας", + "manual-server-install-paste": "Επικολλήστε εδώ την έξοδο εγκατάστασης.", + "manual-server-install-run": "Συνδεθείτε στον διακομιστή σας και εκτελέστε αυτήν την εντολή.", + "manual-server-instructions": "Οδηγίες", + "manual-server-show-me": "Εμφάνιση τοποθεσίας", + "manual-server-title": "Ακολουθήστε τις παρακάτω οδηγίες", + "metrics-description": "Κοινοποιήστε ανώνυμες μετρήσεις για να βελτιώσετε την αξιοπιστία και την απόδοση του Outline, για εσάς και για τους χρήστες με τους οποίους μοιράζεστε τον διακομιστή σας. {openLink}Μάθετε περισσότερα.{closeLink}", + "metrics-share": "Κοινοποίηση μετρήσεων", + "metrics-skip": "Παράβλεψη", + "metrics-title": "Κοινοποίηση μετρήσεων", + "nav-about": "Πληροφορίες", + "nav-data-collection": "Συλλογή δεδομένων", + "nav-feedback": "Σχόλια", + "nav-help": "Βοήθεια", + "nav-licenses": "Άδειες", + "nav-privacy": "Απόρρητο", + "nav-terms": "Όροι", + "no-data-limit": "Κανένα", + "notification-app-update": "Έγινε λήψη μιας ενημερωμένης έκδοσης του Outline Manager. Θα εγκατασταθεί όταν κάνετε επανεκκίνηση της εφαρμογής.", + "notification-feedback-thanks": "Σας ευχαριστούμε που μας βοηθάτε να βελτιωθούμε! Μας αρέσει να λαμβάνουμε σχόλια από εσάς.", + "notification-key-added": "Το κλειδί προστέθηκε", + "notification-key-removed": "Το κλειδί καταργήθηκε", + "notification-server-destroyed": "Ο διακομιστής διαγράφηκε.", + "notification-server-exists": "Ο διακομιστής έχει προστεθεί ήδη.", + "notification-server-removed": "Ο διακομιστής καταργήθηκε", + "oauth-account-active": "Ο λογαριασμός σας DigitalOcean ενεργοποιήθηκε.", + "oauth-account-active-tag": "Ο λογαριασμός ενεργοποιήθηκε! Φόρτωση τοποθεσιών διακομιστή…", + "oauth-activate-account": "Ενεργοποιήστε τον λογαριασμό σας DigitalOcean.", + "oauth-billing": "Καταχωρίστε τα στοιχεία χρέωσής σας στη διεύθυνση digitalocean.com και επιστρέψτε στην εφαρμογή μόλις τελειώσετε.", + "oauth-billing-tag": "Εισαγάγετε στοιχεία χρέωσης…", + "oauth-connect-description": "Με τον λογαριασμό σας, το Outline διευκολύνει τη δημιουργία ενός διακομιστή και τη σύνδεση.", + "oauth-connect-tag": "Αναμονή για τη σύνδεση λογαριασμού…", + "oauth-connect-title": "Συνδεθείτε ή δημιουργήστε έναν λογαριασμό με το DigitalOcean.", + "oauth-sign-out": "Αποσύνδεση", + "oauth-verify": "Ελέγξτε τα εισερχόμενά σας για ένα μήνυμα ηλεκτρονικού ταχυδρομείου από το DigitalOcean και κάντε κλικ στον σύνδεσμο σε αυτό για να επιβεβαιώσετε τον λογαριασμό σας.", + "oauth-verify-tag": "Επιβεβαιώστε τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας…", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Ορισμός προσαρμοσμένου ορίου δεδομένων", + "per-key-data-limit-dialog-title": "Όριο δεδομένων - {keyName}", + "region-best-value": "Καλύτερη τιμή", + "region-description": "Από αυτήν την τοποθεσία θα προέρχεται η εμπειρία σας στο διαδίκτυο.", + "region-setup": "Ρύθμιση Outline", + "region-title": "Επιλέξτε την τοποθεσία του διακομιστή σας.", + "remove": "Κατάργηση", + "retry": "Επανάληψη", + "save": "Αποθήκευση", + "saved": "Αποθηκεύτηκε", + "saving": "Αποθήκευση…", + "server-access": "Πρόσβαση διακομιστή", + "server-access-key-new": "Προσθήκη νέου κλειδιού", + "server-access-key-rename": "Μετονομασία", + "server-access-keys": "Κλειδιά πρόσβασης", + "server-connections": "Συνδέσεις", + "server-data-transfer": "Δεδομένα που μεταφέρθηκαν / τελευταίες 30 ημέρες", + "server-data-used": "Ποσοστό του ορίου που χρησιμοποιήθηκε / τελευταίες 30 ημέρες", + "server-destroy": "Διαγραφή διακομιστή", + "server-help-access-key-description": "Κοινοποιήστε τα κλειδιά πρόσβασης στους φίλους σας, ώστε να μπορούν να συνδεθούν στον διακομιστή Outline. Μπορούν να χρησιμοποιούν το ίδιο κλειδί πρόσβασης σε όλες τις συσκευές τους.", + "server-help-access-key-next": "Επόμενο", + "server-help-access-key-title": "Δημιουργήστε κλειδιά και μοιραστείτε την πρόσβαση.", + "server-help-connection-description": "Κάντε κλικ εδώ για να εγκαταστήσετε την εφαρμογή πελάτης Outline, χρησιμοποιώντας το προσωπικό κλειδί πρόσβασής στον διακομιστή Outline.", + "server-help-connection-ok": "Το κατάλαβα!", + "server-help-connection-title": "Δεν έχετε συνδεθεί ακόμη!", + "server-keys": "Κλειδιά", + "server-my-access-key": "Το κλειδί πρόσβασής μου", + "server-name": "Διακομιστής Outline {serverLocation}", + "server-remove": "Κατάργηση διακομιστή", + "server-settings": "Ρυθμίσεις", + "server-unreachable": "Δεν είναι δυνατή η επικοινωνία με τον διακομιστή", + "server-unreachable-description": "Αντιμετωπίζουμε πρόβλημα με τη σύνδεση σε αυτόν τον διακομιστή.", + "server-unreachable-managed-description": "Δοκιμάστε ξανά ή καταργήστε αυτόν τον διακομιστή από την εφαρμογή.", + "server-unreachable-manual-description": "Δοκιμάστε ξανά ή διαγράψτε αυτόν τον διακομιστή και τον εικονικό κεντρικό υπολογιστή.", + "server-usage": "Χρήση (τελευταίες 30 ημέρες)", + "servers-add": "Προσθήκη διακομιστή", + "servers-digitalocean": "Διακομιστές DigitalOcean", + "servers-gcp": "Διακομιστές Google Cloud Platform", + "servers-manual": "Διακομιστές", + "settings-access-key-port": "Θύρα για νέα κλειδιά πρόσβασης", + "settings-metrics-header": "Κοινοποίηση ανώνυμων μετρήσεων", + "settings-server-api-url": "Management API URL", + "settings-server-cost": "Μηνιαίο κόστος", + "settings-server-creation": "Δημιουργήθηκε", + "settings-server-hostname": "Όνομα κεντρικού υπολογιστή", + "settings-server-id": "Αναγνωριστικό διακομιστή", + "settings-server-info": "Πληροφορίες διακομιστή", + "settings-server-location": "Τοποθεσία διακομιστή", + "settings-server-name": "Όνομα", + "settings-server-rename": "Ορίστε ένα νέο όνομα για τον διακομιστή σας. Λάβετε υπόψη ότι αυτό δεν θα αντικατοπτρίζεται στις συσκευές των χρηστών που προσκαλέσατε να συνδεθούν σε αυτόν.", + "settings-server-version": "Έκδοση διακομιστή", + "settings-transfer-limit": "Όριο μεταφοράς δεδομένων", + "setup-action": "Ρύθμιση", + "setup-advanced": "Σύνθετες", + "setup-anywhere": "Ρυθμίστε το Outline οπουδήποτε", + "setup-cancel": "Ακύρωση ανά πάσα στιγμή", + "setup-create": "Δημιουργία διακομιστή", + "setup-description": "Δεν διαθέτετε διακομιστή; Δημιουργήστε έναν λογαριασμό με το DigitalOcean.", + "setup-do-cost": "Μόνο 6 $ ΗΠΑ τον μήνα", + "setup-do-create": "Δημιουργήστε έναν νέο διακομιστή με τον λογαριασμό σας DigitalOcean με επιπλέον 6 $ ΗΠΑ/30 ημέρες για μεταφορά 1 TB δεδομένων.", + "setup-do-data": "Όριο μεταφοράς 1 TB δεδομένων", + "setup-do-description": "Μπορεί να χρειαστούν αρκετά λεπτά. Μπορείτε να καταστρέψετε αυτόν τον διακομιστή ανά πάσα στιγμή.", + "setup-do-easiest": "Πιο εύκολη διαδικασία ρύθμισης", + "setup-do-title": "Ρύθμιση Outline.", + "setup-firewall-instructions": "Οδηγίες τείχους προστασίας", + "setup-gcp-create": "Δημιουργήστε έναν νέο διακομιστή με τον λογαριασμό σας Google. Το κόστος διαφέρει ανάλογα με την τοποθεσία και τη χρήση.", + "setup-gcp-easy": "Εύκολη διαδικασία ρύθμισης", + "setup-gcp-free-tier": "Με το πρόγραμμα {openLinkFreeTier}Free Tier{closeLink}, o πρώτος σας διακομιστής ξεκινά στα {openLinkIpPrice}3$ ΗΠΑ/μήνα{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Δωρεάν δοκιμή 90 ημερών{closeLink} για νέους χρήστες", + "setup-gcp-promo": "Δοκιμάστε τη νέα αυτόματη διαδικασία δημιουργίας διακομιστή Outline για το Google Cloud", + "setup-recommended": "Συνιστάται", + "setup-simple-commands": "Απλές εντολές εγκατάστασης", + "setup-step-by-step": "Αναλυτικός οδηγός ρύθμισης", + "setup-tested": "Δοκιμάστηκε σε VULTR, Linode και Liquid Web", + "setup-title": "Επιλέξτε μια υπηρεσία cloud για να ρυθμίσετε το Outline.", + "share-description": "Αντιγράψτε αυτήν την πρόσκληση και στείλτε τη από ένα εργαλείο επικοινωνίας που εμπιστεύεστε. {openLink}Χρειάζεστε βοήθεια;{closeLink}", + "share-invite-access-key-copied": "Το κλειδί πρόσβασης αντιγράφηκε στο πρόχειρο", + "share-invite-copied": "Η πρόσκληση αντιγράφηκε στο πρόχειρο", + "share-invite-copy": "Αντιγραφή πρόσκλησης", + "share-invite-copy-access-key": "Αντιγραφή κλειδιού πρόσβασης", + "share-invite-html": "Χρησιμοποιήστε αυτόν τον διακομιστή για να αποκτήσετε ασφαλή πρόσβαση στο ανοικτό διαδίκτυο:

1) Κατεβάστε και εγκαταστήστε την εφαρμογή Outline για τη συσκευή σας:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Εναλλακτικός σύνδεσμος Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Θα λάβετε ένα κλειδί πρόσβασης που ξεκινά με ss://. Μόλις το λάβετε, αντιγράψτε αυτό το κλειδί πρόσβασης.

3) Ανοίξτε την εφαρμογή πελάτη Outline. Εάν το κλειδί πρόσβασης εντοπιστεί αυτόματα, πατήστε Σύνδεση και συνεχίστε. Εάν το κλειδί πρόσβασης δεν εντοπιστεί αυτόματα, τότε επικολλήστε το στο πεδίο και, στη συνέχεια, πατήστε Σύνδεση και συνεχίστε.

Είστε έτοιμοι να χρησιμοποιήσετε το ανοικτό διαδίκτυο! Για να βεβαιωθείτε ότι έχετε συνδεθεί επιτυχώς στον διακομιστή, δοκιμάστε τον όρο αναζήτησης \"what is my ip\" στην Αναζήτηση Google. Η διεύθυνση IP που εμφανίζεται στο Google θα πρέπει να αντιστοιχεί στη διεύθυνση IP στην εφαρμογή πελάτη Outline.

Μάθετε περισσότερα σχετικά με το Outline εδώ: https://getoutline.org/", + "share-invite-instructions": "Ακολουθήστε τις οδηγίες στην πρόσκληση στο GitHub:", + "share-invite-trouble": "Αντιμετωπίζετε πρόβλημα με την πρόσβαση στον σύνδεσμο πρόσκλησης;", + "share-title": "Κοινή χρήση πρόσβασης", + "survey-data-limits-title": "Βοηθήστε μας να κατανοήσουμε πώς να βελτιώσουμε τα όρια δεδομένων.", + "survey-decline": "Απόρριψη", + "survey-disclaimer": "Κάνοντας κλικ στο κουμπί Συνέχεια, θα λάβετε σε μια σύντομη έρευνα στις Φόρμες Google. Συνιστούμε να απαντήσετε στην έρευνα ενώ είστε συνδεδεμένοι στο Outline.", + "survey-go-to-survey": "Μετάβαση στην έρευνα", + "terms-of-service": "Διάβασα και κατανόησα τους {openLink}Όρους Παροχής Υπηρεσιών του Outline{closeLink}" +} diff --git a/server_manager/messages/en-GB.json b/server_manager/messages/en-GB.json new file mode 100644 index 0000000000..6c74e5eff2 --- /dev/null +++ b/server_manager/messages/en-GB.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline is an open-source project created by Jigsaw to provide a safer way for news organisations and journalists to access the Internet.

Outline is powered by Shadowsocks and is still an early stage product. You can contribute to the code on GitHub, and follow us on Reddit and Medium to find out when we expand to more platforms and add new features.", + "about-version": "Version {version}", + "aws-lightsail-firewall-0": "Navigate to the {openLink}Amazon Lightsail{closeLink} instances screen.", + "aws-lightsail-firewall-1": "Click the instance on which you want to host Outline.", + "aws-lightsail-firewall-2": "Navigate to the 'Networking' tab.", + "aws-lightsail-firewall-3": "In the 'Firewall' section, click 'Add another'.", + "aws-lightsail-firewall-4": "Set 'Application' value to 'All TCP+UDP'.", + "aws-lightsail-firewall-5": "Click 'Save'.", + "cancel": "Cancel", + "close": "Close", + "confirmation-server-destroy": "Existing users will lose access. This action cannot be undone.", + "confirmation-server-destroy-title": "Destroy server?", + "confirmation-server-remove": "This action removes your server from the Outline manager, but does not block proxy access to users. You will still need to manually delete the Outline server from your host machine.", + "confirmation-server-remove-title": "Remove server?", + "data-limit": "Data limit", + "data-limit-per-key": "Data limit per key", + "data-limits": "Data limits", + "data-limits-description": "Set a 30-day trailing data transfer limit for access keys on this server.", + "data-limits-dialog-text": "Go to the Settings tab to set a data transfer limit for access keys on this server.", + "data-limits-dialog-title": "Avoid data overages", + "data-limits-disclaimer": "Since you are currently reporting metrics, use of the data limits feature will be included. Please see the {openLink}data collection policy{closeLink} for more details.", + "data-limits-usage": "{used} of {total} used", + "destroy": "Destroy", + "digitalocean-disconnect-account": "Disconnect DigitalOcean account", + "digitalocean-unreachable": "This error may be due to a firewall on your network or temporary connectivity issues with digitalocean.com.", + "disabled": "Disabled", + "disconnect": "Disconnect", + "done": "Done", + "enabled": "Enabled", + "error-connectivity": "We're having trouble connecting to your DigitalOcean account. This is sometimes a temporary problem with DigitalOcean or with your Internet connection. If retrying doesn't work, logging in to DigitalOcean again should fix the problem.", + "error-connectivity-title": "Connection problem", + "error-do-account-info": "Failed to get DigitalOcean account information", + "error-do-auth": "Authentication with DigitalOcean failed", + "error-do-limit": "Your DigitalOcean account has reached its limit of {num} Droplets. You can request an increase at https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Failed to get list of available regions", + "error-do-warning": "DigitalOcean warning: ‘{message}’", + "error-feedback": "Failed to submit feedback. Please try again.", + "error-gcp-auth": "Authentication with Google Cloud Platform failed", + "error-hostname-invalid": "Must be an IP address or valid hostname.", + "error-key-add": "Failed to add key", + "error-key-remove": "Failed to remove key", + "error-key-rename": "Failed to rename key", + "error-keys-get": "Could not load keys", + "error-keys-port-bad-input": "The port must be an integer between 1 and 65,535.", + "error-keys-port-in-use": "The port is already in use on the server.", + "error-licenses": "Could not load licences.", + "error-metrics": "Error setting metrics enabled", + "error-network": "A network error has occurred.", + "error-not-saved": "Not saved", + "error-remove-data-limit": "Could not disable default data limit", + "error-remove-per-key-limit": "Could not remove data limit from this access key", + "error-server-creation": "There was an error creating your Outline server.", + "error-server-destroy": "Failed to destroy server", + "error-server-removed": "{serverName} no longer present in your DigitalOcean account.", + "error-server-rename": "Failed to rename server", + "error-server-unreachable": "Your Outline server was installed correctly, but we are not able to connect to it. Most likely this is because your server's firewall rules are blocking incoming connections. Please review them and make sure that you allow incoming TCP connections on ports ranging from 1024 to 65535.", + "error-server-unreachable-title": "Unable to connect to your Outline server", + "error-servers-removed": "{serverNames} no longer present in your DigitalOcean account.", + "error-set-data-limit": "Could not set default data limit", + "error-set-per-key-limit": "Could not set data limit for this access key", + "error-unexpected": "An unexpected error has occurred.", + "experimental": "Experimental", + "experiments": "Experiments", + "experiments-description": "Test new features and provide us with feedback before they are released.", + "experiments-disclaimer": "Experiments are in development and may change or be removed from the app. If you are currently reporting metrics, use of experimental features will be included. Please see the {openLink}data collection policy{closeLink} for more details.", + "experiments-feedback": "Have suggestions? {openLink}Submit feedback here.{closeLink}", + "feedback-cloud-provider": "Select cloud provider", + "feedback-cloud-provider-error": "Please select a cloud provider.", + "feedback-connection": "Can't connect to my server", + "feedback-connection-others": "Others can't connect to my server", + "feedback-disclaimer": "Please note that our team is only able to answer feedback in English.", + "feedback-email": "Email address (optional)", + "feedback-error": "Please enter feedback.", + "feedback-explanation-install": "An error occurred while attempting to install Outline on your server. If you haven't been able to figure out a solution, please consider sending us feedback and telling us your email address (optional) so that we can get back to you.", + "feedback-general": "General feedback", + "feedback-install": "Having trouble installing Outline", + "feedback-label": "Your feedback", + "feedback-management": "Having trouble managing my server", + "feedback-other": "Other", + "feedback-privacy": "Your feedback, email address (if provided) and additional information referred to in the {openLink}privacy policy{closeLink} will be sent to the Outline team.", + "feedback-submit": "Submit", + "feedback-suggestion": "Suggestions", + "feedback-title-generic": "Send feedback", + "feedback-title-install": "Outline server installation failed", + "gcp-billing-action": "Next", + "gcp-billing-body": "Waiting for you to {openLink}add a billing account on Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Open the Cloud Console billing page{closeLink} and add an account in order to proceed.", + "gcp-billing-error": "Unable to retrieve billing information", + "gcp-billing-error-zero": "You must add a billing account before proceeding.", + "gcp-click-create": "Click 'Create'.", + "gcp-create-new-project": "{openLink}Create a new Google Cloud project{closeLink}.", + "gcp-create-new-vm": "{openLink}Create a new VM instance{closeLink}.", + "gcp-create-project": "Create a Google Cloud project", + "gcp-create-server": "Create your Google Cloud project", + "gcp-create-vm": "Create a VM Instance", + "gcp-disconnect-account": "Disconnect Google Cloud Platform account", + "gcp-firewall-create-0": "{openLink}Add a new firewall rule{closeLink} to your Compute Engine project.", + "gcp-firewall-create-1": "Type 'outline' in the 'Name' field.", + "gcp-firewall-create-2": "Type 'outline' in the 'Target tags' field.", + "gcp-firewall-create-3": "Type '0.0.0.0/0' in the 'Source IP ranges' field.", + "gcp-firewall-create-4": "Select 'Allow all' under 'Protocols and ports'.", + "gcp-name-your-project": "Name your project in the 'Project name' field.", + "gcp-project-setup-error": "An error occurred whilst setting up your Google Cloud project", + "gcp-select-machine-type": "Select 'f1-micro' under 'Machine type'", + "gcp-select-networking": "Click 'Management, security, disks, networking, sole tenancy', then 'Networking'", + "gcp-select-region": "Select a region close to where the server's users will be under 'Region'.", + "gcp-type-network-tag": "Type 'outline' in the 'Network tags' field", + "gcp-type-outline-server": "Type 'outline-server' in the 'Name' field.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua County", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Northern Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "St Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warsaw", + "geo-zurich": "Zürich", + "key": "Key {keyId}", + "manual-server-assign-firewall": "Assign firewall rule", + "manual-server-assign-group": "Assign security group", + "manual-server-create-firewall": "Create a firewall rule", + "manual-server-create-group": "Create a security group", + "manual-server-description": "These steps will help you install Outline on a {cloudProvider} Linux server.", + "manual-server-firewall": "Configure your firewall", + "manual-server-install-paste": "Paste your installation output here.", + "manual-server-install-run": "Log in to your server, and run this command.", + "manual-server-instructions": "Instructions", + "manual-server-show-me": "Show me where", + "manual-server-title": "Follow the instructions below", + "metrics-description": "Share anonymised metrics to help improve the reliability and performance of Outline, for you and for those who you share your server with. {openLink}Learn more.{closeLink}", + "metrics-share": "Share metrics", + "metrics-skip": "Skip", + "metrics-title": "Metrics sharing", + "nav-about": "About", + "nav-data-collection": "Data collection", + "nav-feedback": "Feedback", + "nav-help": "Help", + "nav-licenses": "Licences", + "nav-privacy": "Privacy", + "nav-terms": "Terms", + "no-data-limit": "None", + "notification-app-update": "An updated version of the Outline manager has been downloaded. It will be installed when you restart the application.", + "notification-feedback-thanks": "Thanks for helping us improve! We love hearing from you.", + "notification-key-added": "Key added", + "notification-key-removed": "Key removed", + "notification-server-destroyed": "Server destroyed", + "notification-server-exists": "Server already added", + "notification-server-removed": "Server removed", + "oauth-account-active": "Your DigitalOcean account has been activated.", + "oauth-account-active-tag": "Account activated! Loading server locations...", + "oauth-activate-account": "Activate your DigitalOcean account.", + "oauth-billing": "Enter your billing information on digitalocean.com and return to the app once you have finished.", + "oauth-billing-tag": "Enter billing information...", + "oauth-connect-description": "With your account, Outline makes it easy to create a server and get connected.", + "oauth-connect-tag": "Waiting to connect your account...", + "oauth-connect-title": "Sign in or create an account with DigitalOcean.", + "oauth-sign-out": "Sign out", + "oauth-verify": "Check your inbox for an email from DigitalOcean, and click the link in it to confirm your account.", + "oauth-verify-tag": "Confirm your email...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Set a custom data limit", + "per-key-data-limit-dialog-title": "Data limit – {keyName}", + "region-best-value": "Best value", + "region-description": "This is where your Internet experience will come from.", + "region-setup": "Set up Outline", + "region-title": "Select the location of your server.", + "remove": "Remove", + "retry": "Retry", + "save": "Save", + "saved": "Saved", + "saving": "Saving…", + "server-access": "Server access", + "server-access-key-new": "Add new key", + "server-access-key-rename": "Rename", + "server-access-keys": "Access keys", + "server-connections": "Connections", + "server-data-transfer": "Data transferred/last 30 days", + "server-data-used": "Allowance used/last 30 days", + "server-destroy": "Destroy server", + "server-help-access-key-description": "Share access keys with friends, so that they can connect to your Outline server. They can use the same access key on all their devices.", + "server-help-access-key-next": "Next", + "server-help-access-key-title": "Create keys, share access", + "server-help-connection-description": "Click here to install the Outline client app, using your personal access key to your Outline server.", + "server-help-connection-ok": "Okay, got it!", + "server-help-connection-title": "You are not connected yet!", + "server-keys": "Keys", + "server-my-access-key": "My access key", + "server-name": "Outline Server {serverLocation}", + "server-remove": "Remove server", + "server-settings": "Settings", + "server-unreachable": "Server unreachable", + "server-unreachable-description": "We're having issues connecting to this server.", + "server-unreachable-managed-description": "Try again or remove this server from the application.", + "server-unreachable-manual-description": "Try again or destroy this server and the virtual host.", + "server-usage": "Usage (last 30 days)", + "servers-add": "Add server", + "servers-digitalocean": "DigitalOcean servers", + "servers-gcp": "Google Cloud Platform servers", + "servers-manual": "Servers", + "settings-access-key-port": "Port for new access keys", + "settings-metrics-header": "Share anonymous metrics", + "settings-server-api-url": "Management API URL", + "settings-server-cost": "Monthly cost", + "settings-server-creation": "Created", + "settings-server-hostname": "Hostname", + "settings-server-id": "Server ID", + "settings-server-info": "Server information", + "settings-server-location": "Server location", + "settings-server-name": "Name", + "settings-server-rename": "Set a new name for your server. Note that this will not be reflected on the devices of the users that you invited to connect to it.", + "settings-server-version": "Server version", + "settings-transfer-limit": "Data transfer allowance", + "setup-action": "Set up", + "setup-advanced": "Advanced", + "setup-anywhere": "Set up Outline anywhere", + "setup-cancel": "Cancel at any time", + "setup-create": "Create server", + "setup-description": "Don't have a server? Create an account with DigitalOcean.", + "setup-do-cost": "Only US$6 a month", + "setup-do-create": "Create a new server with your DigitalOcean account for an additional US$6/30 days for 1 TB of data transfer.", + "setup-do-data": "1 TB data transfer allowance", + "setup-do-description": "This could take several minutes. You can destroy this server at any time.", + "setup-do-easiest": "Easiest setup process", + "setup-do-title": "Setting up Outline.", + "setup-firewall-instructions": "Firewall instructions", + "setup-gcp-create": "Create a new server with your Google Account. Costs vary by location and usage.", + "setup-gcp-easy": "Easy setup process", + "setup-gcp-free-tier": "With {openLinkFreeTier}Free Tier{closeLink}, your first server starts at {openLinkIpPrice}US $3/month{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90-day free trial{closeLink} for new users", + "setup-gcp-promo": "Try the new automatic outline server creation process for Google Cloud", + "setup-recommended": "Recommended", + "setup-simple-commands": "Simple install commands", + "setup-step-by-step": "Step-by-step setup guide", + "setup-tested": "Tested on VULTR, Linode and Liquid Web", + "setup-title": "Choose a cloud service to set up Outline.", + "share-description": "Copy this invitation and send it from a communication tool that you trust. {openLink}Need help?{closeLink}", + "share-invite-access-key-copied": "Copied access key to clipboard", + "share-invite-copied": "Copied invitation to clipboard", + "share-invite-copy": "Copy invitation", + "share-invite-copy-access-key": "Copy access key", + "share-invite-html": "Use this server to safely access the Open Internet:

1) Download and install the Outline app for your device:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android alternative link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) You will receive an access key that starts with ss://. Once you receive the key, copy it.

3) Open the Outline client app. If your access key is auto-detected, tap 'Connect' and proceed. If your access key is not auto-detected, paste it in the field, then tap 'Connect' and proceed.

You're ready to use the Open Internet! To make sure that you've successfully connected to the server, try searching for 'what is my IP' on Google Search. The IP address shown in Google should match the IP address in the Outline client.

Learn more about Outline here: https://getoutline.org/", + "share-invite-instructions": "Follow our invitation instructions on GitHub:", + "share-invite-trouble": "Having trouble accessing the invitation link?", + "share-title": "Share access", + "survey-data-limits-title": "Help us understand how to improve data limits", + "survey-decline": "Decline", + "survey-disclaimer": "By clicking continue, you will be sent to a short survey on Google Forms. We recommend taking the survey while connected to Outline.", + "survey-go-to-survey": "Go to survey", + "terms-of-service": "I have read and understood the {openLink}Outline Terms of Service{closeLink}" +} diff --git a/server_manager/messages/en.json b/server_manager/messages/en.json new file mode 100644 index 0000000000..22471fccf4 --- /dev/null +++ b/server_manager/messages/en.json @@ -0,0 +1,280 @@ +{ + "about-outline": "Outline is an open source project created by Jigsaw to provide a safer way for news organizations and journalists to access the internet.

Outline is powered by Shadowsocks and is still an early stage product. You can contribute to the code on GitHub, and follow us on Reddit and Medium to hear when we expand to more platforms and add new features.", + "about-version": "Version {version}", + "aws-lightsail-firewall-0": "Navigate to the {openLink}Amazon Lightsail{closeLink} instances screen.", + "aws-lightsail-firewall-1": "Click the instance on which you want to host Outline.", + "aws-lightsail-firewall-2": "Navigate to the 'Networking' tab.", + "aws-lightsail-firewall-3": "In the 'Firewall' section, click 'Add another'.", + "aws-lightsail-firewall-4": "Set 'Application' value to 'All TCP+UDP'.", + "aws-lightsail-firewall-5": "Click 'Save'.", + "cancel": "Cancel", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua County", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Northern Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warsaw", + "geo-zurich": "Zürich", + "close": "Close", + "confirmation-server-destroy": "Existing users will lose access. This action cannot be undone.", + "confirmation-server-destroy-title": "Destroy Server?", + "confirmation-server-remove": "This action removes your server from the Outline Manager, but does not block proxy access to users. You will still need to manually delete the Outline server from your host machine.", + "confirmation-server-remove-title": "Remove Server?", + "data-limit": "Data Limit", + "data-limit-per-key": "Data limit per key", + "data-limits": "Data limits", + "data-limits-description": "Set a 30 day trailing data transfer limit for access keys on this server.", + "data-limits-dialog-text": "Go to the Settings tab to set a data transfer limit for access keys on this server.", + "data-limits-dialog-title": "Avoid data overages", + "data-limits-disclaimer": "Since you are currently reporting metrics, use of the data limits feature will be included. Please see the {openLink}data collection policy{closeLink} for more details.", + "data-limits-usage": "{used} of {total} used", + "destroy": "Destroy", + "disconnect": "Disconnect", + "digitalocean-disconnect-account": "Disconnect DigitalOcean account", + "digitalocean-unreachable": "This error may be due to a firewall on your network or temporary connectivity issues with digitalocean.com.", + "disabled": "Disabled", + "done": "Done", + "enabled": "Enabled", + "error-connectivity": "We're having trouble connecting to your DigitalOcean account. This is sometimes a temporary problem with DigitalOcean or with your internet connection. If retrying doesn't work, logging into DigitalOcean again should fix the problem.", + "error-connectivity-title": "Connection problem", + "error-do-account-info": "Failed to get DigitalOcean account information", + "error-do-auth": "Authentication with DigitalOcean failed", + "error-do-regions": "Failed to get list of available regions", + "error-do-limit": "Your DigitalOcean account has reached its limit of {num} Droplets. You can request an increase at https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-warning": "DigitalOcean warning: \"{message}\"", + "error-gcp-auth": "Authentication with Google Cloud Platform failed", + "error-feedback": "Failed to submit feedback. Please try again.", + "error-hostname-invalid": "Must be an IP address or valid hostname.", + "error-key-add": "Failed to add key", + "error-key-remove": "Failed to remove key", + "error-key-rename": "Failed to rename key", + "error-keys-get": "Could not load keys", + "error-keys-port-bad-input": "The port must be an integer between 1 and 65,535.", + "error-keys-port-in-use": "The port is already in use on the server.", + "error-licenses": "Could not load licenses.", + "error-metrics": "Error setting metrics enabled", + "error-network": "A network error occurred.", + "error-not-saved": "Not Saved", + "error-remove-data-limit": "Could not disable default data limit", + "error-remove-per-key-limit": "Could not remove data limit from this access key", + "error-server-creation": "There was an error creating your Outline server.", + "error-server-destroy": "Failed to destroy server", + "error-server-removed": "{serverName} no longer present in your DigitalOcean account.", + "error-server-rename": "Failed to rename server", + "error-server-unreachable": "Your Outline Server was installed correctly, but we are not able to connect to it. Most likely this is because your server's firewall rules are blocking incoming connections. Please review them and make sure to allow incoming TCP connections on ports ranging from 1024 to 65535.", + "error-server-unreachable-title": "Unable to connect to your Outline Server", + "error-servers-removed": "{serverNames} no longer present in your DigitalOcean account.", + "error-set-data-limit": "Could not set default data limit", + "error-set-per-key-limit": "Could not set data limit for this access key", + "error-unexpected": "An unexpected error occurred.", + "experimental": "Experimental", + "experiments": "Experiments", + "experiments-description": "Test new features and provide us with feedback before they are released.", + "experiments-disclaimer": "Experiments are in development and may change or be removed from the app. If you are currently reporting metrics, use of experimental features will be included. Please see the {openLink}data collection policy{closeLink} for more details.", + "experiments-feedback": "Have suggestions? {openLink}Submit feedback here.{closeLink}", + "feedback-cloud-provider": "Select cloud provider", + "feedback-cloud-provider-error": "Please select a cloud provider.", + "feedback-connection": "Can't connect to my server", + "feedback-connection-others": "Others can't connect to my server", + "feedback-disclaimer": "Please note that our team is only able to answer feedback in English.", + "feedback-email": "Email address (optional)", + "feedback-error": "Please enter feedback.", + "feedback-explanation-install": "An error occurred while attempting to install Outline on your server. If you haven't been able to figure out a solution, please consider sending us feedback and telling us your email address (optional) so that we can get back to you.", + "feedback-general": "General feedback", + "feedback-install": "Having trouble installing Outline", + "feedback-label": "Your feedback", + "feedback-management": "Having trouble managing my server", + "feedback-other": "Other", + "feedback-privacy": "Your feedback, email address (if provided) and additional information referred to in the {openLink}privacy policy{closeLink} will be sent to the Outline team.", + "feedback-submit": "Submit", + "feedback-suggestion": "Suggestions", + "feedback-title-generic": "Send Feedback", + "feedback-title-install": "Outline Server Installation Failed", + "gcp-billing-title": "Add billing information to your Google Cloud Platform account.", + "gcp-billing-description": "{openLink}Open the Cloud Console billing page{closeLink} and add an account in order to proceed.", + "gcp-billing-action": "Next", + "gcp-billing-body": "Waiting for you to {openLink}add a billing account on Google Cloud{closeLink}", + "gcp-billing-error": "Unable to retrieve billing information", + "gcp-billing-error-zero": "You must add a billing account before proceeding.", + "gcp-click-create": "Click 'Create'.", + "gcp-create-new-project": "{openLink}Create a new Google Cloud Project{closeLink}.", + "gcp-create-new-vm": "{openLink}Create a new VM instance{closeLink}.", + "gcp-create-project": "Create a Google Cloud project", + "gcp-create-server": "Create your server", + "gcp-create-vm": "Create a VM instance", + "gcp-disconnect-account": "Disconnect Google Cloud Platform account", + "gcp-firewall-create-0": "{openLink}Add a new firewall rule{closeLink} to your Compute Engine project.", + "gcp-firewall-create-1": "Type 'outline' in the 'Name' field.", + "gcp-firewall-create-2": "Type 'outline' in the 'Target tags' field.", + "gcp-firewall-create-3": "Type '0.0.0.0/0' in the 'Source IP ranges' field.", + "gcp-firewall-create-4": "Select 'Allow all' under 'Protocols and ports'.", + "gcp-oauth-connect-title": "Sign in or create an account with Google Cloud Platform.", + "gcp-project-setup-error": "An error occurred while setting up your Google Cloud project", + "gcp-name-your-project": "Name your project in the 'Project name' field.", + "gcp-select-machine-type": "Select 'f1-micro' under 'Machine type'.", + "gcp-select-networking": "Click 'Management, security, disks, networking, sole tenancy', then 'Networking'", + "gcp-select-region": "Select a region close to where the server's users will be under 'Region'.", + "gcp-type-network-tag": "Type 'outline' in the 'Network tags' field.", + "gcp-type-outline-server": "Type 'outline-server' in the 'Name' field.", + "key": "Key {keyId}", + "manager-resources": "Manager Resources", + "management-api-documentation": "Server Management API Documentation", + "manual-server-assign-firewall": "Assign firewall rule", + "manual-server-assign-group": "Assign Security Group", + "manual-server-create-firewall": "Create a firewall rule", + "manual-server-create-group": "Create a Security Group", + "manual-server-description": "These steps will help you install Outline on a {cloudProvider} Linux server.", + "manual-server-firewall": "Configure your firewall", + "manual-server-install-paste": "Paste your installation output here.", + "manual-server-install-run": "Log into your server, and run this command.", + "manual-server-install-step": "Install Outline on to your VM", + "manual-server-instructions": "Instructions", + "manual-server-show-me": "Show me where", + "manual-server-title": "Follow the instructions below", + "metrics-description": "Share anonymized metrics to help improve the reliability and performance of Outline, for you and for those you share your server with. {openLink}Learn more.{closeLink}", + "metrics-share": "Share metrics", + "metrics-skip": "Skip", + "metrics-title": "Metrics sharing", + "nav-about": "About", + "nav-data-collection": "Data collection", + "nav-feedback": "Feedback", + "nav-help": "Help", + "nav-licenses": "Licenses", + "nav-privacy": "Privacy", + "nav-terms": "Terms", + "no-data-limit": "None", + "notification-app-update": "An updated version of the Outline Manager has been downloaded. It will be installed when you restart the application.", + "notification-feedback-thanks": "Thanks for helping us improve! We love hearing from you.", + "notification-key-added": "Key added", + "notification-key-removed": "Key removed", + "notification-server-destroyed": "Server destroyed", + "notification-server-exists": "Server already added", + "notification-server-removed": "Server removed", + "oauth-account-active": "Your DigitalOcean account has been activated.", + "oauth-account-active-tag": "Account activated! Loading server locations...", + "oauth-activate-account": "Activate your DigitalOcean account.", + "oauth-billing": "Enter your billing information on digitalocean.com and return to the app once you are done.", + "oauth-billing-tag": "Enter billing information...", + "oauth-connect-description": "With your account, Outline makes it easy to create a server and get connected.", + "oauth-connect-tag": "Waiting to connect your account...", + "oauth-connect-title": "Sign in or create an account with DigitalOcean.", + "oauth-sign-out": "Sign Out", + "oauth-verify": "Check your inbox for an email from DigitalOcean, and click the link in it to confirm your account.", + "oauth-verify-tag": "Confirm your email...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Set a custom data limit", + "per-key-data-limit-dialog-title": "Data Limit - {keyName}", + "region-description": "This is where your internet experience will come from.", + "region-best-value": "Best Value", + "region-setup": "Set up Outline", + "region-title": "Select the location of your server.", + "remove": "Remove", + "retry": "Retry", + "save": "Save", + "saved": "Saved", + "saving": "Saving...", + "server-access": "Server access", + "server-access-key-new": "Add new key", + "server-access-key-rename": "Rename", + "server-access-keys": "Access keys", + "server-connections": "Connections", + "server-data-transfer": "Data transferred / last 30 days", + "server-data-used": "Allowance used / last 30 days", + "server-destroy": "Destroy server", + "server-help-access-key-description": "Share access keys with friends, so they can connect to your Outline server. They can use the same access key on all their devices.", + "server-help-access-key-next": "Next", + "server-help-access-key-title": "Create keys, share access", + "server-help-connection-description": "Click here to install the Outline client app, using your personal access key to your Outline server.", + "server-help-connection-ok": "Okay, got it!", + "server-help-connection-title": "You are not connected yet!", + "server-keys": "Keys", + "server-my-access-key": "My access key", + "server-name": "Outline Server {serverLocation}", + "server-remove": "Remove server", + "server-settings": "Settings", + "server-unreachable": "Server unreachable", + "server-unreachable-description": "We're having issues connecting to this server.", + "server-unreachable-managed-description": "Try again or remove this server from the application.", + "server-unreachable-manual-description": "Try again or destroy this server and the virtual host.", + "server-usage": "Usage (last 30 days)", + "servers-add": "Add server", + "servers-digitalocean": "DigitalOcean servers", + "servers-gcp": "Google Cloud Platform servers", + "servers-manual": "Servers", + "settings-access-key-port": "Port for new access keys", + "settings-metrics-header": "Share anonymous metrics", + "settings-server-api-url": "Management API URL", + "settings-server-cost": "Monthly cost", + "settings-server-creation": "Created", + "settings-server-hostname": "Hostname", + "settings-server-id": "Server ID", + "settings-server-info": "Server Information", + "settings-server-location": "Server location", + "settings-server-name": "Name", + "settings-server-rename": "Set a new name for your server. Note that this will not be reflected on the devices of the users that you invited to connect to it.", + "settings-server-version": "Server version", + "settings-transfer-limit": "Data transfer allowance", + "setup-action": "Set up", + "setup-advanced": "Advanced", + "setup-anywhere": "Set up Outline anywhere", + "setup-create": "Create server", + "setup-description": "Don't have a server? Create an account with DigitalOcean.", + "setup-cancel": "Cancel at any time", + "setup-do-cost": "Only US$6 a month", + "setup-do-create": "Create a new server with your DigitalOcean account for an additional US$6/30 days for 1 TB of data transfer.", + "setup-do-data": "1 TB data transfer allowance", + "setup-do-description": "This could take several minutes. You can destroy this server at any time.", + "setup-do-easiest": "Easiest setup process", + "setup-do-title": "Setting up Outline.", + "setup-firewall-instructions": "Firewall instructions", + "setup-gcp-easy": "Easy setup process", + "setup-gcp-free-tier": "With {openLinkFreeTier}Free Tier{closeLink}, your first server starts at {openLinkIpPrice}US$3/month{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 day free trial{closeLink} for new users", + "setup-gcp-create": "Create a new server with your Google account. Costs vary by location and usage.", + "setup-gcp-promo": "Try the new automatic Outline server creation process for Google Cloud", + "setup-recommended": "Recommended", + "setup-simple-commands": "Simple install commands", + "setup-step-by-step": "Step-by-step set-up guide", + "setup-tested": "Tested on VULTR, Linode, and Liquid Web", + "setup-title": "Choose a cloud service to set up Outline.", + "share-description": "Copy this invitation and send it from a communication tool you trust. {openLink}Need help?{closeLink}", + "share-invite-access-key-copied": "Copied access key to clipboard", + "share-invite-html": "Use this server to safely access the open internet:

1) Download and install the Outline app for your device:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android alternative link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) You will receive an access key that starts with ss://. Once your receive it, copy this access key.

3) Open the Outline client app. If your access key is auto-detected, tap \"Connect\" and proceed. If your access key is not auto-detected, then paste it in the field, then tap \"Connect\" and proceed.

You're ready to use the open internet! To make sure you successfully connected to the server, try searching for \"what is my ip\" on Google Search. The IP address shown in Google should match the IP address in the Outline client.

Learn more about Outline here: https://getoutline.org/", + "share-invite-copied": "Copied invitation to clipboard", + "share-invite-copy": "Copy invitation", + "share-invite-copy-access-key": "Copy access key", + "share-invite-instructions": "Follow our invitation instructions on GitHub:", + "share-invite-trouble": "Having trouble accessing the invitation link?", + "share-title": "Share access", + "survey-data-limits-title": "Help us understand how to improve data limits", + "survey-decline": "Decline", + "survey-disclaimer": "By clicking continue you will be sent to a short survey on Google Forms. We recommend taking the survey while connected to Outline.", + "survey-go-to-survey": "Go to survey", + "terms-of-service": "I have read and understood the {openLink}Outline Terms of Service{closeLink}" +} diff --git a/server_manager/messages/es-419.json b/server_manager/messages/es-419.json new file mode 100644 index 0000000000..29d332c22a --- /dev/null +++ b/server_manager/messages/es-419.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline es un proyecto de código abierto que Jigsaw creó para que los periodistas y las organizaciones de noticias tengan una forma más segura de acceder a Internet.

Outline es un producto que cuenta con la tecnología de Shadowsocks y que aún se encuentra en una etapa inicial. Puedes colaborar con el código en GitHub y seguirnos en Reddit y Medium para estar al tanto cuando nos expandamos a más plataformas y agreguemos nuevas funciones.", + "about-version": "Versión {version}", + "aws-lightsail-firewall-0": "Navega a la pantalla de las instancias de {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Haz clic en la instancia en la que quieras alojar Outline.", + "aws-lightsail-firewall-2": "Navega a la pestaña \"Redes\" (Networking).", + "aws-lightsail-firewall-3": "En la sección \"Firewall\", haz clic en \"Agregar otra\" (Add another).", + "aws-lightsail-firewall-4": "Establece el valor de \"App\" (Application) en \"Todo TCP+UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Haz clic en \"Guardar\" (Save).", + "cancel": "Cancelar", + "close": "Cerrar", + "confirmation-server-destroy": "Los usuarios existentes perderán el acceso. Esta acción no se puede deshacer.", + "confirmation-server-destroy-title": "¿Deseas destruir el servidor?", + "confirmation-server-remove": "Esta acción quita tu servidor de Outline Manager, pero no bloquea el acceso de proxy a los usuarios. Aún así deberás borrar manualmente el servidor de Outline de tu máquina de host.", + "confirmation-server-remove-title": "¿Deseas quitar el servidor?", + "data-limit": "Límite de datos", + "data-limit-per-key": "Límite de datos por clave", + "data-limits": "Límites de datos", + "data-limits-description": "Establece un límite de transferencia de datos de 30 días para las claves de acceso en este servidor.", + "data-limits-dialog-text": "Ve a la pestaña Configuración para establecer un límite de transferencia de datos para las claves de acceso en este servidor.", + "data-limits-dialog-title": "Evita los recargos de datos", + "data-limits-disclaimer": "Dado que actualmente informas métricas, se incluirá el uso de la función de límites de datos. Si deseas conocer más detalles, consulta la {openLink}política de recopilación de datos{closeLink}.", + "data-limits-usage": "{used} de {total} en uso", + "destroy": "Destruir", + "digitalocean-disconnect-account": "Desconectar la cuenta de DigitalOcean", + "digitalocean-unreachable": "Es posible que este error se deba a un firewall de tu red o a problemas de conectividad temporales con digitalocean.com.", + "disabled": "Inhabilitada", + "disconnect": "Desconectar", + "done": "Listo", + "enabled": "Habilitada", + "error-connectivity": "Tenemos problemas para conectarnos con tu cuenta de DigitalOcean. En ocasiones, esto se debe a un problema temporal con DigitalOcean o con tu conexión a Internet. Si vuelves a intentarlo y el problema persiste, accede nuevamente a DigitalOcean para solucionarlo.", + "error-connectivity-title": "Problema de conexión", + "error-do-account-info": "No se pudo obtener la información de la cuenta de DigitalOcean", + "error-do-auth": "No se pudo realizar la autenticación con DigitalOcean", + "error-do-limit": "Tu cuenta de DigitalOcean alcanzó el límite de {num} Droplets. Puedes solicitar un aumento en https://cloud.digitalocean.com/account/team/droplet_limit_Increase.", + "error-do-regions": "No se pudo obtener la lista de regiones disponibles", + "error-do-warning": "Advertencia de DigitalOcean: “{message}”", + "error-feedback": "No se pudieron enviar los comentarios. Vuelve a intentarlo.", + "error-gcp-auth": "Falló la autenticación con Google Cloud Platform", + "error-hostname-invalid": "Debe ser una dirección IP o un nombre de host válido.", + "error-key-add": "No se pudo agregar la clave", + "error-key-remove": "No se pudo quitar la clave", + "error-key-rename": "No se pudo cambiar el nombre de la clave", + "error-keys-get": "No se pudieron cargar las claves", + "error-keys-port-bad-input": "El puerto debe ser un número entero entre 1 y 65,535.", + "error-keys-port-in-use": "El puerto ya está en uso en el servidor.", + "error-licenses": "No se pudieron cargar las licencias.", + "error-metrics": "Se produjo un error al habilitar las métricas", + "error-network": "Se produjo un error de red.", + "error-not-saved": "No se guardó", + "error-remove-data-limit": "No se pudo inhabilitar el límite de datos predeterminado", + "error-remove-per-key-limit": "No se pudo quitar el límite de datos de esta clave de acceso", + "error-server-creation": "Se produjo un error al crear tu servidor de Outline.", + "error-server-destroy": "No se pudo destruir el servidor", + "error-server-removed": "{serverName} ya no aparece en tu cuenta de DigitalOcean.", + "error-server-rename": "No se pudo cambiar el nombre del servidor", + "error-server-unreachable": "Se instaló correctamente tu servidor de Outline, pero no podemos conectarnos a él. Lo más probable es que esto se deba a que las reglas del firewall de tu servidor bloquean las conexiones entrantes. Revísalas y asegúrate de permitir las conexiones TCP entrantes en los puertos que van de 1024 a 65535.", + "error-server-unreachable-title": "No se puede establecer la conexión con tu servidor de Outline", + "error-servers-removed": "{serverNames} ya no aparecen en tu cuenta de DigitalOcean.", + "error-set-data-limit": "No se pudo establecer el límite de datos predeterminado", + "error-set-per-key-limit": "No se pudo establecer el límite de datos para esta clave de acceso", + "error-unexpected": "Se produjo un error inesperado.", + "experimental": "Experimental", + "experiments": "Experimentos", + "experiments-description": "Prueba funciones nuevas y bríndanos comentarios antes de que se lancen.", + "experiments-disclaimer": "Los experimentos están en etapa de desarrollo y es posible que cambien o se quiten de la app. Si actualmente informas métricas, se incluirá el uso de funciones experimentales. Si deseas conocer más detalles, consulta la {openLink}política de recopilación de datos{closeLink}.", + "experiments-feedback": "¿Tienes alguna sugerencia? {openLink}Envíanos tus comentarios aquí.{closeLink}", + "feedback-cloud-provider": "Seleccionar un proveedor de nube", + "feedback-cloud-provider-error": "Selecciona un proveedor de nube.", + "feedback-connection": "No puedo conectarme a mi servidor", + "feedback-connection-others": "Los demás no pueden conectarse a mi servidor", + "feedback-disclaimer": "Ten en cuenta que nuestro equipo solo puede responder comentarios en inglés.", + "feedback-email": "Dirección de correo electrónico (opcional)", + "feedback-error": "Ingresa tus comentarios.", + "feedback-explanation-install": "Se produjo un error al intentar instalar Outline en tu servidor. Si no pudiste encontrar una solución, evalúa enviarnos tus comentarios y proporcionarnos tu dirección de correo electrónico (opcional) para que podamos comunicarnos contigo.", + "feedback-general": "Comentarios generales", + "feedback-install": "Tengo problemas para instalar Outline", + "feedback-label": "Tus comentarios", + "feedback-management": "Tengo problemas para administrar mi servidor", + "feedback-other": "Otro", + "feedback-privacy": "Tus comentarios, tu dirección de correo electrónico (si proporcionaste una) y la información adicional a la que se hace referencia en la {openLink}Política de Privacidad{closeLink} se enviarán al equipo de Outline.", + "feedback-submit": "Enviar", + "feedback-suggestion": "Sugerencias", + "feedback-title-generic": "Enviar comentarios", + "feedback-title-install": "No se pudo instalar el servidor de Outline", + "gcp-billing-action": "Siguiente", + "gcp-billing-body": "Esperando a que {openLink}agregues una cuenta de facturación en Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Abre la página de facturación de Cloud Console{closeLink} y agrega una cuenta para continuar.", + "gcp-billing-error": "No se puede recuperar la información de facturación", + "gcp-billing-error-zero": "Debes agregar una cuenta de facturación antes de continuar.", + "gcp-click-create": "Haz clic en \"Crear\".", + "gcp-create-new-project": "{openLink}Crea un proyecto de Google Cloud nuevo{closeLink}.", + "gcp-create-new-vm": "{openLink}Crea una instancia de VM nueva{closeLink}.", + "gcp-create-project": "Crea un proyecto de Google Cloud", + "gcp-create-server": "Crea tu proyecto de Google Cloud", + "gcp-create-vm": "Crea una instancia de VM", + "gcp-disconnect-account": "Desconectar cuenta de Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Agrega una nueva regla de firewall{closeLink} a tu proyecto de Compute Engine.", + "gcp-firewall-create-1": "Ingresa \"Outline\" en el campo \"Nombre\".", + "gcp-firewall-create-2": "Ingresa \"Outline\" en el campo \"Etiquetas de destino\".", + "gcp-firewall-create-3": "Ingresa \"0.0.0.0/0\" en el campo \"Rangos de IP de origen\".", + "gcp-firewall-create-4": "En \"Protocolos y puertos\", selecciona \"Permitir todos\".", + "gcp-name-your-project": "En el campo \"Nombre del proyecto\" (Project name), asígnale un nombre a tu proyecto.", + "gcp-project-setup-error": "Se produjo un error al configurar el proyecto de Google Cloud", + "gcp-select-machine-type": "En \"Tipo de máquina\" (Machine type), selecciona \"f1-micro\"", + "gcp-select-networking": "Haz clic en \"Administración, seguridad, discos, redes, usuario único\" (Management, security, disks, networking, sole tenancy) y, luego, selecciona \"Redes\" (Networking)", + "gcp-select-region": "En \"Región\" (Region), selecciona una región cercana al lugar en que se encontrarán los usuarios del servidor.", + "gcp-type-network-tag": "Ingresa \"outline\" en el campo \"Etiquetas de red\" (Network tags).", + "gcp-type-outline-server": "Ingresa \"outline-server\" en el campo \"Nombre\" (Name).", + "geo-amsterdam": "Ámsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Condado de Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Fráncfort", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Yakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londres", + "geo-los-angeles": "Los Ángeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Bombay", + "geo-new-york-city": "Nueva York", + "geo-northern-virginia": "Virginia del Norte", + "geo-oregon": "Oregón", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seúl", + "geo-sg": "Singapur", + "geo-south-carolina": "Carolina del Sur", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sídney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsovia", + "geo-zurich": "Zúrich", + "key": "Clave {keyId}", + "manual-server-assign-firewall": "Asignar regla de firewall", + "manual-server-assign-group": "Asignar grupo de seguridad", + "manual-server-create-firewall": "Crear una regla de firewall", + "manual-server-create-group": "Crear un grupo de seguridad", + "manual-server-description": "Estos pasos te ayudarán a instalar Outline en un servidor Linux de {cloudProvider}.", + "manual-server-firewall": "Configurar tu firewall", + "manual-server-install-paste": "Pega el resultado de la instalación aquí.", + "manual-server-install-run": "Accede a tu servidor y ejecuta este comando.", + "manual-server-instructions": "Instrucciones", + "manual-server-show-me": "Mostrarme dónde", + "manual-server-title": "Sigue las instrucciones que aparecen debajo", + "metrics-description": "Comparte métricas anonimizadas para ayudar a mejorar la confiabilidad y el rendimiento de Outline, tanto para ti como para aquellos con los que compartes tu servidor. {openLink}Más información.{closeLink}", + "metrics-share": "Compartir métricas", + "metrics-skip": "Omitir", + "metrics-title": "Uso compartido de métricas", + "nav-about": "Información", + "nav-data-collection": "Recopilación de datos", + "nav-feedback": "Comentarios", + "nav-help": "Ayuda", + "nav-licenses": "Licencias", + "nav-privacy": "Privacidad", + "nav-terms": "Condiciones", + "no-data-limit": "Ninguno", + "notification-app-update": "Se descargó una versión actualizada de Outline Manager. Esta versión se instalará cuando reinicies la app.", + "notification-feedback-thanks": "Gracias por ayudarnos a mejorar. Nos encanta recibir tus comentarios.", + "notification-key-added": "Se agregó la clave", + "notification-key-removed": "Se quitó la clave", + "notification-server-destroyed": "Se destruyó el servidor", + "notification-server-exists": "Ya se agregó el servidor", + "notification-server-removed": "Se quitó el servidor", + "oauth-account-active": "Se activó tu cuenta de DigitalOcean.", + "oauth-account-active-tag": "Se activó la cuenta. Cargando las ubicaciones del servidor…", + "oauth-activate-account": "Activar tu cuenta de DigitalOcean", + "oauth-billing": "Ingresa tus datos de facturación en digitalocean.com y vuelve a la app cuando hayas terminado.", + "oauth-billing-tag": "Ingresa los datos de facturación…", + "oauth-connect-description": "Con tu cuenta, Outline te permite crear un servidor y conectarte fácilmente.", + "oauth-connect-tag": "Esperando a conectar tu cuenta…", + "oauth-connect-title": "Accede o crea una cuenta con DigitalOcean.", + "oauth-sign-out": "Salir", + "oauth-verify": "Consulta tu carpeta Recibidos para ver si recibiste un correo electrónico de DigitalOcean y haz clic en el vínculo que aparece en él a fin de confirmar tu cuenta.", + "oauth-verify-tag": "Confirma tu correo electrónico…", + "okay": "Aceptar", + "per-key-data-limit-dialog-set-custom": "Establecer un límite de datos personalizado", + "per-key-data-limit-dialog-title": "Límite de datos: {keyName}", + "region-best-value": "Mejor relación calidad-precio", + "region-description": "Esta es la ubicación de la que provendrá tu experiencia de Internet.", + "region-setup": "Configurar Outline", + "region-title": "Selecciona la ubicación de tu servidor.", + "remove": "Quitar", + "retry": "Volver a intentarlo", + "save": "Guardar", + "saved": "Se guardó", + "saving": "Guardando…", + "server-access": "Acceso al servidor", + "server-access-key-new": "Agregar nueva clave", + "server-access-key-rename": "Cambiar nombre", + "server-access-keys": "Claves de acceso", + "server-connections": "Conexiones", + "server-data-transfer": "Datos transferidos/Últimos 30 días", + "server-data-used": "Cantidad permitida que se utilizó/Últimos 30 días", + "server-destroy": "Destruir servidor", + "server-help-access-key-description": "Comparte las claves de acceso con tus amigos para que puedan conectarse a tu servidor de Outline. Podrán usar la misma clave de acceso en todos sus dispositivos.", + "server-help-access-key-next": "Siguiente", + "server-help-access-key-title": "Crear claves, compartir el acceso", + "server-help-connection-description": "Haz clic aquí para instalar la app de cliente de Outline por medio de la clave de acceso personal a tu servidor de Outline.", + "server-help-connection-ok": "Entendido", + "server-help-connection-title": "Aún no estás conectado", + "server-keys": "Claves", + "server-my-access-key": "Mi clave de acceso", + "server-name": "Servidor de Outline {serverLocation}", + "server-remove": "Quitar servidor", + "server-settings": "Configuración", + "server-unreachable": "El servidor es inaccesible", + "server-unreachable-description": "Tenemos problemas para conectarnos a este servidor.", + "server-unreachable-managed-description": "Vuelve a intentarlo o quita este servidor de la app.", + "server-unreachable-manual-description": "Vuelve a intentarlo, o bien destruye este servidor y el host virtual.", + "server-usage": "Uso (últimos 30 días)", + "servers-add": "Agregar servidor", + "servers-digitalocean": "Servidores de DigitalOcean", + "servers-gcp": "Servidores de Google Cloud Platform", + "servers-manual": "Servidores", + "settings-access-key-port": "Puerto para nuevas claves de acceso", + "settings-metrics-header": "Compartir métricas anónimas", + "settings-server-api-url": "URL de la API de administración", + "settings-server-cost": "Costo mensual", + "settings-server-creation": "Fecha de creación", + "settings-server-hostname": "Nombre de host", + "settings-server-id": "ID de servidor", + "settings-server-info": "Información del servidor", + "settings-server-location": "Ubicación del servidor", + "settings-server-name": "Nombre", + "settings-server-rename": "Establece un nuevo nombre para tu servidor. Ten en cuenta que este cambio no se verá reflejado en los dispositivos de los usuarios a los que invitaste a conectarse al servidor.", + "settings-server-version": "Versión del servidor", + "settings-transfer-limit": "Transferencia de datos permitida", + "setup-action": "Configurar", + "setup-advanced": "Avanzada", + "setup-anywhere": "Configurar Outline en cualquier lugar", + "setup-cancel": "Cancela en cualquier momento", + "setup-create": "Crear servidor", + "setup-description": "¿No tienes un servidor? Crea una cuenta con DigitalOcean.", + "setup-do-cost": "Solo USD 6 al mes", + "setup-do-create": "Crea un nuevo servidor con tu cuenta de DigitalOcean por un importe adicional de USD 6 cada 30 días y obtén 1 TB de transferencia de datos.", + "setup-do-data": "Se permite 1 TB de transferencia de datos", + "setup-do-description": "Esto puede demorar varios minutos. Puedes destruir el servidor en cualquier momento.", + "setup-do-easiest": "El proceso de configuración más fácil", + "setup-do-title": "Configurando Outline.", + "setup-firewall-instructions": "Instrucciones para el firewall", + "setup-gcp-create": "Crea un nuevo servidor con tu Cuenta de Google. El costo varía según la ubicación y el uso.", + "setup-gcp-easy": "Proceso de configuración sencillo", + "setup-gcp-free-tier": "Con el {openLinkFreeTier}nivel gratuito{closeLink}, el primer servidor tiene un costo inicial de {openLinkIpPrice}USD 3 por mes{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Prueba gratuita de 90 días{closeLink} para usuarios nuevos", + "setup-gcp-promo": "Prueba el nuevo proceso automático de creación de servidores de Outline para Google Cloud", + "setup-recommended": "Recomendado", + "setup-simple-commands": "Comandos de instalación simples", + "setup-step-by-step": "Guía de configuración paso a paso", + "setup-tested": "Se probó en VULTR, Linode y Liquid Web", + "setup-title": "Elige un servicio de nube para configurar Outline.", + "share-description": "Copia esta invitación y envíala desde una herramienta de comunicación que te resulte confiable. {openLink}¿Necesitas ayuda?{closeLink}", + "share-invite-access-key-copied": "Se copió la clave de acceso en el portapapeles", + "share-invite-copied": "Se copió la invitación en el portapapeles", + "share-invite-copy": "Copiar invitación", + "share-invite-copy-access-key": "Copiar clave de acceso", + "share-invite-html": "Usa este servidor para acceder de forma segura a la Internet abierta:

1) Descarga e instala la app de Outline para tu dispositivo:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Vínculo alternativo para Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Recibirás una clave de acceso que comienza con ss://. Cuando la recibas, cópiala.

3) Abre la app cliente de Outline. Si se detecta automáticamente la clave de acceso, presiona “Conectar” y continúa. De lo contrario, pégala en el campo, presiona “Conectar” y continúa.

Ya puedes usar la Internet abierta. Para asegurarte de que te conectaste correctamente al servidor, busca “cuál es mi IP” en la Búsqueda de Google. La dirección IP que se muestre en Google debe coincidir con la del cliente de Outline.

Más información sobre Outline: https://getoutline.org/", + "share-invite-instructions": "Sigue nuestras instrucciones de invitación en GitHub:", + "share-invite-trouble": "¿Tienes problemas para acceder al vínculo de la invitación?", + "share-title": "Compartir acceso", + "survey-data-limits-title": "Ayúdanos a comprender cómo podemos mejorar los límites de datos", + "survey-decline": "Rechazar", + "survey-disclaimer": "Si haces clic en \"Continuar\" (Continue), se te enviará una breve encuesta en Formularios de Google. Te recomendamos que la realices mientras estés conectado a Outline.", + "survey-go-to-survey": "Ir a la encuesta", + "terms-of-service": "Leí y comprendí las {openLink}Condiciones del Servicio de Outline{closeLink}" +} diff --git a/server_manager/messages/es.json b/server_manager/messages/es.json new file mode 100644 index 0000000000..84554dd850 --- /dev/null +++ b/server_manager/messages/es.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline es un proyecto de código abierto creado por Jigsaw que permite a las agencias de información y a los periodistas acceder a Internet de manera más segura.

Outline utiliza la tecnología de Shadowsocks y aún está en fase de desarrollo. Puedes colaborar en el código en GitHub, y seguirnos en Reddit y en Medium para saber cuándo ampliamos el proyecto a más plataformas y añadimos nuevas funciones.", + "about-version": "Versión {version}", + "aws-lightsail-firewall-0": "Desplázate a la pantalla de instancias de {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Haz clic en la instancia en la que quieras alojar Outline.", + "aws-lightsail-firewall-2": "Desplázate a la pestaña Redes (Networking).", + "aws-lightsail-firewall-3": "En la sección Cortafuegos (Firewall), haz clic en Añadir otro (Add another).", + "aws-lightsail-firewall-4": "Configura el valor de Aplicación (Application) en Todos los TCP y UDP (All TCP+UDP).", + "aws-lightsail-firewall-5": "Haz clic en Guardar (Save).", + "cancel": "Cancelar", + "close": "Cerrar", + "confirmation-server-destroy": "Los usuarios actuales dejarán de tener acceso. Esta acción no se puede deshacer.", + "confirmation-server-destroy-title": "¿Eliminar el servidor?", + "confirmation-server-remove": "Al ejecutar esta acción, se eliminará tu servidor del Administrador de Outline, pero no se bloqueará el acceso mediante proxy a los usuarios. Aun así, tendrás que eliminar manualmente el servidor de Outline de tu equipo host.", + "confirmation-server-remove-title": "¿Eliminar el servidor?", + "data-limit": "Límite de datos", + "data-limit-per-key": "Límite de datos por clave", + "data-limits": "Límites de datos", + "data-limits-description": "Establece un límite de transferencia de datos de 30 días consecutivos para las claves de acceso de este servidor.", + "data-limits-dialog-text": "Ve a la pestaña Ajustes para establecer un límite de transferencia de datos para las claves de acceso de este servidor.", + "data-limits-dialog-title": "Evitar excedentes de datos", + "data-limits-disclaimer": "Como estás enviando informes de métricas, se incluirá el uso de la función de límite de datos. Consulta la {openLink}política de recogida de datos{closeLink} para obtener más información.", + "data-limits-usage": "{used} de {total} usados", + "destroy": "Eliminar", + "digitalocean-disconnect-account": "Desconectar la cuenta de DigitalOcean", + "digitalocean-unreachable": "Puede que este error se deba a que hay un cortafuegos en tu red o a problemas de conectividad temporales con digitalocean.com.", + "disabled": "Inhabilitado", + "disconnect": "Desconectar", + "done": "Hecho", + "enabled": "Habilitado", + "error-connectivity": "Nos está costando conectar con tu cuenta de DigitalOcean. Esto ocurre a veces por un problema temporal de DigitalOcean o de tu conexión a Internet. Si después de intentarlo varias veces no consigues conectarte, inicia sesión de nuevo en DigitalOcean para solucionar el problema.", + "error-connectivity-title": "Problema de conexión", + "error-do-account-info": "No se ha podido obtener la información de la cuenta de DigitalOcean", + "error-do-auth": "No se ha podido completar la autenticación con DigitalOcean", + "error-do-limit": "Tu cuenta de DigitalOcean ha alcanzado el límite de {num} droplets. Puedes solicitar un aumento en https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "No se ha podido obtener la lista de regiones disponibles", + "error-do-warning": "Advertencia de DigitalOcean: \"{message}\"", + "error-feedback": "No se han podido enviar los comentarios. Inténtalo de nuevo.", + "error-gcp-auth": "No se ha podido autenticar con Google Cloud Platform", + "error-hostname-invalid": "Debe ser una dirección IP o un nombre de host válido.", + "error-key-add": "No se ha podido crear la clave", + "error-key-remove": "No se ha podido eliminar la clave", + "error-key-rename": "No se ha podido cambiar el nombre de la clave", + "error-keys-get": "No se han podido cargar las claves", + "error-keys-port-bad-input": "El puerto debe ser un número entero comprendido entre 1 y 65.535.", + "error-keys-port-in-use": "El puerto ya se está usando en el servidor.", + "error-licenses": "No se han podido cargar las licencias.", + "error-metrics": "No se han podido habilitar las métricas", + "error-network": "Se ha producido un error de red.", + "error-not-saved": "No guardado", + "error-remove-data-limit": "No se ha podido inhabilitar el límite de datos predeterminado", + "error-remove-per-key-limit": "No se ha podido quitar el límite de datos de esta clave de acceso", + "error-server-creation": "Se ha producido un error mientras se creaba tu servidor de Outline.", + "error-server-destroy": "No se ha podido eliminar el servidor", + "error-server-removed": "{serverName} ya no está en tu cuenta de DigitalOcean.", + "error-server-rename": "No se ha podido cambiar el nombre del servidor", + "error-server-unreachable": "Tu servidor de Outline se ha instalado correctamente, pero no hemos podido conectar con él. Esto se debe probablemente a que las reglas del cortafuegos de tu servidor están bloqueando las conexiones entrantes. Revísalas y asegúrate de permitir las conexiones TCP entrantes en los puertos del 1024 al 65.535.", + "error-server-unreachable-title": "No se puede conectar con tu servidor de Outline", + "error-servers-removed": "{serverNames} ya no está en tu cuenta de DigitalOcean.", + "error-set-data-limit": "No se ha podido establecer el límite de datos predeterminado", + "error-set-per-key-limit": "No se ha podido establecer el límite de datos para esta clave de acceso", + "error-unexpected": "Se ha producido un error inesperado.", + "experimental": "Experimental", + "experiments": "Experimentos", + "experiments-description": "Prueba las nuevas funciones y envíanos tus comentarios antes de que se lancen.", + "experiments-disclaimer": "Experimentos se encuentra en fase de desarrollo y es posible que cambie o se quite de la aplicación. Si estás creando informes de métricas en estos momentos, se incluirá el uso de funciones experimentales. Consulta la {openLink}política de recogida de datos{closeLink} para obtener más detalles.", + "experiments-feedback": "¿Tienes alguna sugerencia? {openLink}Envíanos tus comentarios{closeLink}", + "feedback-cloud-provider": "Selecciona un proveedor en la nube", + "feedback-cloud-provider-error": "Selecciona un proveedor de servicios en la nube.", + "feedback-connection": "No puedo conectar con mi servidor", + "feedback-connection-others": "Otros usuarios no pueden conectar con mi servidor", + "feedback-disclaimer": "Ten en cuenta que nuestro equipo solo puede responder a comentarios en inglés.", + "feedback-email": "Dirección de correo electrónico (opcional)", + "feedback-error": "Escribe tus comentarios.", + "feedback-explanation-install": "Se ha producido un error mientras se intentaba instalar Outline en tu servidor. Si no has conseguido solucionarlo, puedes enviarnos tus comentarios y tu dirección de correo electrónico (opcional) para ponernos en contacto contigo.", + "feedback-general": "Comentarios generales", + "feedback-install": "Tengo problemas para instalar Outline", + "feedback-label": "Tus comentarios", + "feedback-management": "Tengo problemas para gestionar mi servidor", + "feedback-other": "Otro", + "feedback-privacy": "Tus comentarios, tu dirección de correo electrónico (si la has proporcionado) y otra información especificada en la {openLink}política de privacidad{closeLink} se enviarán al equipo de Outline.", + "feedback-submit": "Enviar", + "feedback-suggestion": "Sugerencias", + "feedback-title-generic": "Enviar comentarios", + "feedback-title-install": "No se ha podido instalar el servidor de Outline", + "gcp-billing-action": "Siguiente", + "gcp-billing-body": "Esperando a que {openLink}añadas una cuenta de facturación en Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Abre la página de facturación de la consola de Cloud{closeLink} y añade una cuenta para continuar.", + "gcp-billing-error": "No se han podido obtener los datos de facturación", + "gcp-billing-error-zero": "Tienes que añadir una cuenta de facturación para continuar.", + "gcp-click-create": "Haz clic en Crear.", + "gcp-create-new-project": "{openLink}Crea un proyecto de Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Crea una instancia de máquina virtual{closeLink}.", + "gcp-create-project": "Crear un proyecto de Google Cloud", + "gcp-create-server": "Crear un proyecto de Google Cloud", + "gcp-create-vm": "Crear una instancia de máquina virtual", + "gcp-disconnect-account": "Desconectar cuenta de Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Añade una regla de cortafuegos nueva{closeLink} a tu proyecto de Compute Engine.", + "gcp-firewall-create-1": "Escribe \"outline\" en el campo Nombre.", + "gcp-firewall-create-2": "Escribe \"outline\" en el campo Etiquetas de destino.", + "gcp-firewall-create-3": "Escribe \"0.0.0.0/0\" en el campo Intervalos de IP de origen.", + "gcp-firewall-create-4": "En Protocols and ports (Protocolos y puertos), selecciona Allow all (Permitir todo).", + "gcp-name-your-project": "Pon un nombre al proyecto en el campo Nombre del proyecto (Project name).", + "gcp-project-setup-error": "No se ha podido configurar tu proyecto de Google Cloud", + "gcp-select-machine-type": "Selecciona \"f1-micro\" en Tipo de máquina (Machine type)", + "gcp-select-networking": "Haz clic en Administración, seguridad, discos, redes, único propietario (Management, security, disks, networking, sole tenancy) y, a continuación, en Redes (Networking)", + "gcp-select-region": "En Región (Region), selecciona una región próxima a la ubicación de los usuarios del servidor.", + "gcp-type-network-tag": "Escribe \"outline\" en el campo Etiquetas de red (Network tags)", + "gcp-type-outline-server": "Escribe \"outline-server\" en el campo Nombre (Name).", + "geo-amsterdam": "Ámsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Condado de Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Fráncfort", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Yakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londres", + "geo-los-angeles": "Los Ángeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Bombay", + "geo-new-york-city": "Nueva York", + "geo-northern-virginia": "Norte de Virginia", + "geo-oregon": "Oregón", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seúl", + "geo-sg": "Singapur", + "geo-south-carolina": "Carolina del Sur", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sídney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsovia", + "geo-zurich": "Zúrich", + "key": "Clave {keyId}", + "manual-server-assign-firewall": "Asigna una regla de cortafuegos", + "manual-server-assign-group": "Asigna un grupo de seguridad", + "manual-server-create-firewall": "Crea una regla de cortafuegos", + "manual-server-create-group": "Crea un grupo de seguridad", + "manual-server-description": "Estos pasos te ayudarán a instalar Outline en un servidor Linux de {cloudProvider}.", + "manual-server-firewall": "Configura tu firewall", + "manual-server-install-paste": "Pega aquí el resultado de la instalación.", + "manual-server-install-run": "Inicia sesión en tu servidor y ejecuta este comando.", + "manual-server-instructions": "Instrucciones", + "manual-server-show-me": "Muéstrame dónde", + "manual-server-title": "Sigue estas instrucciones", + "metrics-description": "Comparte métricas anónimas para mejorar la fiabilidad y el rendimiento de Outline, tanto para ti como para aquellos con los que compartas tu servidor. {openLink}Más información{closeLink}", + "metrics-share": "Compartir métricas", + "metrics-skip": "Saltar", + "metrics-title": "Compartir métricas", + "nav-about": "Información", + "nav-data-collection": "Recogida de datos", + "nav-feedback": "Comentarios", + "nav-help": "Ayuda", + "nav-licenses": "Licencias", + "nav-privacy": "Privacidad", + "nav-terms": "Términos", + "no-data-limit": "Ninguno", + "notification-app-update": "Se ha descargado una versión actualizada del Administrador de Outline. Se instalará cuando reinicies la aplicación.", + "notification-feedback-thanks": "¡Gracias por ayudarnos a mejorar! Nos encanta tener noticias tuyas.", + "notification-key-added": "Clave creada", + "notification-key-removed": "Clave eliminada", + "notification-server-destroyed": "Servidor eliminado", + "notification-server-exists": "Ya se ha añadido el servidor", + "notification-server-removed": "Servidor eliminado", + "oauth-account-active": "Se ha activado tu cuenta de DigitalOcean.", + "oauth-account-active-tag": "Cuenta activada. Cargando ubicaciones del servidor...", + "oauth-activate-account": "Activa tu cuenta de DigitalOcean.", + "oauth-billing": "Introduce tus datos de facturación en digitalocean.com y vuelve a la aplicación cuando hayas terminado.", + "oauth-billing-tag": "Introduce los datos de facturación...", + "oauth-connect-description": "Con tu cuenta, Outline te permite crear un servidor y conectarte a él fácilmente.", + "oauth-connect-tag": "Esperando para conectar tu cuenta...", + "oauth-connect-title": "Inicia sesión en una cuenta de DigitalOcean o crea una.", + "oauth-sign-out": "Cerrar sesión", + "oauth-verify": "Consulta tu bandeja de entrada para ver si tienes un correo de DigitalOcean y haz clic en el enlace que contiene para confirmar tu cuenta.", + "oauth-verify-tag": "Confirma tu correo electrónico...", + "okay": "Aceptar", + "per-key-data-limit-dialog-set-custom": "Establecer límite de datos personalizado", + "per-key-data-limit-dialog-title": "Límite de datos - {keyName}", + "region-best-value": "Mejor relación calidad-precio", + "region-description": "Esta es la ubicación desde donde se te proporcionará el servicio de Internet.", + "region-setup": "Instalar Outline", + "region-title": "Selecciona la ubicación del servidor.", + "remove": "Eliminar", + "retry": "Reintentar", + "save": "Guardar", + "saved": "Guardado", + "saving": "Guardando...", + "server-access": "Acceso al servidor", + "server-access-key-new": "Crear clave", + "server-access-key-rename": "Cambiar nombre", + "server-access-keys": "Claves de acceso", + "server-connections": "Conexiones", + "server-data-transfer": "Datos transferidos en los últimos 30 días", + "server-data-used": "Límite usado en los últimos 30 días", + "server-destroy": "Eliminar servidor", + "server-help-access-key-description": "Comparte las claves de acceso con amigos para que puedan conectarse a tu servidor de Outline. Pueden usar la misma clave de acceso en todos sus dispositivos.", + "server-help-access-key-next": "Siguiente", + "server-help-access-key-title": "Crear claves, compartir acceso", + "server-help-connection-description": "Haz clic aquí para instalar la aplicación cliente de Outline y utiliza tu clave personal para acceder al servidor de Outline.", + "server-help-connection-ok": "Entendido.", + "server-help-connection-title": "Aún no te has conectado.", + "server-keys": "Claves", + "server-my-access-key": "Mi clave de acceso", + "server-name": "Servidor de Outline {serverLocation}", + "server-remove": "Eliminar servidor", + "server-settings": "Ajustes", + "server-unreachable": "No se puede establecer conexión con el servidor", + "server-unreachable-description": "Estamos teniendo problemas para conectar con este servidor.", + "server-unreachable-managed-description": "Inténtalo de nuevo o elimina este servidor de la aplicación.", + "server-unreachable-manual-description": "Inténtalo de nuevo o elimina este servidor y el host virtual.", + "server-usage": "Uso (últimos 30 días)", + "servers-add": "Añadir servidor", + "servers-digitalocean": "Servidores de DigitalOcean", + "servers-gcp": "Servidores de Google Cloud Platform", + "servers-manual": "Servidores", + "settings-access-key-port": "Puerto de las claves de acceso nuevas", + "settings-metrics-header": "Compartir métricas anónimas", + "settings-server-api-url": "URL de la API de gestión", + "settings-server-cost": "Coste mensual", + "settings-server-creation": "Fecha de creación", + "settings-server-hostname": "Nombre de host", + "settings-server-id": "ID del servidor", + "settings-server-info": "Información del servidor", + "settings-server-location": "Ubicación del servidor", + "settings-server-name": "Nombre", + "settings-server-rename": "Pon un nombre nuevo a tu servidor. Este nombre no aparecerá en los dispositivos de los usuarios a los que hayas invitado a conectarse a él.", + "settings-server-version": "Versión del servidor", + "settings-transfer-limit": "Límite de transferencia de datos", + "setup-action": "Instalar", + "setup-advanced": "Avanzado", + "setup-anywhere": "Instala Outline en cualquier lugar", + "setup-cancel": "Cancela cuando quieras", + "setup-create": "Crear servidor", + "setup-description": "¿No tienes un servidor? Crea una cuenta en DigitalOcean.", + "setup-do-cost": "Solo 6 USD al mes", + "setup-do-create": "Crea un servidor con tu cuenta de DigitalOcean por 6 USD más cada 30 días para contar con transferencias de datos de 1 TB.", + "setup-do-data": "Límite de transferencia de datos de 1 TB", + "setup-do-description": "Este proceso puede tardar unos minutos. Puedes destruir este servidor en cualquier momento.", + "setup-do-easiest": "Proceso de instalación muy sencillo", + "setup-do-title": "Configurando Outline.", + "setup-firewall-instructions": "Instrucciones del cortafuegos", + "setup-gcp-create": "Crea un servidor con tu cuenta de Google. El coste varía en función de la ubicación y el uso.", + "setup-gcp-easy": "Proceso de instalación sencillo", + "setup-gcp-free-tier": "Con el {openLinkFreeTier}nivel gratuito{closeLink}, consigue tu primer servidor a partir de {openLinkIpPrice}3 USD al mes{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Prueba gratuita de 90 días{closeLink} para usuarios nuevos", + "setup-gcp-promo": "Prueba el nuevo proceso automático para crear servidores de Outline en Google Cloud", + "setup-recommended": "Recomendado", + "setup-simple-commands": "Sencillos comandos de instalación", + "setup-step-by-step": "Guía de instalación paso a paso", + "setup-tested": "Probado en VULTR, Linode y Liquid Web", + "setup-title": "Elige un servicio en la nube en el que instalar Outline.", + "share-description": "Copia esta invitación y envíala desde una herramienta de comunicación de confianza. {openLink}¿Necesitas ayuda?{closeLink}", + "share-invite-access-key-copied": "Clave de acceso copiada en el portapapeles", + "share-invite-copied": "Invitación copiada en el portapapeles", + "share-invite-copy": "Copiar invitación", + "share-invite-copy-access-key": "Copiar clave de acceso", + "share-invite-html": "Usa este servidor para acceder de forma segura al Internet abierto:

1) Descarga la aplicación Outline en tu dispositivo:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- macOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Enlace alternativo para Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Recibirás una clave de acceso que empieza por ss://. Cuando recibas la clave de acceso, cópiala.

3) Abre la aplicación del cliente de Outline. Si la clave de acceso se detecta automáticamente, toca \"Conectar\" y continúa. Si la clave de acceso no se detecta automáticamente, pégala en el campo correspondiente, toca \"Conectar\" y continúa.

¡Todo listo para usar el Internet abierto! Para asegurarte de que te has conectado correctamente al servidor, prueba a buscar \"what is my ip\" en la Búsqueda de Google. La dirección IP que se muestre en Google debe coincidir con la del cliente de Outline.

Consulta más información sobre Outline en este enlace: https://getoutline.org/.", + "share-invite-instructions": "Sigue nuestras instrucciones sobre la invitación en GitHub:", + "share-invite-trouble": "¿Tienes problemas para acceder al enlace de invitación?", + "share-title": "Compartir acceso", + "survey-data-limits-title": "Dinos cómo podemos mejorar los límites de datos", + "survey-decline": "Rechazar", + "survey-disclaimer": "Al hacer clic en Continuar, aceptas recibir una breve encuesta de Formularios de Google. Te recomendamos que la hagas cuando estés conectado a Outline.", + "survey-go-to-survey": "Ir a la encuesta", + "terms-of-service": "He leído y entiendo los {openLink}términos del servicio de Outline{closeLink}" +} diff --git a/server_manager/messages/et.json b/server_manager/messages/et.json new file mode 100644 index 0000000000..96ff35adb2 --- /dev/null +++ b/server_manager/messages/et.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline on avatud lähtekoodiga projekt, mille lõi Jigsaw eesmärgiga pakkuda uudisteorganisatsioonidele ja ajakirjanikele ohutumat viisi Internetile juurdepääsemiseks.

Outline töötab teenuse Shadowsocks jõul ja tegemist on veel varajases etapis oleva tootega. Võite panustada koodi teenuses GitHub ning jälgida meid teenustes Reddit ja Medium, et saaksite teada, kui laieneme uutele platvormidele ja lisame uusi funktsioone.", + "about-version": "Versioon {version}", + "aws-lightsail-firewall-0": "Minge {openLink}Amazon Lightsaili{closeLink} eksemplaride kuvale.", + "aws-lightsail-firewall-1": "Klõpsake eksemplaril, milles soovite Outline'i hostida.", + "aws-lightsail-firewall-2": "Minge vahekaardile „Võrgundus“ (Networking).", + "aws-lightsail-firewall-3": "Klõpsake jaotises „Tulemüür“ (Firewall) käsul „Lisa veel üks“ (Add another).", + "aws-lightsail-firewall-4": "Määrake valiku „Rakendus“ (Application) väärtuseks „Kõik TCP + UDP“ (All TCP+UDP).", + "aws-lightsail-firewall-5": "Klõpsake käsul „Salvesta“ (Save).", + "cancel": "Tühista", + "close": "Sule", + "confirmation-server-destroy": "Praegused kasutajad kaotavad juurdepääsu. Seda toimingut ei saa tagasi võtta.", + "confirmation-server-destroy-title": "Kas soovite serveri hävitada?", + "confirmation-server-remove": "See toiming eemaldab teie serveri Outline Managerist, ent see ei blokeeri kasutajate juurdepääsu puhverserveri kaudu. Teil tuleb Outline'i server siiski hostmasinast käsitsi kustutada.", + "confirmation-server-remove-title": "Kas soovite serveri eemaldada?", + "data-limit": "Andmeedastuse piirang", + "data-limit-per-key": "Andmeedastuse piirang võtme kohta", + "data-limits": "Andmeedastuse piirangud", + "data-limits-description": "Määrake selle serveri pääsuvõtmete jaoks 30-päevane jooksev andmeedastuse piirang.", + "data-limits-dialog-text": "Avage vahekaart Seaded, et määrata selle serveri pääsuvõtmetele andmeedastuse piirang.", + "data-limits-dialog-title": "Vältige liigset andmeedastust", + "data-limits-disclaimer": "Kuna esitate praegu mõõdikuid, kaasatakse andmeedastuse piirangute funktsiooni kasutamine. Vaadake lisateavet {openLink}andmete kogumise eeskirjadest{closeLink}.", + "data-limits-usage": "Kasutusel on {used} {total}-st", + "destroy": "Hävita", + "digitalocean-disconnect-account": "DigitalOceani konto ühenduse katkestamine", + "digitalocean-unreachable": "Vea põhjuseks võib olla teie võrgu tulemüür või ajutised ühendusprobleemid saidiga digitalocean.com.", + "disabled": "Keelatud", + "disconnect": "Katkesta ühendus", + "done": "Valmis", + "enabled": "Lubatud", + "error-connectivity": "Meil on teie DigitalOceani kontoga ühenduse loomisega probleeme. Mõnikord põhjustab seda DigitalOceani või teie Interneti-ühenduse ajutine probleem. Kui uuesti proovimine ei aita, peaks probleemi lahendama DigitalOceani kontole uuesti sisselogimine.", + "error-connectivity-title": "Ühenduse probleem", + "error-do-account-info": "DigitalOceani konto teabe hankimine nurjus", + "error-do-auth": "DigitalOceaniga autentimine nurjus", + "error-do-limit": "Teie DigitalOceani konto saavutas {num} Dropleti piirangu. Saate taotleda piirangu suurendamist aadressil https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Saadaolevate piirkondade loendi toomine nurjus", + "error-do-warning": "DigitalOceani hoiatus: „{message}“", + "error-feedback": "Tagasiside saatmine nurjus. Proovige uuesti.", + "error-gcp-auth": "Google Cloud Platformiga autentimine nurjus", + "error-hostname-invalid": "Peab olema IP-aadress või kehtiv hostinimi.", + "error-key-add": "Võtme lisamine nurjus", + "error-key-remove": "Võtme eemaldamine nurjus", + "error-key-rename": "Võtme ümbernimetamine nurjus", + "error-keys-get": "Võtmeid ei saanud laadida", + "error-keys-port-bad-input": "Port peab olema täisarv vahemikus 1 kuni 65 535.", + "error-keys-port-in-use": "Port on serveris juba kasutusel.", + "error-licenses": "Litsentse ei saanud laadida.", + "error-metrics": "Viga mõõdikute lubamisel", + "error-network": "Ilmnes võrgu viga.", + "error-not-saved": "Salvestamata", + "error-remove-data-limit": "Andmeedastuse vaikepiirangut ei saanud keelata", + "error-remove-per-key-limit": "Selle pääsuvõtme andmeedastuse piirangut ei saanud eemaldada", + "error-server-creation": "Teie Outline'i serveri loomisel ilmnes viga.", + "error-server-destroy": "Serveri hävitamine nurjus", + "error-server-removed": "{serverName} ei ole enam teie DigitalOceani kontol.", + "error-server-rename": "Serveri ümbernimetamine nurjus", + "error-server-unreachable": "Teie Outline'i serveri installimine õnnestus, ent me ei saa sellega ühendust luua. Kõige tõenäolisemalt on põhjus selles, et teie serveri tulemüüri reeglid blokeerivad sissetulevaid ühendusi. Vaadake reeglid üle ja lubage sissetulevad TCP-ühendused pordivahemikus 1024 kuni 65535.", + "error-server-unreachable-title": "Teie Outline'i serveriga ei saa ühendust luua", + "error-servers-removed": "{serverNames} ei ole enam teie DigitalOceani kontol.", + "error-set-data-limit": "Andmeedastuse vaikepiirangut ei saanud määrata", + "error-set-per-key-limit": "Selle pääsuvõtme jaoks ei saanud andmeedastuse piirangut määrata", + "error-unexpected": "Ilmnes ootamatu viga.", + "experimental": "Katseline", + "experiments": "Katsed", + "experiments-description": "Katsetage uusi funktsioone ja andke meile tagasisidet, enne kui need välja lastakse.", + "experiments-disclaimer": "Katsed on arendusjärgud ja need võivad muutuda või need võidakse rakendusest eemaldada. Kui toetate praegu mõõdikuid, kaasatakse katseliste funktsioonide kasutamine. Vaadake lisateavet {openLink}andmete kogumise eeskirjadest{closeLink}.", + "experiments-feedback": "Kas teil on soovitusi? {openLink}Esitage tagasisidet siin.{closeLink}", + "feedback-cloud-provider": "Valige pilveteenuse pakkuja", + "feedback-cloud-provider-error": "Valige pilveteenuse pakkuja.", + "feedback-connection": "Ma ei saa oma serveriga ühendust luua", + "feedback-connection-others": "Teised ei saa minu serveriga ühendust luua", + "feedback-disclaimer": "Pange tähele, et meie tiim saab vastata ainult ingliskeelsele tagasisidele.", + "feedback-email": "E-posti aadress (valikuline)", + "feedback-error": "Sisestage tagasiside.", + "feedback-explanation-install": "Teie serverisse Outline'i installimisel ilmnes viga. Kui teil ei ole õnnestunud lahendust leida, võite saata meile tagasisidet ja oma e-posti aadressi (valikuline), et saaksime teile vastata.", + "feedback-general": "Üldine tagasiside", + "feedback-install": "Probleemid Outline'i installimisel", + "feedback-label": "Teie tagasiside", + "feedback-management": "Probleemid serveri haldamisel", + "feedback-other": "Muu", + "feedback-privacy": "Teie tagasiside, e-posti aadress (kui esitasite selle) ja {openLink}privaatsuseeskirjades{closeLink} märgitud lisateave saadetakse Outline'i tiimile.", + "feedback-submit": "Saada", + "feedback-suggestion": "Soovitused", + "feedback-title-generic": "Tagasiside saatmine", + "feedback-title-install": "Outline'i serveri installimine nurjus", + "gcp-billing-action": "Järgmine", + "gcp-billing-body": "Ootame, et {openLink}lisaksite Google Cloudis arvelduskonto{closeLink}", + "gcp-billing-description": "Jätkamiseks {openLink}avage Cloud Console'i arveldusleht{closeLink} ja lisage konto.", + "gcp-billing-error": "Arveldusteabe toomine nurjus", + "gcp-billing-error-zero": "Enne jätkamist peate lisama arvelduskonto.", + "gcp-click-create": "Klõpsake käsul „Loo“ (Create).", + "gcp-create-new-project": "{openLink}Looge uus Google Cloudi projekt{closeLink}.", + "gcp-create-new-vm": "{openLink}Loo uus virtuaalmasina eksemplar{closeLink}.", + "gcp-create-project": "Google Cloudi projekti loomine", + "gcp-create-server": "Looge isiklik Google Cloudi projekt", + "gcp-create-vm": "Virtuaalmasina eksemplari loomine", + "gcp-disconnect-account": "Google Cloud Platformi konto ühenduse katkestamine", + "gcp-firewall-create-0": "{openLink}Lisage uus tulemüüri reegel{closeLink} oma Compute Engine'i projektile.", + "gcp-firewall-create-1": "Sisestage väljale „Nimi“ (Name) väärtus „outline“.", + "gcp-firewall-create-2": "Sisestage väljale „Sihitavad märgendid“ (Target tags) väärtus „outline“.", + "gcp-firewall-create-3": "Sisestage väljale „Allika IP-aadresside vahemik“ (Source IP ranges) väärtus „0.0.0.0/0“.", + "gcp-firewall-create-4": "Tehke jaotises „Protokollid ja pordid“ (Protocols and ports) valik „Luba kõik“ (Allow all).", + "gcp-name-your-project": "Määrake projektile nimi väljal „Projekti nimi“ (Project name).", + "gcp-project-setup-error": "Teie Google Cloudi projekti seadistamisel ilmnes viga", + "gcp-select-machine-type": "Tehke jaotises „Masina tüüp“ (Machine type) valik „f1-micro“.", + "gcp-select-networking": "Klõpsake valikul „Haldus, turve, kettad, võrgundus, ainus asurlus“ (Management, security, disks, networking, sole tenancy) ja seejärel valikul „Võrgundus“ (Networking)", + "gcp-select-region": "Valige jaotises „Piirkond“ (Region) piirkond, mis asub serveri tulevaste kasutajate läheduses.", + "gcp-type-network-tag": "Sisestage väljale „Võrgu märgendid“ (Network tags) väärtus „outline“.", + "gcp-type-outline-server": "Sisestage väljale „Nimi“ (Name) väärtus „outline-server“.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua maakond", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Põhja-Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Soul", + "geo-sg": "Singapur", + "geo-south-carolina": "Lõuna-Carolina", + "geo-st-ghislain": "St Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Varssavi", + "geo-zurich": "Zürich", + "key": "Võti {keyId}", + "manual-server-assign-firewall": "Tulemüüri reegli lisamine", + "manual-server-assign-group": "Turbegrupi määramine", + "manual-server-create-firewall": "Tulemüüri reegli loomine", + "manual-server-create-group": "Turbegrupi loomine", + "manual-server-description": "Need toimingud aitavad teil installida Outline'i teenuse {cloudProvider} Linuxi serverisse.", + "manual-server-firewall": "Tulemüüri seadistamine", + "manual-server-install-paste": "Kleepige installimise väljund siia.", + "manual-server-install-run": "Logige oma serverisse sisse ja käitage seda käsku.", + "manual-server-instructions": "Juhised", + "manual-server-show-me": "Kuva asukoht", + "manual-server-title": "Järgige allolevaid juhiseid", + "metrics-description": "Jagage anonüümseks muudetud mõõdikuid, et aidata Outline'i usaldusväärsust ja toimivust täiustada nii teie kui ka teiste jaoks, kellega oma serverit jagate. {openLink}Vaadake lisateavet.{closeLink}", + "metrics-share": "Jaga mõõdikuid", + "metrics-skip": "Jäta vahele", + "metrics-title": "Mõõdikute jagamine", + "nav-about": "Teave", + "nav-data-collection": "Andmete kogumine", + "nav-feedback": "Tagasiside", + "nav-help": "Abi", + "nav-licenses": "Litsentsid", + "nav-privacy": "Privaatsus", + "nav-terms": "Tingimused", + "no-data-limit": "Puudub", + "notification-app-update": "Outline Manageri värskendatud versioon on alla laaditud. See installitakse rakenduse taaskäivitamisel.", + "notification-feedback-thanks": "Täname, et aitate meil paremaks saada! Meil on hea meel teilt tagasisidet saada.", + "notification-key-added": "Võti on lisatud", + "notification-key-removed": "Võti eemaldati", + "notification-server-destroyed": "Server on hävitatud", + "notification-server-exists": "Server on juba lisatud", + "notification-server-removed": "Server on eemaldatud", + "oauth-account-active": "Teie DigitalOceani konto on aktiveeritud.", + "oauth-account-active-tag": "Konto on aktiveeritud. Serverite asukohtade laadimine …", + "oauth-activate-account": "Aktiveerige oma DigitalOceani konto.", + "oauth-billing": "Sisestage oma arveldusteave saidil digitalocean.com ja naaske pärast seda rakendusse.", + "oauth-billing-tag": "Sisestage arveldusteave …", + "oauth-connect-description": "Outline võimaldab teil oma kontoga hõlpsasti serveri seadistada ja ühenduse luua.", + "oauth-connect-tag": "Teie konto ühendamise ootel …", + "oauth-connect-title": "Logige sisse või looge DigitalOceani konto.", + "oauth-sign-out": "Logi välja", + "oauth-verify": "Leidke oma postkastist DigitalOceani meil ja klõpsake selles oleval lingil, et oma konto kinnitada.", + "oauth-verify-tag": "Kinnitage oma e-posti aadress", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Määra kohandatud andmeedastuse piirang", + "per-key-data-limit-dialog-title": "Andmeedastuse piirang – {keyName}", + "region-best-value": "Soodsaim", + "region-description": "Siit pärineb teie kasutuskogemus Internetis.", + "region-setup": "Outline'i seadistamine", + "region-title": "Valige oma serveri asukoht.", + "remove": "Eemalda", + "retry": "Proovi uuesti", + "save": "Salvesta", + "saved": "Salvestatud", + "saving": "Salvestamine …", + "server-access": "Serveri juurdepääs", + "server-access-key-new": "Lisa uus võti", + "server-access-key-rename": "Muuda nime", + "server-access-keys": "Pääsuvõtmed", + "server-connections": "Ühendused", + "server-data-transfer": "Edastatud andmed / viimased 30 päeva", + "server-data-used": "Kasutatud osa / viimased 30 päeva", + "server-destroy": "Hävita server", + "server-help-access-key-description": "Jagage pääsuvõtmeid sõpradega, et nad saaksid teie Outline'i serveriga ühenduse luua. Nad võivad kasutada sama pääsuvõtit oma kõikides seadmetes.", + "server-help-access-key-next": "Järgmine", + "server-help-access-key-title": "Looge võtmeid, jagage juurdepääsu", + "server-help-connection-description": "Klõpsake siin, et installida Outline'i klientrakendus, kasutades oma isiklikku Outline'i serveri pääsuvõtit.", + "server-help-connection-ok": "Hästi, sain aru.", + "server-help-connection-title": "Te ei ole veel ühendatud.", + "server-keys": "Võtmed", + "server-my-access-key": "Minu pääsuvõti", + "server-name": "Outline'i server {serverLocation}", + "server-remove": "Eemalda server", + "server-settings": "Seaded", + "server-unreachable": "Server on kättesaamatu", + "server-unreachable-description": "Meil on serveriga ühenduse loomisega probleeme.", + "server-unreachable-managed-description": "Proovige uuesti või eemaldage see server rakendusest.", + "server-unreachable-manual-description": "Proovige uuesti või hävitage see server ja virtuaalne host.", + "server-usage": "Kasutus (viimased 30 päeva)", + "servers-add": "Lisa server", + "servers-digitalocean": "DigitalOceani serverid", + "servers-gcp": "Google Cloud Platformi serverid", + "servers-manual": "Serverid", + "settings-access-key-port": "Uute pääsuvõtmete port", + "settings-metrics-header": "Anonüümsete mõõdikute jagamine", + "settings-server-api-url": "Halduse API URL", + "settings-server-cost": "Kuumakse", + "settings-server-creation": "Loodud", + "settings-server-hostname": "Hostinimi", + "settings-server-id": "Serveri ID", + "settings-server-info": "Serveri teave", + "settings-server-location": "Serveri asukoht", + "settings-server-name": "Nimi", + "settings-server-rename": "Määrake oma serverile uus nimi. Pange tähele, et seda ei kajastata nende kasutajate seadmetes, kelle kutsusite serveriga ühendust looma.", + "settings-server-version": "Serveri versioon", + "settings-transfer-limit": "Andmeedastuse piirang", + "setup-action": "Seadista", + "setup-advanced": "Täpsem", + "setup-anywhere": "Seadistage Outline kus tahes", + "setup-cancel": "Võite igal ajal tühistada", + "setup-create": "Loo server", + "setup-description": "Kas teil ei ole serverit? Looge DigitalOceani konto.", + "setup-do-cost": "Ainult 6 USA dollarit kuus", + "setup-do-create": "Looge oma DigitalOceani kontoga uus server hinnaga 6 USA dollarit 30 päeva eest 1 TB andmeedastuse kohta.", + "setup-do-data": "Andmeedastuse piirang 1 TB", + "setup-do-description": "See võib võtta mitu minutit. Võite selle serveri igal ajal hävitada.", + "setup-do-easiest": "Lihtsaim seadistamisprotsess", + "setup-do-title": "Outline'i seadistamine.", + "setup-firewall-instructions": "Tulemüüri juhised", + "setup-gcp-create": "Looge oma Google'i kontoga uus server. Hinnad olenevad asukohast ja kasutusest.", + "setup-gcp-easy": "Lihtne seadistamine", + "setup-gcp-free-tier": "{openLinkFreeTier}Tasuta taseme{closeLink} puhul algab teie esimese serveri hind {openLinkIpPrice}3 USA dollarist kuus{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90-päevane tasuta prooviversioon{closeLink} uute kasutajate jaoks", + "setup-gcp-promo": "Proovige uut automaatset Outline'i serveri loomise protsessi Google Cloudi jaoks", + "setup-recommended": "Soovitatud", + "setup-simple-commands": "Lihtsad installimiskäsud", + "setup-step-by-step": "Üksikasjalik seadistusjuhend", + "setup-tested": "Testitud teenustes VULTR, Linode ja Liquid Web", + "setup-title": "Valige Outline'i seadistamiseks pilveteenus.", + "share-description": "Kopeerige see kutse ja saatke see usaldusväärsest sidetööriistast. {openLink}Kas vajate abi?{closeLink}", + "share-invite-access-key-copied": "Pääsuvõti kopeeriti lõikelauale", + "share-invite-copied": "Kutse kopeeriti lõikelauale", + "share-invite-copy": "Kopeeri kutse", + "share-invite-copy-access-key": "Kopeeri pääsuvõti", + "share-invite-html": "Kasutage avatud internetile turvaliseks juurdepääsuks seda serverit.

1) Laadige alla ja installige teie seadme jaoks sobiv Outline’i rakendus.

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Androidi alternatiivne link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Teile saadetakse pääsuvõti algusega ss://. Pärast pääsuvõtme saamist kopeerige see.

3) Avage Outline’i klientrakendus. Kui teie pääsuvõti tuvastatakse automaatselt, puudutage valikut „Ühenda“ ja jätkake. Kui teie pääsuvõtit ei tuvastata automaatselt, kleepige see väljale, puudutage valikut „Ühenda“ ja jätkake.

Olete avatud interneti kasutamiseks valmis! Serveriga eduka ühenduse kontrollimiseks tehke Google'i otsingus otsing „mis on minu ip“. Google’is näidatud IP-aadress peab ühtima Outline’i klientrakenduses näidatud IP-aadressiga.

Vaadake lisateavet Outline’i kohta siin: https://getoutline.org/", + "share-invite-instructions": "Jälgige meie kutsetega seotud juhiseid GitHubis:", + "share-invite-trouble": "Kas teil on kutselingile juurdepääsemisega seoses probleeme?", + "share-title": "Juurdepääsu jagamine", + "survey-data-limits-title": "Aidake meil mõista, kuidas saaksime andmeedastuse piiranguid täiustada", + "survey-decline": "Keeldu", + "survey-disclaimer": "Kui klõpsate käsul Jätka, suunatakse teid lühikese küsitluse juurde teenuses Google'i vormid. Soovitame küsitlusele vastata ajal, mil olete Outline'iga ühendatud.", + "survey-go-to-survey": "Ava küsitlus", + "terms-of-service": "Olen lugenud {openLink}Outline'i teenusetingimusi{closeLink} ja nõustun nendega" +} diff --git a/server_manager/messages/fa.json b/server_manager/messages/fa.json new file mode 100644 index 0000000000..788dd2ade6 --- /dev/null +++ b/server_manager/messages/fa.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline یک پروژه منبع آزاد است که توسط Jigsaw ایجاد شده است تا سازمان‌های خبری و خبرنگاران بتوانند دسترسی ایمن‌تری به اینترنت داشته باشند.

Outline توسط Shadowsocks ارائه می‌شود و محصولی است که همچنان در ابتدای راه است. در GitHub می‌توانید درزمینه کد همکاری داشته باشید، ما را در Reddit و Medium دنبال کنید تا در صورت حضور گسترده‌تر در پلتفورم‌های بیشتر و افزودن ویژگی‌های جدید مطلع شوید.", + "about-version": "نسخه {version}", + "aws-lightsail-firewall-0": "به صفحه نمونه‌های {openLink}Amazon Lightsail{closeLink} پیمایش کنید.", + "aws-lightsail-firewall-1": "روی نمونه‌ای که می‌خواهید میزبان Outline باشد، کلیک کنید.", + "aws-lightsail-firewall-2": "به برگه «حوزه شبکه» (Networking) پیمایش کنید.", + "aws-lightsail-firewall-3": "در بخش «دیوار آتش» (Firewall) روی «افزودن دیگری» (Add another) کلیک کنید.", + "aws-lightsail-firewall-4": "مقدار «برنامه» (Application) را روی «همه TCP+UDP» (All TCP+UDP) تنظیم کنید.", + "aws-lightsail-firewall-5": "روی «ذخیره شود» (SAVE) کلیک کنید.", + "cancel": "لغو شود", + "close": "بستن", + "confirmation-server-destroy": "کاربران فعلی دسترسی‌شان را از دست خواهند داد. این اقدام واگردشدنی نیست.", + "confirmation-server-destroy-title": "سرور تخریب شود؟", + "confirmation-server-remove": "با این کار سرور شما از «مدیر Outline» برداشته می‌شود، اما دسترسی پراکسی برای کاربران مسدود نمی‌شود. همچنان باید سرور Outline خود را دستی از ماشین میزبان حذف کنید.", + "confirmation-server-remove-title": "سرور برداشته شود؟", + "data-limit": "محدودیت داده", + "data-limit-per-key": "محدودیت داده برای هر کلید", + "data-limits": "محدودیت‌های داده", + "data-limits-description": "برای کلیدهای دسترسی در این سرور محدودیت انتقال داده در پایان ۳۰ روز بگذارید.", + "data-limits-dialog-text": "برای تنظیم محدودیت انتقال داده برای کلیدهای دسترسی در این سرور به برگه «تنظیمات» بروید.", + "data-limits-dialog-title": "اجتناب از مازاد داده", + "data-limits-disclaimer": "چون درحال‌حاضر سنجه‌ها را گزارش می‌دهید، استفاده از ویژگی محدودیت‌های داده لحاظ می‌شود. لطفاً برای جزئیات بیشتر {openLink}خط‌مشی جمع‌آوری داده{closeLink} را ببینید.", + "data-limits-usage": "{used} از {total} استفاده شده", + "destroy": "تخریب شود", + "digitalocean-disconnect-account": "اتصال حساب DigitalOcean را قطع کنید", + "digitalocean-unreachable": "این خطا ممکن است ناشی از دیوار آتشی در شبکه شما یا مشکلات موقتی اتصال در digitalocean.com باشد.", + "disabled": "غیرفعال", + "disconnect": "قطع اتصال", + "done": "تمام شد", + "enabled": "فعال", + "error-connectivity": "برای اتصال به حساب DigitalOcean شما با مشکل روبرو هستیم. گاهی‌اوقات این مشکلی موقتی در DigitalOcean یا اتصال اینترنت شما است. اگر امتحان مجدد مؤثر نبود، ورود دوباره به سیستم DigitalOcean باید مشکل را برطرف کند.", + "error-connectivity-title": "مشکل اتصال", + "error-do-account-info": "اطلاعات حساب DigitalOcean دریافت نشد", + "error-do-auth": "اصالت‌سنجی با DigitalOcean ناموفق بود", + "error-do-limit": "حسابتان در DigitalOcean به محدودیت {num} دراپلت (Droplet) رسیده است. می‌توانید در https://cloud.digitalocean.com/account/team/droplet_limit_increase درخواست افزایش دهید", + "error-do-regions": "فهرست مناطق دردسترس دریافت نشد", + "error-do-warning": "هشدار DigitalOcean: «{message}»", + "error-feedback": "بازخورد ارسال نشد. لطفاً دوباره امتحان کنید.", + "error-gcp-auth": "اصالت‌سنجی با Google Cloud Platform انجام نشد", + "error-hostname-invalid": "باید نشانی IP یا نام میزبان معتبری باشد.", + "error-key-add": "کلید اضافه نشد", + "error-key-remove": "کلید برداشته نشد", + "error-key-rename": "تغییر نام کلید ناموفق بود", + "error-keys-get": "کلیدها بارگیری نشدند", + "error-keys-port-bad-input": "شماره درگاه باید عدد صحیحی بین ۱ و ۶۵۵۳۵ باشد.", + "error-keys-port-in-use": "این درگاه قبلاً در سرور استفاده شده است.", + "error-licenses": "مجوزها بارگیری نشدند.", + "error-metrics": "خطا هنگام فعال کردن سنجه‌ها", + "error-network": "خطای شبکه رخ داد.", + "error-not-saved": "ذخیره نشد", + "error-remove-data-limit": "محدودیت داده پیش‌فرض غیرفعال نشد", + "error-remove-per-key-limit": "نمی‌توان محدودیت داده را از این کلید دسترسی حذف کرد", + "error-server-creation": "هنگام ایجاد سرور Outline شما مشکلی پیش آمد.", + "error-server-destroy": "سرور تخریب نشد", + "error-server-removed": "{serverName} دیگر در حساب DigitalOcean شما وجود ندارد.", + "error-server-rename": "تغییر نام سرور ناموفق بود", + "error-server-unreachable": "سرور Outline شما باموفقیت نصب شد، اما نمی‌توانیم به آن متصل شویم. به‌احتمال زیاد قوانین دیوار آتش سرورتان اتصالات ورودی را مسدود می‌کند. لطفاً آن‌ها را مرور کنید و حتماً اتصالات ورودی TCP در درگاه‌های ۱۰۲۴ تا ۶۵۵۳۵ را مجاز کنید.", + "error-server-unreachable-title": "نمی‌توان به سرور Outline شما متصل شد", + "error-servers-removed": "{serverNames} دیگر در حساب DigitalOcean شما وجود ندارد.", + "error-set-data-limit": "محدودیت داده پیش‌فرض تنظیم نشد", + "error-set-per-key-limit": "نمی‌توان برای این کلید دسترسی محدودیت داده تنظیم کرد", + "error-unexpected": "خطای غیرمنتظره‌ای رخ داد.", + "experimental": "آزمایشی", + "experiments": "آزمایش‌ها", + "experiments-description": "ویژگی‌های جدید را امتحان کنید و قبل از اینکه منتشر شوند، برای ما بازخورد ارسال کنید.", + "experiments-disclaimer": "آزمایش‌ها درحال برنامه‌نویسی است و ممکن است تغییر کند یا از برنامه حذف شود. اگر درحال‌حاضر سنجه‌ها را گزارش می‌دهید، استفاده از ویژگی‌های آزمایشی لحاظ می‌شود. لطفاً برای جزئیات بیشتر {openLink}خط‌مشی جمع‌آوری داده{closeLink} را ببینید.", + "experiments-feedback": "پیشنهادی دارید؟ {openLink}در اینجا بازخورد را ارسال کنید.{closeLink}", + "feedback-cloud-provider": "انتخاب ارائه‌دهنده ابری", + "feedback-cloud-provider-error": "لطفاً یک ارائه‌دهنده ابری انتخاب کنید.", + "feedback-connection": "به سرور من متصل نشد", + "feedback-connection-others": "دیگران نمی‌توانند به سرور من متصل شوند", + "feedback-disclaimer": "لطفاً توجه داشته باشید تیم ما فقط به انگلیسی می‌تواند به بازخورد پاسخ دهد.", + "feedback-email": "نشانی ایمیل (اختیاری)", + "feedback-error": "لطفاً بازخوردتان را وارد کنید.", + "feedback-explanation-install": "هنگام تلاش برای نصب Outline در سرور شما، خطایی روی داد. اگر نتوانسته‌اید راه‌حلی پیدا کنید، لطفاً برای ما بازخورد ارسال کنید و نشانی ایمیلتان را ارائه کنید تا بتوانیم به شما پاسخ دهیم (اختیاری).", + "feedback-general": "بازخورد کلی", + "feedback-install": "برای نصب Outline با مشکل روبرو هستم", + "feedback-label": "بازخورد شما", + "feedback-management": "برای مدیریت سرور خود با مشکل روبرو هستم", + "feedback-other": "موارد دیگر", + "feedback-privacy": "بازخورد، نشانی ایمیل (اگر ارائه شود) و اطلاعات تکمیلی که در {openLink}خط‌مشی رازداری{closeLink} به آن‌ها اشاره شده است، به تیم Outline ارسال می‌شود.", + "feedback-submit": "ارسال", + "feedback-suggestion": "پیشنهادات", + "feedback-title-generic": "ارسال بازخورد", + "feedback-title-install": "نصب سرور Outline ناموفق بود", + "gcp-billing-action": "بعدی", + "gcp-billing-body": "منتظر شما برای {openLink}افزودن حساب صورت‌حساب به Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}صفحه صدور صورت‌حساب Cloud Console را باز کنید{closeLink} و حسابی را برای پیش رفتن اضافه کنید.", + "gcp-billing-error": "اطلاعات صدور صورت‌حساب بازیابی نمی‌شود", + "gcp-billing-error-zero": "باید قبل‌از پیش رفتن حساب صورت‌حسابی را اضافه کنید.", + "gcp-click-create": "روی «ایجاد»‌ (Create) کلیک کنید.", + "gcp-create-new-project": "{openLink}ایجاد «پروژه ابری» جدید Google{closeLink}.", + "gcp-create-new-vm": "{openLink}ایجاد نمونه ماشین مجازی جدید{closeLink}.", + "gcp-create-project": "ایجاد «پروژه ابری» Google", + "gcp-create-server": "ایجاد «پروژه ابری» Google", + "gcp-create-vm": "ایجاد نمونه ماشین مجازی", + "gcp-disconnect-account": "قطع اتصال حساب Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}قانون دیوار آتش جدیدی{closeLink} به پروژه Compute Engine خود اضافه کنید.", + "gcp-firewall-create-1": "در فیلد «نام» (Name)،‏ «outline» را تایپ کنید.", + "gcp-firewall-create-2": "در فیلد «برچسب‌های هدف» (Target tags)‏، «outline» را تایپ کنید.", + "gcp-firewall-create-3": "در فیلد «محدوده IP منبع» (Source IP ranges)،‏ «0.0.0.0/0» را تایپ کنید.", + "gcp-firewall-create-4": "در بخش «پروتکل‌ها و درگاه‌ها» (Protocols and ports)، «همه مجاز باشند» (Allow all) را انتخاب کنید.", + "gcp-name-your-project": "پروژه‌تان را در فیلد «نام پروژه» (Project name) نام‌گذاری کنید.", + "gcp-project-setup-error": "درحین تنظیم «پروژه ابری» Google خطایی رخ داد", + "gcp-select-machine-type": "در بخش «نوع ماشین» (Machine type)‏، «f1-micro» را انتخاب کنید.", + "gcp-select-networking": "روی «مدیریت، امنیت دیسک‌ها، حوزه شبکه، مالکیت انحصاری» (Management, security, disks, networking, sole tenancy) و سپس «حوزه شبکه» (Networking) کلیک کنید", + "gcp-select-region": "منطقه‌ای را نزدیک به جایی که کاربران سرور در آن «منطقه» (Region) هستند انتخاب کنید.", + "gcp-type-network-tag": "در فیلد «برچسب‌های شبکه» (Network tags)‏، «outline» را تایپ کنید", + "gcp-type-outline-server": "در فیلد «نام» (Name)، «سرور Outline» را تایپ کنید.", + "geo-amsterdam": "آمستردام", + "geo-bangalore": "بنگلور", + "geo-changhua-county": "شهرستان جانگوآ", + "geo-delhi": "دهلی", + "geo-eemshaven": "ایمسهون", + "geo-frankfurt": "فرانکفورت", + "geo-hamina": "هامینا", + "geo-hk": "هنگ کنگ", + "geo-iowa": "آیووا", + "geo-jakarta": "جاکارتا", + "geo-jurong-west": "جورونگ غربی", + "geo-las-vegas": "لاس وگاس", + "geo-london": "لندن", + "geo-los-angeles": "لس‌آنجلس", + "geo-melbourne": "ملبورن", + "geo-montreal": "مونترآل", + "geo-mumbai": "بمبئی", + "geo-new-york-city": "نیویورک", + "geo-northern-virginia": "ویرجینیای شمالی", + "geo-oregon": "اورگان", + "geo-osaka": "اوساکا", + "geo-salt-lake-city": "سالت‌لیک‌سیتی", + "geo-san-francisco": "سان فرانسیسکو", + "geo-sao-paulo": "سائوپائولو", + "geo-seoul": "سئول", + "geo-sg": "سنگاپور", + "geo-south-carolina": "کارولینای جنوبی", + "geo-st-ghislain": "سن-گیزلن", + "geo-sydney": "سیدنی", + "geo-tokyo": "توکیو", + "geo-toronto": "تورنتو", + "geo-warsaw": "ورشو", + "geo-zurich": "زوریخ", + "key": "کلید {keyId}", + "manual-server-assign-firewall": "تعیین قانون دیوار آتش", + "manual-server-assign-group": "تعیین گروه امنیتی", + "manual-server-create-firewall": "ایجاد قانون دیوار آتش", + "manual-server-create-group": "ایجاد گروه امنیتی", + "manual-server-description": "این مراحل در نصب Outline در سرور Linux {cloudProvider} به شما کمک می‌کند.", + "manual-server-firewall": "پیکربندی دیوار آتش", + "manual-server-install-paste": "خروجی نصب را اینجا جای‌گذاری کنید.", + "manual-server-install-run": "به سیستم سرورتان وارد شوید و این فرمان را اجرا کنید.", + "manual-server-instructions": "دستورالعمل‌ها", + "manual-server-show-me": "به من نشان داده شود", + "manual-server-title": "دستورالعمل‌های زیر را دنبال کنید", + "metrics-description": "با هم‌رسانی سنجه‌های ناشناس‌سازی‌شده به بهبود قابلیت‌اطمینان و عملکرد Outline برای خود و کسانی که سرورتان را با آن‌ها هم‌رسانی می‌کنید کمک کنید. {openLink}بیشتر بدانید.{closeLink}", + "metrics-share": "سنجه‌ها هم‌رسانی شود", + "metrics-skip": "رد شود", + "metrics-title": "هم‌رسانی سنجه‌ها", + "nav-about": "درباره", + "nav-data-collection": "جمع‌آوری داده", + "nav-feedback": "بازخورد", + "nav-help": "راهنمایی", + "nav-licenses": "مجوزها", + "nav-privacy": "حریم خصوصی", + "nav-terms": "شرایط", + "no-data-limit": "بدون محدودیت", + "notification-app-update": "نسخه به‌روزی از «مدیر Outline» بارگیری شد. بعد از اینکه برنامه را بازراه‌اندازی کنید، نصب می‌شود.", + "notification-feedback-thanks": "متشکریم که به پیشرفت ما کمک کردید! خوشحال می‌شویم با ما در ارتباط باشید.", + "notification-key-added": "کلید اضافه شد", + "notification-key-removed": "کلید برداشته شد", + "notification-server-destroyed": "سرور تخریب شد", + "notification-server-exists": "سرور قبلاً اضافه شده است", + "notification-server-removed": "سرور برداشته شد", + "oauth-account-active": "حساب DigitalOcean شما فعال شده است.", + "oauth-account-active-tag": "حساب فعال شد! درحال بارگیری مکان سرورها…", + "oauth-activate-account": "حساب DigitalOcean خود را فعال کنید.", + "oauth-billing": "اطلاعات صدور صورت‌حساب را در digitalocean.com وارد کنید، سپس به برنامه برگردید.", + "oauth-billing-tag": "درحال وارد کردن اطلاعات صدور صورت‌حساب…", + "oauth-connect-description": "با داشتن حساب، Outline ساخت سرور و متصل شدن به آن را آسان می‌کند.", + "oauth-connect-tag": "درانتظار اتصال حساب شما…", + "oauth-connect-title": "به سیستم وارد شوید یا حسابی نزد DigitalOcean ایجاد کنید.", + "oauth-sign-out": "خروج از سیستم", + "oauth-verify": "برای تأیید حسابتان، ایمیل دریافتی از DigitalOcean را در صندوق ورودی‌تان باز کنید و روی پیوند موجود در آن کلیک کنید.", + "oauth-verify-tag": "ایمیلتان را تأیید کنید…", + "okay": "بسیار خب", + "per-key-data-limit-dialog-set-custom": "تنظیم محدودیت داده سفارشی", + "per-key-data-limit-dialog-title": "محدودیت داده - {keyName}", + "region-best-value": "مقرون‌به‌صرفه", + "region-description": "این جایی است که تجربه اینترنت شما از آن نشأت می‌گیرد.", + "region-setup": "Outline راه‌اندازی شود", + "region-title": "مکان سرورتان را انتخاب کنید.", + "remove": "برداشته شود", + "retry": "دوباره امتحان شود", + "save": "ذخیره", + "saved": "ذخیره شد", + "saving": "درحال ذخیره کردن...", + "server-access": "دسترسی به سرور", + "server-access-key-new": "کلید جدید اضافه شود", + "server-access-key-rename": "تغییر نام", + "server-access-keys": "کلیدهای دسترسی", + "server-connections": "اتصالات", + "server-data-transfer": "میزان داده منتقل‌شده / ۳۰ روز گذشته", + "server-data-used": "میزان سهمیه استفاده‌شده / ۳۰ روز گذشته", + "server-destroy": "سرور تخریب شود", + "server-help-access-key-description": "کلیدهای دسترسی را با دوستان به‌اشتراک بگذارید تا بتوانند به سرور Outline شما متصل شوند. آن‌ها می‌توانند از یک کلید دسترسی در همه دستگاه‌هایشان استفاده کنند.", + "server-help-access-key-next": "بعدی", + "server-help-access-key-title": "ایجاد کردن کلید، به‌اشتراک گذاشتن دسترسی", + "server-help-connection-description": "اینجا را کلیک کنید تا بااستفاده از کلید دسترسی شخصی به سرور Outline خود، برنامه کارخواه Outline را نصب کنید.", + "server-help-connection-ok": "بسیار خب، متوجه شدم!", + "server-help-connection-title": "هنوز متصل نشده‌اید!", + "server-keys": "کلیدها", + "server-my-access-key": "کلید دسترسی من", + "server-name": "سرور Outline در {serverLocation}", + "server-remove": "سرور برداشته شود", + "server-settings": "تنظیمات", + "server-unreachable": "سرور غیرقابل‌دسترسی است", + "server-unreachable-description": "برای اتصال به این سرور با مشکل روبرو هستیم.", + "server-unreachable-managed-description": "دوباره امتحان کنید یا این سرور را از برنامه بردارید.", + "server-unreachable-manual-description": "دوباره امتحان کنید یا این سرور و میزبان مجازی را تخریب کنید.", + "server-usage": "میزان استفاده (۳۰ روز گذشته)", + "servers-add": "افزودن سرور", + "servers-digitalocean": "سرورهای DigitalOcean", + "servers-gcp": "سرورهای Google Cloud Platform", + "servers-manual": "سرورها", + "settings-access-key-port": "درگاه کلیدهای دسترسی جدید", + "settings-metrics-header": "هم‌رسانی سنجه‌های ناشناس", + "settings-server-api-url": "نشانی وب Management API", + "settings-server-cost": "هزینه ماهانه", + "settings-server-creation": "تاریخ ایجاد", + "settings-server-hostname": "نام میزبان", + "settings-server-id": "شناسه سرور", + "settings-server-info": "اطلاعات سرور", + "settings-server-location": "مکان سرور", + "settings-server-name": "نام", + "settings-server-rename": "نام جدیدی برای سرور خود تنظیم کنید. توجه داشته باشید این تغییر نام در دستگاه کاربرانی که از آن‌ها دعوت کرده‌اید به سرور متصل شوند، منعکس نمی‌شود.", + "settings-server-version": "نسخه سرور", + "settings-transfer-limit": "سهمیه انتقال داده", + "setup-action": "راه‌اندازی شود", + "setup-advanced": "پیشرفته", + "setup-anywhere": "هرجا خواستید Outline را نصب کنید", + "setup-cancel": "هرزمان خواستید لغو کنید", + "setup-create": "سرور ایجاد شود", + "setup-description": "سرور ندارید؟ حسابی با DigitalOcean ایجاد کنید.", + "setup-do-cost": "فقط ۶ دلار آمریکا در ماه", + "setup-do-create": "با اضافه کردن ۶ دلار آمریکا به هزینه ماهانه‌تان، سرور جدیدی با سهمیه ۱ ترابایت انتقال داده با حساب DigitalOcean خود ایجاد کنید.", + "setup-do-data": "سهمیه ۱ ‏TB انتقال داده", + "setup-do-description": "ممکن است چند دقیقه طول بکشد. هرزمان خواستید می‌توانید این سرور را ازبین ببرید.", + "setup-do-easiest": "آسان‌ترین روند نصب", + "setup-do-title": "درحال راه‌اندازی Outline.", + "setup-firewall-instructions": "دستورالعمل‌های دیوار آتش", + "setup-gcp-create": "با حسابتان در Google سرور جدیدی را ایجاد کنید. هزینه‌ها بسته به مکان و استفاده متفاوت است.", + "setup-gcp-easy": "روند نصب آسان", + "setup-gcp-free-tier": "با {openLinkFreeTier}Free Tier{closeLink}، اولین سرورتان از {openLinkIpPrice}۳ دلار در ماه{closeLink} شروع می‌شود", + "setup-gcp-free-trial": "{openLinkFreeTrial}۹۰ روز دوره آزمایشی رایگان{closeLink} برای کاربران جدید", + "setup-gcp-promo": "فرایند خودکار جدید ایجاد سرور Outlook را برای Google Cloud امتحان کنید", + "setup-recommended": "توصیه می‌شود", + "setup-simple-commands": "فرمان‌های نصب ساده", + "setup-step-by-step": "راهنمای مرحله‌به‌مرحله راه‌اندازی", + "setup-tested": "آزمایش‌شده در VULTR، ‏Linode، و Liquid Web", + "setup-title": "برای راه‌اندازی Outline، یک سرویس ابری انتخاب کنید.", + "share-description": "این دعوت را کپی کنید و آن را از یکی از ابزارهای ارتباطی مورد اعتمادتان ارسال کنید. {openLink}به راهنمایی نیاز دارید؟{closeLink}", + "share-invite-access-key-copied": "کلید دسترسی در بریده‌دان کپی شد", + "share-invite-copied": "دعوتنامه در بریده‌دان کپی شد", + "share-invite-copy": "دعوت کپی شود", + "share-invite-copy-access-key": "کپی کردن کلید دسترسی", + "share-invite-html": "از این سرور برای دسترسی ایمن به اینترنت باز استفاده کنید:

۱) بارگیری و نصب برنامه Outline برای دستگاه:

- iOS: ‏https://itunes.apple.com/app/outline-app/id1356177741
- ‏MacOS:‏ https://itunes.apple.com/app/outline-app/id1356178125
- ‏Windows:‏https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- ‏Linux:‏https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- ‏Android:‏https://play.google.com/store/apps/details?id=org.outline.android.client‏
پیوند جایگزین برای Android:‏https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

‏۲) کلید دسترسی‌ای را دریافت می‌کنید که با ss شروع می‌شود://. پس‌از دریافت آن، این کلید دسترسی را کپی کنید.

۳) برنامه Outline Client را باز کنید. اگر کلید دسترسی‌تان به‌صورت خودکار شناسایی شد، روی «اتصال» ضربه بزنید و ادامه دهید. اگر کلید دسترسی‌تان به‌طور خودکار شناسایی نشد، آن را در فیلد قرار دهید، سپس روی «اتصال» ضربه بزنید و ادامه دهید.

آماده استفاده از اینترنت باز هستید! برای اطمینان از اینکه با موفقیت به سرور متصل شده‌اید، عبارت «What is my ip» (IP من چیست) را در «جستجوی Google» جستجو کنید. نشانی IP نشان‌داده‌شده در Google باید با نشانی IP در Outline Client مطابقت داشته باشد.

درباره Outline بیشتر بدانید: https://getoutline.org/", + "share-invite-instructions": "دستورالعمل‌های دعوت ما را در GitHub دنبال کنید:", + "share-invite-trouble": "برای دسترسی به پیوند دعوت با مشکل روبرو هستید؟", + "share-title": "به‌اشتراک گذاشتن دسترسی", + "survey-data-limits-title": "برای اطلاع از نحوه بهبود دادن محدودیت‌های داده به ما کمک کنید", + "survey-decline": "رد کردن", + "survey-disclaimer": "با کلیک کردن روی «ادامه دادن»، به نظرسنجی کوتاهی در «فرم‌نگار Google» فرستاده می‌شوید. توصیه می‌کنیم هنگام اتصال به Outline در نظرسنجی شرکت کنید.", + "survey-go-to-survey": "رفتن به نظرسنجی", + "terms-of-service": "{openLink}شرایط خدمات Outline{closeLink} را خوانده و درک کرده‌ام" +} diff --git a/server_manager/messages/fi.json b/server_manager/messages/fi.json new file mode 100644 index 0000000000..5d4e47e931 --- /dev/null +++ b/server_manager/messages/fi.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline on avoimen lähdekoodin projekti, jonka Jigsaw on luonut tarjotakseen uutisorganisaatioille ja toimittajille entistä turvallisemman pääsyn internetiin.

Outlinen tarjoaa Shadowsocks, ja se on vielä alkuvaiheessa. Voit osallistua koodin parantamiseen GitHub-sivustolla. Seuraa meitä Reddit- ja Medium-sivustoilla, niin saat tietää, kun laajennamme muihin käyttöympäristöihin ja lisäämme uusia ominaisuuksia.", + "about-version": "Versio {version}", + "aws-lightsail-firewall-0": "Siirry {openLink}Amazon Lightsail{closeLink} ‑esiintymien näyttöön", + "aws-lightsail-firewall-1": "Klikkaa esiintymää, jossa haluat hostata Outlinea.", + "aws-lightsail-firewall-2": "Siirry Verkot (Networking) ‑välilehdelle.", + "aws-lightsail-firewall-3": "Klikkaa Palomuuri (Firewall) ‑osiosta Lisää toinen (Add another).", + "aws-lightsail-firewall-4": "Määritä Kohdistus (Application) ‑arvoksi Kaikki TCP + UDP (All TCP+UDP).", + "aws-lightsail-firewall-5": "Klikkaa Tallenna (Save).", + "cancel": "Peru", + "close": "Sulje", + "confirmation-server-destroy": "Nykyiset käyttäjät menettävät pääsyn. Tätä toimintoa ei voi kumota.", + "confirmation-server-destroy-title": "Tuhotaanko palvelin?", + "confirmation-server-remove": "Tämä toiminto poistaa palvelimen Outline Managerista, mutta se ei estä käyttäjien pääsyä välityspalvelimen kautta. Outline-palvelin täytyy lisäksi poistaa manuaalisesti isäntäkoneelta.", + "confirmation-server-remove-title": "Poistetaanko palvelin?", + "data-limit": "Dataraja", + "data-limit-per-key": "Avainkohtainen dataraja", + "data-limits": "Datarajat", + "data-limits-description": "Määritä 30 päivän datansiirtoraja pääsyavaimille tällä palvelimella.", + "data-limits-dialog-text": "Siirry Asetukset-välilehdelle ja määritä datansiirtoraja pääsyavaimille tällä palvelimella.", + "data-limits-dialog-title": "Vältä datamäärien ylitykset", + "data-limits-disclaimer": "Datan rajoitusominaisuus on käytössä, koska käytät tällä hetkellä raportointitietoja. Lue lisää {openLink}datankeruukäytännöstä{closeLink}.", + "data-limits-usage": "{used} / {total} käytetty", + "destroy": "Tuhoa", + "digitalocean-disconnect-account": "Katkaise yhteys DigitalOcean-tiliin", + "digitalocean-unreachable": "Tämä virhe voi johtua verkkosi palomuurista tai väliaikaisesta ongelmasta digitalocean.comiin yhdistettäessä.", + "disabled": "Pois käytöstä", + "disconnect": "Katkaise yhteys", + "done": "Valmis", + "enabled": "Käytössä", + "error-connectivity": "Yhteyden muodostamisessa DigitalOcean-tilillesi on ongelmia. Tämä voi johtua DigitalOceanin tai internetyhteytesi väliaikaisesta ongelmasta. Yritä uudelleen. Jos se ei auta, ongelman pitäisi ratketa, kun kirjaudut uudelleen sisään DigitalOcean-tilillesi.", + "error-connectivity-title": "Yhteysongelma", + "error-do-account-info": "DigitalOcean-tilitietojen hakeminen epäonnistui", + "error-do-auth": "Todennus DigitalOceanissa epäonnistui", + "error-do-limit": "DigitalOcean-tilisi on saavuttanut {num} lisäkoneen rajan. Voit pyytää rajan nostamista osoitteessa https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Saatavilla olevien alueiden luettelon hakeminen epäonnistui", + "error-do-warning": "DigitalOcean-varoitus: \"{message}\"", + "error-feedback": "Palautteen lähettäminen epäonnistui. Yritä uudelleen.", + "error-gcp-auth": "Todennus Google Cloud Platformin avulla epäonnistui", + "error-hostname-invalid": "Oltava IP-osoite tai kelvollinen isäntänimi.", + "error-key-add": "Avaimen lisääminen epäonnistui", + "error-key-remove": "Avaimen poistaminen epäonnistui", + "error-key-rename": "Avaimen nimeäminen uudelleen epäonnistui", + "error-keys-get": "Avainten lataaminen epäonnistui", + "error-keys-port-bad-input": "Portin on oltava kokonaisluku väliltä 1–65 535.", + "error-keys-port-in-use": "Portti on jo käytössä palvelimella.", + "error-licenses": "Lisenssien lataaminen epäonnistui.", + "error-metrics": "Virhe otettaessa mittaritietojen jakamista käyttöön", + "error-network": "Tapahtui verkkovirhe.", + "error-not-saved": "Ei tallennettu", + "error-remove-data-limit": "Oletusdatarajaa ei voitu poistaa käytöstä", + "error-remove-per-key-limit": "Pääsyavaimen datarajaa ei voitu poistaa", + "error-server-creation": "Outline-palvelimen luomisessa tapahtui virhe.", + "error-server-destroy": "Palvelimen tuhoaminen epäonnistui", + "error-server-removed": "DigitalOcean-tililläsi ei ole enää seuraavaa palvelinta: {serverName}.", + "error-server-rename": "Palvelimen nimeäminen uudelleen epäonnistui", + "error-server-unreachable": "Outline-palvelin on asennettu oikein, mutta siihen ei saada yhteyttä. Tämä johtuu todennäköisesti siitä, että palvelimesi palomuurisäännöt estävät saapuvat yhteydet. Tarkista säännöt ja varmista, että saapuvat TCP-yhteydet sallitaan porteissa 1024–65535.", + "error-server-unreachable-title": "Yhteyden muodostaminen Outline-palvelimeen ei onnistu", + "error-servers-removed": "DigitalOcean-tililläsi ei ole enää seuraavia palvelimia: {serverNames}.", + "error-set-data-limit": "Oletusdatarajaa ei voitu asettaa", + "error-set-per-key-limit": "Pääsyavaimen datarajaa ei voitu asettaa", + "error-unexpected": "Tapahtui odottamaton virhe.", + "experimental": "Kokeellinen", + "experiments": "Kokeilut", + "experiments-description": "Testaa uudet ominaisuudet ja anna palautetta ennen niiden julkaisemista.", + "experiments-disclaimer": "Kokeiluja kehitetään, ja niitä voidaan muuttaa tai poistaa sovelluksesta. Jos käytät tällä hetkellä raportointitietoja, kokeellisten ominaisuuksien käyttö sisältyy niihin. Lue lisää {openLink}datankeruukäytännöstä{closeLink}.", + "experiments-feedback": "Onko sinulla ehdotuksia? {openLink}Lähetä palautetta täältä.{closeLink}", + "feedback-cloud-provider": "Valitse pilvipalveluntarjoaja", + "feedback-cloud-provider-error": "Valitse pilvipalveluntarjoaja.", + "feedback-connection": "Palvelimeeni ei saada yhteyttä", + "feedback-connection-others": "Muut eivät saa yhteyttä palvelimeeni", + "feedback-disclaimer": "Tiimimme pystyy vastaamaan palautteeseen vain englanniksi.", + "feedback-email": "Sähköpostiosoite (valinnainen)", + "feedback-error": "Muista lisätä palaute.", + "feedback-explanation-install": "Outlinen asentamisessa palvelimelle tapahtui virhe. Jos et ole löytänyt ratkaisua, lähetä meille palautetta ja kerro sähköpostiosoitteesi (valinnainen), jotta voimme vastata sinulle.", + "feedback-general": "Yleinen palaute", + "feedback-install": "Outlinen asentamisessa on ongelmia", + "feedback-label": "Palautteesi", + "feedback-management": "Palvelimeni ylläpitämisessä on ongelmia", + "feedback-other": "Muu", + "feedback-privacy": "Palautteesi, sähköpostiosoitteesi (jos annoit sen) ja lisätiedot, joihin viitataan {openLink}tietosuojakäytännössä{closeLink}, lähetetään Outline-tiimille.", + "feedback-submit": "Lähetä", + "feedback-suggestion": "Ehdotukset", + "feedback-title-generic": "Lähetä palautetta", + "feedback-title-install": "Outline-palvelimen asentaminen epäonnistui", + "gcp-billing-action": "Seuraava", + "gcp-billing-body": "Odotetaan, että {openLink}lisäät laskutustilin Google Cloudiin{closeLink}", + "gcp-billing-description": "Jatka {openLink}avaamalla Cloud Consolen laskutussivu{closeLink} ja lisäämällä tili.", + "gcp-billing-error": "Laskutustietoja ei voi noutaa", + "gcp-billing-error-zero": "Sinun on lisättävä laskutustili, jotta voit jatkaa.", + "gcp-click-create": "Klikkaa Create (Luo).", + "gcp-create-new-project": "{openLink}Luo uusi Google-pilviprojekti{closeLink}.", + "gcp-create-new-vm": "{openLink}Luo uusi VM-esiintymä{closeLink}.", + "gcp-create-project": "Luo Google-pilviprojekti", + "gcp-create-server": "Luo Google-pilviprojekti", + "gcp-create-vm": "Luo VM-esiintymä", + "gcp-disconnect-account": "Katkaise Google Cloud Platform ‑tilin yhteys", + "gcp-firewall-create-0": "{openLink}Lisää uusi palomuurisääntö{closeLink} Compute Engine ‑projektiisi.", + "gcp-firewall-create-1": "Kirjoita Name (Nimi) ‑kenttään \"outline\".", + "gcp-firewall-create-2": "Kirjoita Target tags (Kohdetagit) ‑kenttään \"outline\".", + "gcp-firewall-create-3": "Kirjoita Source IP ranges (Lähteen IP-osoitealueet) ‑kenttään 0.0.0.0/0.", + "gcp-firewall-create-4": "Valitse Protocols and ports (Protokollat ja portit) ‑osiosta Allow all (Salli kaikki).", + "gcp-name-your-project": "Kirjoita projektin nimi Projektin nimi (Project name) ‑kenttään.", + "gcp-project-setup-error": "Google Cloud ‑projektin määrittämisessä tapahtui virhe", + "gcp-select-machine-type": "Valitse Laitetyyppi (Machine type) ‑kohdasta \"f1-micro\".", + "gcp-select-networking": "Valitse Ylläpito, suojaus, levyt, verkot, yksinkäyttö (Management, security, disks, networking, sole tenancy) ja valitse sitten Verkot (Networking)", + "gcp-select-region": "Valitse Alue (Region) ‑kohdasta alue, jonka lähellä palvelimen käyttäjät ovat.", + "gcp-type-network-tag": "Kirjoita Verkkotagit (Network tags) ‑kenttään \"outline\".", + "gcp-type-outline-server": "Kirjoita Nimi (Name) ‑kenttään \"outline server\".", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhuan piirikunta", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Lontoo", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Pohjois-Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Soul", + "geo-sg": "Singapore", + "geo-south-carolina": "Etelä-Carolina", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsova", + "geo-zurich": "Zürich", + "key": "Avain {keyId}", + "manual-server-assign-firewall": "Määritä palomuurisääntö", + "manual-server-assign-group": "Määritä suojausryhmä", + "manual-server-create-firewall": "Luo palomuurisääntö", + "manual-server-create-group": "Luo suojausryhmä", + "manual-server-description": "Näiden ohjeiden avulla voit asentaa Outlinen Linux-palvelimelle ({cloudProvider}).", + "manual-server-firewall": "Määritä palomuuri", + "manual-server-install-paste": "Liitä asennusraportti tähän.", + "manual-server-install-run": "Kirjaudu sisään palvelimellesi ja suorita tämä komento.", + "manual-server-instructions": "Ohjeet", + "manual-server-show-me": "Näytä missä", + "manual-server-title": "Seuraa alla olevia ohjeita", + "metrics-description": "Anonyymien mittaritietojen jakaminen auttaa parantamaan Outlinen luotettavuutta ja suorituskykyä. Siitä on hyötyä sinulle ja palvelimesi käyttäjille. {openLink}Lue lisää.{closeLink}", + "metrics-share": "Jaa mittaritietoja", + "metrics-skip": "Ohita", + "metrics-title": "Mittaritietojen jakaminen", + "nav-about": "Tietoja", + "nav-data-collection": "Datan kerääminen", + "nav-feedback": "Palaute", + "nav-help": "Ohje", + "nav-licenses": "Lisenssit", + "nav-privacy": "Tietosuoja", + "nav-terms": "Ehdot", + "no-data-limit": "Ei mitään", + "notification-app-update": "Päivitetty versio Outline Managerista on ladattu. Se asennetaan, kun käynnistät sovelluksen uudelleen.", + "notification-feedback-thanks": "Kiitos, että autat parantamaan palvelua ja lähetät palautetta.", + "notification-key-added": "Avain lisätty", + "notification-key-removed": "Avain poistettu", + "notification-server-destroyed": "Palvelin tuhottu", + "notification-server-exists": "Palvelin on jo lisätty", + "notification-server-removed": "Palvelin poistettu", + "oauth-account-active": "DigitalOcean-tilisi on aktivoitu.", + "oauth-account-active-tag": "Tili aktivoitu! Ladataan palvelinten sijainteja…", + "oauth-activate-account": "Aktivoi DigitalOcean-tilisi", + "oauth-billing": "Lisää laskutustietosi digitalocean.com-sivuston kautta ja palaa sitten sovellukseen.", + "oauth-billing-tag": "Lisää laskutustiedot…", + "oauth-connect-description": "Tilin avulla Outline-palvelimen luominen ja yhteyden muodostaminen on helppoa.", + "oauth-connect-tag": "Odotetaan yhteyden muodostumista tiliin…", + "oauth-connect-title": "Kirjaudu sisään tai luo DigitalOcean-tili.", + "oauth-sign-out": "Kirjaudu ulos", + "oauth-verify": "Etsi postilaatikostasi sähköposti DigitalOceanilta ja vahvista tilisi klikkaamalla viestissä olevaa linkkiä.", + "oauth-verify-tag": "Vahvista sähköpostisi…", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Aseta oma dataraja", + "per-key-data-limit-dialog-title": "Dataraja – {keyName}", + "region-best-value": "Eniten vastinetta rahalle", + "region-description": "Internetkokemuksesi tulee tästä sijainnista.", + "region-setup": "Määritä Outline", + "region-title": "Valitse palvelimen sijainti.", + "remove": "Poista", + "retry": "Yritä uudelleen", + "save": "Tallenna", + "saved": "Tallennettu", + "saving": "Tallennetaan…", + "server-access": "Palvelimen pääsyoikeudet", + "server-access-key-new": "Lisää uusi avain", + "server-access-key-rename": "Nimeä uudelleen", + "server-access-keys": "Pääsyavaimet", + "server-connections": "Yhteydet", + "server-data-transfer": "Siirretty data / 30 viime päivää", + "server-data-used": "Kiintiötä käytetty / 30 viime päivää", + "server-destroy": "Tuhoa palvelin", + "server-help-access-key-description": "Jaa pääsyavaimia ystäville, jotta he voivat muodostaa yhteyden Outline-palvelimeesi. He voivat käyttää samaa pääsyavainta kaikilla laitteillaan.", + "server-help-access-key-next": "Seuraava", + "server-help-access-key-title": "Luo avaimia, jaa pääsyoikeuksia", + "server-help-connection-description": "Asenna Outline-asiakassovellus klikkaamalla tätä. Käytä henkilökohtaista Outline-palvelimen pääsyavaintasi.", + "server-help-connection-ok": "Selvä!", + "server-help-connection-title": "Yhteyttä ei vielä ole!", + "server-keys": "Avaimet", + "server-my-access-key": "Oma pääsyavaimeni", + "server-name": "Outline-palvelin {serverLocation}", + "server-remove": "Poista palvelin", + "server-settings": "Asetukset", + "server-unreachable": "Palvelimeen ei saada yhteyttä", + "server-unreachable-description": "Yhteyden muodostamisessa tähän palvelimeen on ongelmia.", + "server-unreachable-managed-description": "Yritä uudelleen tai poista tämä palvelin sovelluksesta.", + "server-unreachable-manual-description": "Yritä uudelleen tai tuhoa tämä palvelin ja virtuaali-isäntä.", + "server-usage": "Käyttö (30 viime päivää)", + "servers-add": "Lisää palvelin", + "servers-digitalocean": "DigitalOcean-palvelimet", + "servers-gcp": "Google Cloud Platform ‑palvelimet", + "servers-manual": "Palvelimet", + "settings-access-key-port": "Uusien pääsyavaimien portti", + "settings-metrics-header": "Jaa anonyymeja mittaritietoja", + "settings-server-api-url": "Hallinta-API:n URL-osoite", + "settings-server-cost": "Kuukausihinta", + "settings-server-creation": "Luotu", + "settings-server-hostname": "Isäntänimi", + "settings-server-id": "Palvelimen tunnus", + "settings-server-info": "Palvelimen tiedot", + "settings-server-location": "Palvelimen sijainti", + "settings-server-name": "Nimi", + "settings-server-rename": "Määritä palvelimellesi uusi nimi. Huomaa, että muutos ei näy palvelimelle kutsumiesi käyttäjien laitteissa.", + "settings-server-version": "Palvelinversio", + "settings-transfer-limit": "Datansiirtokiintiö", + "setup-action": "Määritä", + "setup-advanced": "Edistyneille käyttäjille", + "setup-anywhere": "Määritä Outline missä tahansa", + "setup-cancel": "Peru milloin tahansa", + "setup-create": "Luo palvelin", + "setup-description": "Eikö käytettävissäsi ole palvelinta? Luo DigitalOcean-tili.", + "setup-do-cost": "Vain 6 $ kuukaudessa", + "setup-do-create": "Luo uusi palvelin DigitalOcean-tilisi avulla: jos maksat lisämaksun 6 $ / 30 päivää, datansiirtokiintiö on 1 TB.", + "setup-do-data": "1 TB:n datansiirtokiintiö", + "setup-do-description": "Tähän voi mennä muutamia minuutteja. Voit tuhota tämän palvelimen milloin tahansa.", + "setup-do-easiest": "Helppo määritys", + "setup-do-title": "Outlinea määritetään", + "setup-firewall-instructions": "Palomuurin ohjeet", + "setup-gcp-create": "Luo uusi palvelin Google-tililläsi. Hinta vaihtelee sijainnin ja käytön mukaan.", + "setup-gcp-easy": "Helppo määritys", + "setup-gcp-free-tier": "{openLinkFreeTier}Maksuttomalla tasolla{closeLink} ensimmäisen palvelimen hinta on alkaen {openLinkIpPrice}3 $/kk{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 päivän maksuton kokeilu{closeLink} uusille käyttäjille", + "setup-gcp-promo": "Kokeile uutta automaattista Outline-palvelimen luomistapaa Google Cloudissa", + "setup-recommended": "Suositus", + "setup-simple-commands": "Yksinkertaiset asennuskomennot", + "setup-step-by-step": "Vaiheittainen määritysopas", + "setup-tested": "Testattu seuraavissa palveluissa: VULTR, Linode ja Liquid Web", + "setup-title": "Valitse pilvipalvelu Outlinen määrittämistä varten.", + "share-description": "Kopioi tämä kutsu ja lähetä se viestintävälineellä, johon luotat. {openLink}Tarvitsetko ohjeita?{closeLink}", + "share-invite-access-key-copied": "Pääsyavain kopioitu leikepöydälle", + "share-invite-copied": "Kutsu kopioitu leikepöydälle", + "share-invite-copy": "Kopioi kutsu", + "share-invite-copy-access-key": "Kopioi pääsyavain", + "share-invite-html": "Tällä palvelimella voit käyttää avointa internetiä turvallisesti:

1) Lataa ja asenna Outline-sovellus laitteellesi:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Androidin vaihtoehtoinen linkki: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Saat pääsyavaimen, jonka alussa on ss://. Kun olet saanut pääsyavaimen, kopioi se.

3) Avaa Outline-asiakassovellus. Jos pääsyavaimesi tunnistetaan automaattisesti, valitse Connect (Yhdistä) ja jatka. Jos pääsyavaintasi ei tunnisteta automaattisesti, liitä se kenttään, valitse Connect (Yhdistä) ja jatka.

Voit nyt käyttää avointa internetiä! Voit varmistaa palvelinyhteyden toimivuuden tekemällä Google-haun \"mikä on IP-osoitteeni\". Googlessa näkyvän IP-osoitteen on vastattava Outline-asiakassovelluksen IP-osoitetta.

Lue lisää Outlinesta täältä: https://getoutline.org/", + "share-invite-instructions": "Seuraa GitHubissa olevia kutsuohjeita:", + "share-invite-trouble": "Onko kutsulinkin käytössä ongelmia?", + "share-title": "Jaa pääsy", + "survey-data-limits-title": "Auta meitä ymmärtämään, miten voimme parantaa datarajoja", + "survey-decline": "Hylkää", + "survey-disclaimer": "Kun valitset Jatka, sinulle lähetetään lyhyt Google Forms ‑kysely. Suosittelemme, että vastaat kyselyyn Outline-yhteyden aikana.", + "survey-go-to-survey": "Siirry kyselyyn", + "terms-of-service": "Olen lukenut ja ymmärtänyt {openLink}Outlinen käyttöehdot{closeLink}" +} diff --git a/server_manager/messages/fil.json b/server_manager/messages/fil.json new file mode 100644 index 0000000000..faa4338419 --- /dev/null +++ b/server_manager/messages/fil.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Ang Outline ay isang open source na proyektong ginawa ng Jigsaw para magbigay ng mas ligtas na paraan para ma-access ng mga organisasyon ng balita at mga mamamahayag ang internet.

Pinapagana ng Shadowsocks ang Outline at isang produktong kakasimula pa lang din. Maaari kang mag-ambag sa code sa GitHub, at i-follow kami sa Reddit at Medium para malaman kapag lumawak kami sa mas maraming platform at nagdagdag ng mga bagong feature.", + "about-version": "Bersyon {version}", + "aws-lightsail-firewall-0": "Mag-navigate sa screen ng mga instance ng {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "I-click ang instance kung saan mo gustong i-host ang Outline.", + "aws-lightsail-firewall-2": "Mag-navigate sa tab na 'Networking.'", + "aws-lightsail-firewall-3": "Sa seksyon ng 'Firewall,' i-click ang 'Magdagdag ng isa pa (Add another).'", + "aws-lightsail-firewall-4": "Itakda ang value ng 'Application' sa 'Lahat ay TCP+UDP (All TCP+UDP).'", + "aws-lightsail-firewall-5": "I-click ang 'I-Save (Save).'", + "cancel": "Kanselahin", + "close": "Isara", + "confirmation-server-destroy": "Mawawalan ng access ang mga kasalukuyang user. Hindi puwedeng i-undo ang pagkilos na ito.", + "confirmation-server-destroy-title": "Sirain ang Server?", + "confirmation-server-remove": "Inaalis ng pagkilos na ito ang iyong server sa Outline Manager, pero hindi nito bina-block ang access na proxy sa mga user. Kakailanganin mo pa ring manual na i-delete ang Outline server mula sa iyong host na machine.", + "confirmation-server-remove-title": "Alisin ang Server?", + "data-limit": "Limitasyon sa Data", + "data-limit-per-key": "Limitasyon sa data kada key", + "data-limits": "Mga limitasyon sa data", + "data-limits-description": "Magtakda ng limitasyon sa paglilipat ng data batay sa nakaraang 30 araw para sa mga access key sa server na ito.", + "data-limits-dialog-text": "Pumunta sa tab na Mga Setting para magtakda ng limitasyon sa paglilipat ng data para sa mga access key sa server na ito.", + "data-limits-dialog-title": "Iwasan ang mga labis na paggamit ng data", + "data-limits-disclaimer": "Dahil kasalukuyan kang nag-uulat ng mga sukatan, isasama ang paggamit ng feature na mga limitasyon ng data. Pakitingnan ang {openLink}patakaran sa pangongolekta ng data{closeLink} para sa higit pang detalye.", + "data-limits-usage": "{used} sa {total} ang nagamit", + "destroy": "Sirain", + "digitalocean-disconnect-account": "Idiskonekta ang DigitalOcean account", + "digitalocean-unreachable": "Ang error na ito ay posibleng dahil sa firewall sa iyong network o mga pansamantalang isyu sa pagkakakonekta sa digitalocean.com.", + "disabled": "Naka-disable", + "disconnect": "Idiskonekta", + "done": "Tapos na", + "enabled": "Naka-enable", + "error-connectivity": "Nagkakaproblema kami sa pagkonekta sa iyong DigitalOcean account. Kung minsan, isa itong pansamantalang problema sa DigitalOcean o sa iyong koneksyon sa internet. Kung hindi gagana ang pagsubok ulit, dapat maisaayos ang problema kapag nag-log in ulit sa DigitalOcean.", + "error-connectivity-title": "Problema sa koneksyon", + "error-do-account-info": "Hindi nakuha ang impormasyon ng DigitalOcean account", + "error-do-auth": "Hindi nakapag-authenticate sa DigitalOcean", + "error-do-limit": "Naabot na ng iyong DigitalOcean account ang limitasyon nitong {num} (na) Droplet. Puwede kang humiling na taasan ito sa https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Hindi nakuha ang listahan ng mga available na rehiyon", + "error-do-warning": "Babala ng DigitalOcean: \"{message}\"", + "error-feedback": "Hindi naisumite ang feedback. Pakisubukan ulit.", + "error-gcp-auth": "Hindi nakapag-authenticate sa Google Cloud Platform", + "error-hostname-invalid": "Dapat ay IP address o valid na hostname.", + "error-key-add": "Hindi naidagdag ang key", + "error-key-remove": "Hindi naalis ang key", + "error-key-rename": "Hindi na-rename ang key", + "error-keys-get": "Hindi ma-load ang mga key", + "error-keys-port-bad-input": "Ang port ay dapat na integer sa pagitan ng 1 at 65,535.", + "error-keys-port-in-use": "Ginagamit na ang port sa server.", + "error-licenses": "Hindi ma-load ang mga lisensya.", + "error-metrics": "Error sa pagtatakda na naka-enable ang mga sukatan", + "error-network": "Nagkaroon ng error sa network.", + "error-not-saved": "Hindi Na-save", + "error-remove-data-limit": "Hindi ma-disable ang default na limitasyon sa data", + "error-remove-per-key-limit": "Hindi maalis ang limitasyon sa data sa access key na ito", + "error-server-creation": "Nagkaroon ng error sa paggawa ng iyong Outline server.", + "error-server-destroy": "Hindi nasira ang server", + "error-server-removed": "Wala na ang {serverName} sa iyong DigitalOcean account.", + "error-server-rename": "Hindi na-rename ang server", + "error-server-unreachable": "Na-install nang tama ang iyong Outline Server, pero hindi kami makakonekta rito. Malamang na nangyayari ito dahil bina-block ng mga panuntunan sa firewall ng iyong server ang mga papasok na koneksyon. Pakisuri ang mga ito at tiyaking payagan ang mga papasok na koneksyong TCP sa mga port na mula 1024 hanggang 65535.", + "error-server-unreachable-title": "Hindi makakonekta sa iyong Outline Server", + "error-servers-removed": "Wala na ang {serverNames} sa iyong DigitalOcean account.", + "error-set-data-limit": "Hindi maitakda ang default na limitasyon sa data", + "error-set-per-key-limit": "Hindi maitakda ang limitasyon sa data para sa access key na ito", + "error-unexpected": "Nagkaroon ng hindi inaasahang error.", + "experimental": "Pang-eksperimento", + "experiments": "Mga Eksperimento", + "experiments-description": "Subukan ang mga bagong feature at magbigay ng feedback sa amin bago ma-release ang mga ito.", + "experiments-disclaimer": "Dine-develop pa ang mga eksperimento at puwede itong mabago o maalis sa app. Kung kasalukuyan kang nag-uulat ng mga sukatan, isasama rito ang paggamit ng mga pang-eksperimentong feature. Pakitingnan ang {openLink}patakaran sa pangongolekta ng data{closeLink} para sa higit pang detalye.", + "experiments-feedback": "May mga suhestyon? {openLink}Magsumite ng feedback dito.{closeLink}", + "feedback-cloud-provider": "Pumili ng cloud provider", + "feedback-cloud-provider-error": "Pakipili ng cloud provider.", + "feedback-connection": "Hindi makakonekta sa aking server", + "feedback-connection-others": "Hindi makakonekta sa aking server ang ibang tao", + "feedback-disclaimer": "Pakitandaan na masasagot lang ng aming team ang feedback sa English.", + "feedback-email": "Email address (opsyonal)", + "feedback-error": "Pakilagay ang feedback.", + "feedback-explanation-install": "Nagkaroon ng error habang sinusubukang i-install ang Outline sa iyong server. Kung wala kang naisip na solusyon, pag-isipang magpadala sa amin ng feedback at sabihin sa aming ang iyong email address (opsyonal) para puwede ka naming mabalitaan.", + "feedback-general": "Pangkalahatang feedback", + "feedback-install": "Nagkakaproblema sa pag-install ng Outline", + "feedback-label": "Ang iyong feedback", + "feedback-management": "Nagkakaproblema sa pamamahala sa aking server", + "feedback-other": "Iba pa", + "feedback-privacy": "Ipapadala sa team ng Outline ang iyong feedback, email address (kung nagbigay), at karagdagang impormasyon na tinukoy sa {openLink}patakaran sa privacy{closeLink}.", + "feedback-submit": "Isumite", + "feedback-suggestion": "Mga Mungkahi", + "feedback-title-generic": "Magpadala ng Feedback", + "feedback-title-install": "Hindi Na-install ang Outline Server", + "gcp-billing-action": "Susunod", + "gcp-billing-body": "Hinihintay kang {openLink}magdagdag ng account sa pagsingil sa Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Buksan ang page sa pagsingil ng Cloud Console{closeLink} at magdagdag ng account para magpatuloy.", + "gcp-billing-error": "Hindi makuha ang impormasyon sa pagsingil", + "gcp-billing-error-zero": "Dapat kang magdagdag ng account sa pagsingil bago magpatuloy.", + "gcp-click-create": "I-click ang 'Gumawa (Create).'", + "gcp-create-new-project": "{openLink}Gumawa ng bagong Proyekto sa Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Gumawa ng bagong VM instance{closeLink}.", + "gcp-create-project": "Gumawa ng proyekto sa Google Cloud", + "gcp-create-server": "Gumawa ng iyong Proyekto sa Google Cloud", + "gcp-create-vm": "Gumawa ng VM Instance", + "gcp-disconnect-account": "Idiskonekta ang account sa Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Magdagdag ng bagong panuntunan sa firewall{closeLink} sa iyong proyektong Compute Engine.", + "gcp-firewall-create-1": "I-type ang 'outline' sa field na 'Pangalan (Name).'", + "gcp-firewall-create-2": "I-type ang 'outline' sa field na 'Mga tag ng target (Target tags).'", + "gcp-firewall-create-3": "I-type ang '0.0.0.0/0' sa field na 'Mga hanay ng Source IP (Source IP ranges).'", + "gcp-firewall-create-4": "Piliin ang 'Payagan lahat (Allow all)' sa ilalim ng 'Mga protocol at port (Protocols and ports).'", + "gcp-name-your-project": "Pangalanan ang iyong proyekto sa field na 'Pangalan ng proyekto (Project name).'", + "gcp-project-setup-error": "Nagkaroon ng error habang sine-set up ang iyong proyekto sa Google Cloud", + "gcp-select-machine-type": "Piliin ang 'f1-micro' sa ilalim ng 'Uri ng machine (Machine type)'", + "gcp-select-networking": "I-click ang 'Pamamahala, seguridad, mga disk, networking, nag-iisang tenancy (Management, security, disks, networking, sole tenancy),' pagkatapos ay ang 'Networking'", + "gcp-select-region": "Sa ilalim ng 'Rehiyon (Region),' pumili ng rehiyong malapit sa kung nasaan ang mga user ng server.", + "gcp-type-network-tag": "I-type ang 'outline' sa field na 'Mga tag ng network (Network tags)'", + "gcp-type-outline-server": "I-type ang 'outline-server' sa field na 'Pangalan (Name).'", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua County", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Northern Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warsaw", + "geo-zurich": "Zürich", + "key": "Key {keyId}", + "manual-server-assign-firewall": "Magtalaga ng panuntunan sa firewall", + "manual-server-assign-group": "Magtalaga ng Grupong Panseguridad", + "manual-server-create-firewall": "Gumawa ng panuntunan sa firewall", + "manual-server-create-group": "Gumawa ng Grupong Panseguridad", + "manual-server-description": "Makakatulong sa iyo ang mga hakbang na ito na i-install ang Outline sa isang Linux server ng {cloudProvider}.", + "manual-server-firewall": "I-configure ang iyong firewall", + "manual-server-install-paste": "I-paste ang iyong output ng pag-install dito.", + "manual-server-install-run": "Mag-log in sa iyong server, at patakbuhin ang command na ito.", + "manual-server-instructions": "Mga Tagubilin", + "manual-server-show-me": "Ipakita sa akin kung saan", + "manual-server-title": "Sundin ang mga tagubilin sa ibaba", + "metrics-description": "Ibahagi ang mga sukatang ginawang anonymous para tumulong na pahusayin ang reliability at performance ng Outline, para sa iyo at para sa mga taong binahagian mo ng iyong server. {openLink}Matuto pa.{closeLink}", + "metrics-share": "Ibahagi ang mga sukatan", + "metrics-skip": "Laktawan", + "metrics-title": "Pagbabahagi ng mga sukatan", + "nav-about": "Tungkol dito", + "nav-data-collection": "Pangongolekta ng data", + "nav-feedback": "Feedback", + "nav-help": "Tulong", + "nav-licenses": "Mga Lisensya", + "nav-privacy": "Privacy", + "nav-terms": "Mga Tuntunin", + "no-data-limit": "Wala", + "notification-app-update": "Na-download ang na-update na bersyon ng Outline Manager. Ii-install ito kapag ni-restart mo ang application.", + "notification-feedback-thanks": "Salamat sa pagtulong sa aming humusay! Gusto naming may naririnig mula sa iyo.", + "notification-key-added": "Idinagdag ang key", + "notification-key-removed": "Inalis ang key", + "notification-server-destroyed": "Sinira ang server", + "notification-server-exists": "Naidagdag na ang server", + "notification-server-removed": "Inalis ang server", + "oauth-account-active": "Na-activate na ang iyong DigitalOcean account.", + "oauth-account-active-tag": "Na-activate ang account! Nilo-load ang mga lokasyon ng server...", + "oauth-activate-account": "I-activate ang iyong DigitalOcean account.", + "oauth-billing": "Ilagay ang iyong impormasyon sa pagsingil sa digitalocean.com at bumalik sa app kapag tapos ka na.", + "oauth-billing-tag": "Ilagay ang impormasyon sa pagsingil...", + "oauth-connect-description": "Gamit ang iyong account, pinapadali ng Outline na gumawa ng server at kumonekta.", + "oauth-connect-tag": "Naghihintay na ikonekta ang iyong account...", + "oauth-connect-title": "Mag-sign in o gumawa ng account sa DigitalOcean.", + "oauth-sign-out": "Mag-sign Out", + "oauth-verify": "Suriin ang iyong inbox para sa isang email mula sa DigitalOcean, at i-click ang link na nandito para kumpirmahin ang account mo.", + "oauth-verify-tag": "Kumpirmahin ang iyong email...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Magtakda ng custom na limitasyon sa data", + "per-key-data-limit-dialog-title": "Limitasyon sa Data - {keyName}", + "region-best-value": "Pinakasulit", + "region-description": "Dito magmumula ang iyong karanasan sa internet.", + "region-setup": "I-set up ang Outline", + "region-title": "Piliin ang lokasyon ng iyong server.", + "remove": "Alisin", + "retry": "Subukan ulit", + "save": "I-save", + "saved": "Na-save na", + "saving": "Sine-save...", + "server-access": "Access sa server", + "server-access-key-new": "Magdagdag ng bagong key", + "server-access-key-rename": "Palitan ng pangalan", + "server-access-keys": "Mga access key", + "server-connections": "Mga Koneksyon", + "server-data-transfer": "Nailipat na data / huling 30 araw", + "server-data-used": "Nagamit na allowance / huling 30 araw", + "server-destroy": "Sirain ang server", + "server-help-access-key-description": "Magbahagi ng mga access key sa mga kaibigan, para makakonekta sila sa iyong Outline server. Puwede nilang gamitin ang iisang access key sa lahat ng kanilang device.", + "server-help-access-key-next": "Susunod", + "server-help-access-key-title": "Gumawa ng mga key, magbahagi ng access", + "server-help-connection-description": "Mag-click dito para i-install ang client app ng Outline, gamit ang iyong personal na access key sa Outline server mo.", + "server-help-connection-ok": "Okay!", + "server-help-connection-title": "Hindi ka pa nakakonekta!", + "server-keys": "Mga Key", + "server-my-access-key": "Aking access key", + "server-name": "Outline Server sa {serverLocation}", + "server-remove": "Alisin ang server", + "server-settings": "Mga Setting", + "server-unreachable": "Hindi makakonekta sa server", + "server-unreachable-description": "Nakakaranas kami ng mga isyu sa pagkonekta sa server na ito.", + "server-unreachable-managed-description": "Subukan ulit o alisin ang server na ito sa application.", + "server-unreachable-manual-description": "Subukan ulit o sirain ang server na ito at ang virtual host.", + "server-usage": "Paggamit (huling 30 araw)", + "servers-add": "Magdagdag ng server", + "servers-digitalocean": "Mga DigitalOcean server", + "servers-gcp": "Mga server sa Google Cloud Platform", + "servers-manual": "Mga Server", + "settings-access-key-port": "Port para sa mga bagong access key", + "settings-metrics-header": "Magbahagi ng mga anonymous na sukatan", + "settings-server-api-url": "URL ng Management API", + "settings-server-cost": "Buwanang gastusin", + "settings-server-creation": "Ginawa", + "settings-server-hostname": "Hostname", + "settings-server-id": "Server ID", + "settings-server-info": "Impormasyon ng Server", + "settings-server-location": "Lokasyon ng server", + "settings-server-name": "Pangalan", + "settings-server-rename": "Magtakda ng bagong pangalan para sa iyong server. Tandaang hindi ito makikita sa mga device ng mga user na inimbitahan mong kumonekta rito.", + "settings-server-version": "Bersyon ng server", + "settings-transfer-limit": "Allowance sa paglilipat ng data", + "setup-action": "I-set up", + "setup-advanced": "Advanced", + "setup-anywhere": "I-set up ang Outline kahit saan", + "setup-cancel": "Kanselahin anumang oras", + "setup-create": "Gumawa ng server", + "setup-description": "Walang server? Gumawa ng account sa DigitalOcean.", + "setup-do-cost": "US$6 lang bawat buwan", + "setup-do-create": "Gumawa ng bagong server gamit ang iyong DigitalOcean account para sa karagdagang US$6/30 araw para sa paglilipat ng data na 1 TB.", + "setup-do-data": "Allowance sa paglilipat ng data na 1 TB", + "setup-do-description": "Puwede itong abutin nang ilang minuto. Puwede mong sirain ang server na ito anumang oras.", + "setup-do-easiest": "Pinakamadaling proseso ng pag-set up", + "setup-do-title": "Pag-set up sa Outline.", + "setup-firewall-instructions": "Mga tagubilin sa firewall", + "setup-gcp-create": "Gumawa ng bagong server gamit ang iyong Google account. Magkakaiba ang mga gastusin batay sa lokasyon at paggamit.", + "setup-gcp-easy": "Madaling proseso ng pag-set up", + "setup-gcp-free-tier": "Sa pamamagitan ng {openLinkFreeTier}Libreng Tier{closeLink}, magsisimula ang iyong unang server sa halagang {openLinkIpPrice}US$3/buwan{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 araw na libreng trial{closeLink} para sa mga bagong user", + "setup-gcp-promo": "Subukan ang bagong awtomatikong proseso ng paggawa ng Outline server para sa Google Cloud", + "setup-recommended": "Inirerekomenda", + "setup-simple-commands": "Mga simpleng command sa pag-install", + "setup-step-by-step": "Step-by-step na gabay sa pag-set up", + "setup-tested": "Sinubukan sa VULTR, Linode, at Liquid Web", + "setup-title": "Pumili ng serbisyo ng cloud para ma-set up ang Outline.", + "share-description": "Kopyahin ang imbitasyong ito at ipadala ito mula sa isang tool sa pakikipag-ugnayan na pinagkakatiwalaan mo. {openLink}Kailangan ng tulong?{closeLink}", + "share-invite-access-key-copied": "Kinopya ang access key sa clipboard", + "share-invite-copied": "Kinopya ang imbitasyon sa clipboard", + "share-invite-copy": "Kopyahin ang imbitasyon", + "share-invite-copy-access-key": "Kopyahin ang access key", + "share-invite-html": "Gamitin ang server na ito para ligtas na i-access ang accessible na internet:

1) I-download at i-install ang Outline app para sa iyong device:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Alternatibong link para sa Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Makakatanggap ka ng access key na nagsisimula sa ss://. Kapag natanggap mo na ito, kopyahin ang access key na ito.

3) Buksan ang Outline client app. Kung awtomatikong nade-detect ang iyong access key, i-tap ang \"Kumonekta\" at magpatuloy. Kung awtomatikong nade-detect ang iyong access key, i-paste ito sa field, at i-tap ang \"Kumonekta\" at magpatuloy.

Handa ka nang gamitin ang accessible na internet! Para matiyak na matagumpay kang nakakonekta sa server, subukang hanapin ang \"ano ang aking ip\" sa Google Search. Dapat tumugma ang IP address na ipinapakita sa Google sa IP address sa Outline client.

Matuto pa tungkol sa Outline dito: https://getoutline.org/", + "share-invite-instructions": "Sundin ang aming mga tagubilin sa imbitasyon sa GitHub:", + "share-invite-trouble": "Nagkakaproblema sa pag-access sa link ng imbitasyon?", + "share-title": "Ibahagi ang access", + "survey-data-limits-title": "Tulungan kaming maunawaan kung paano mapapahusay ang mga limitasyon sa data", + "survey-decline": "Tanggihan", + "survey-disclaimer": "Sa pamamagitan ng pag-click sa magpatuloy, dadalhin ka sa maikling survey sa Google Forms. Inirerekomenda naming sagutan ang survey habang nakakonekta sa Outline.", + "survey-go-to-survey": "Pumunta sa survey", + "terms-of-service": "Nabasa at naunawaan ko ang {openLink}Mga Tuntunin ng Serbisyo ng Outline{closeLink}" +} diff --git a/server_manager/messages/fr.json b/server_manager/messages/fr.json new file mode 100644 index 0000000000..41b1ce54cf --- /dev/null +++ b/server_manager/messages/fr.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline est un projet Open Source créé par Jigsaw afin d'offrir aux organismes de presse et aux journalistes un moyen plus sûr d'accéder à Internet.

Outline, fourni par Shadowsocks, est un produit en début de développement. Vous pouvez contribuer au code sur GitHub, et nous suivre sur Reddit et Medium pour être informé de son déploiement sur d'autres plates-formes et de l'ajout de nouvelles fonctionnalités.", + "about-version": "Version {version}", + "aws-lightsail-firewall-0": "Accédez à l'écran des instances {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Cliquez sur l'instance sur laquelle vous voulez héberger Outline.", + "aws-lightsail-firewall-2": "Accédez à l'onglet \"Réseau\" (Networking).", + "aws-lightsail-firewall-3": "Dans la section \"Pare-feu\" (Firewall), cliquez sur \"Ajouter\" (Add another).", + "aws-lightsail-firewall-4": "Définissez la valeur \"Application\" sur \"Toutes les connexions TCP et tout le trafic UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Cliquez sur \"Enregistrer\" (Save).", + "cancel": "Annuler", + "close": "Fermer", + "confirmation-server-destroy": "Les utilisateurs existants n'auront plus accès au serveur. Cette action est irréversible.", + "confirmation-server-destroy-title": "Supprimer le serveur ?", + "confirmation-server-remove": "Cette action retire votre serveur d'Outline Manager, sans bloquer l'accès proxy des utilisateurs. Vous devrez toutefois supprimer manuellement le serveur Outline de votre machine hôte.", + "confirmation-server-remove-title": "Retirer le serveur ?", + "data-limit": "Limite de données", + "data-limit-per-key": "Limite de données par clé", + "data-limits": "Limites de données", + "data-limits-description": "Définir une limite de transfert de données de 30 jours pour les clés d'accès sur ce serveur.", + "data-limits-dialog-text": "Accédez à l'onglet \"Paramètres\" pour définir une limite de transfert de données pour les clés d'accès sur ce serveur.", + "data-limits-dialog-title": "Éviter les dépassements de données", + "data-limits-disclaimer": "Dans la mesure où vous créez actuellement des rapports de statistiques, l'utilisation de la fonctionnalité de limite de données sera incluse. Veuillez vous reporter à nos {openLink}Règles relatives à la collecte des données{closeLink} pour plus d'informations.", + "data-limits-usage": "Utilisation : {used} sur {total}", + "destroy": "Supprimer", + "digitalocean-disconnect-account": "Déconnectez le compte DigitalOcean", + "digitalocean-unreachable": "Cette erreur peut être due à un pare-feu de votre réseau ou à des problèmes de connexion temporaires avec digitalocean.com.", + "disabled": "Désactivée", + "disconnect": "Déconnecter", + "done": "OK", + "enabled": "Activée", + "error-connectivity": "Nous ne parvenons pas à nous connecter à votre compte DigitalOcean. Il peut s'agir d'un problème temporaire avec DigitalOcean ou avec votre connexion Internet. Si le problème persiste, essayez de vous reconnecter à DigitalOcean.", + "error-connectivity-title": "Problème de connexion", + "error-do-account-info": "Impossible de récupérer les informations du compte DigitalOcean", + "error-do-auth": "Échec de l'authentification avec DigitalOcean", + "error-do-limit": "Votre compte DigitalOcean a atteint sa limite de {num} Droplets. Vous pouvez demander une augmentation à l'adresse https://cloud.digitalocean.com/account/team/droplet_limit_increase.", + "error-do-regions": "Impossible de récupérer la liste des régions disponibles", + "error-do-warning": "Avertissement DigitalOcean : \"{message}\"", + "error-feedback": "Impossible d'envoyer les commentaires. Veuillez réessayer.", + "error-gcp-auth": "Échec de l'authentification auprès de Google Cloud Platform", + "error-hostname-invalid": "Doit être une adresse IP ou un nom d'hôte valide.", + "error-key-add": "Impossible d'ajouter la clé", + "error-key-remove": "Impossible de supprimer la clé", + "error-key-rename": "Impossible de renommer la clé", + "error-keys-get": "Impossible de charger les clés", + "error-keys-port-bad-input": "Le port doit être un nombre entier compris entre 1 et 65 535.", + "error-keys-port-in-use": "Ce port est déjà utilisé sur le serveur.", + "error-licenses": "Impossible de charger les licences.", + "error-metrics": "Erreur lors de l'activation du rapport des statistiques", + "error-network": "Une erreur réseau s'est produite.", + "error-not-saved": "Non enregistré", + "error-remove-data-limit": "Impossible de désactiver la limite de données par défaut", + "error-remove-per-key-limit": "Impossible de supprimer la limite de données pour cette clé d'accès", + "error-server-creation": "Une erreur s'est produite lors de la création de votre serveur Outline.", + "error-server-destroy": "Impossible de supprimer le serveur", + "error-server-removed": "Le serveur {serverName} n'existe plus dans votre compte DigitalOcean.", + "error-server-rename": "Impossible de renommer le serveur", + "error-server-unreachable": "Votre serveur Outline a bien été installé, mais nous ne parvenons pas à nous y connecter. Il est probable que les règles de son pare-feu bloquent les connexions entrantes. Veuillez les vérifier et vous assurer d'autoriser les connexions TCP entrantes sur les ports compris entre 1024 et 65535.", + "error-server-unreachable-title": "Impossible d'établir la connexion avec votre serveur Outline", + "error-servers-removed": "Les serveurs {serverNames} n'existent plus dans votre compte DigitalOcean.", + "error-set-data-limit": "Impossible de définir la limite de données par défaut", + "error-set-per-key-limit": "Impossible de définir la limite de données pour cette clé d'accès", + "error-unexpected": "Une erreur inattendue s'est produite.", + "experimental": "Expérimentale", + "experiments": "Tests", + "experiments-description": "Tester de nouvelles fonctionnalités et nous communiquer votre avis avant leur lancement.", + "experiments-disclaimer": "Les tests sont en cours d'élaboration et peuvent être modifiés, voire supprimés de l'application. Si vous communiquez des statistiques, elles incluront l'utilisation des fonctionnalités expérimentales. Veuillez vous reporter à nos {openLink}Règles relatives à la collecte des données{closeLink} pour plus d'informations.", + "experiments-feedback": "Avez-vous des suggestions ? {openLink}Envoyez vos commentaires ici.{closeLink}", + "feedback-cloud-provider": "Sélectionner le fournisseur de services cloud", + "feedback-cloud-provider-error": "Veuillez sélectionner un fournisseur de services cloud.", + "feedback-connection": "Impossible de me connecter à mon serveur", + "feedback-connection-others": "Les autres utilisateurs ne peuvent pas se connecter à mon serveur", + "feedback-disclaimer": "Veuillez noter que notre équipe ne peut répondre qu'en anglais aux commentaires.", + "feedback-email": "Adresse e-mail (facultatif)", + "feedback-error": "Veuillez saisir vos commentaires.", + "feedback-explanation-install": "Une erreur s'est produite lors de l'installation d'Outline sur votre serveur. Si vous ne parvenez pas à résoudre le problème, veuillez nous envoyer vos commentaires en nous indiquant votre adresse e-mail (facultatif) afin que nous puissions vous contacter.", + "feedback-general": "Commentaire général", + "feedback-install": "Je rencontre des problèmes pour installer Outline", + "feedback-label": "Votre commentaire", + "feedback-management": "Je rencontre des problèmes dans l'administration de mon serveur", + "feedback-other": "Autre", + "feedback-privacy": "Vos commentaires, votre adresse e-mail (si vous l'avez fournie) et les informations complémentaires mentionnées dans les {openLink}Règles de confidentialité{closeLink} seront envoyés à l'équipe Outline.", + "feedback-submit": "Envoyer", + "feedback-suggestion": "Suggestions", + "feedback-title-generic": "Envoyez des commentaires", + "feedback-title-install": "Échec de l'installation du serveur Outline", + "gcp-billing-action": "Suivant", + "gcp-billing-body": "Vous devez {openLink}ajouter un compte de facturation sur Google Cloud{closeLink}. Opération en attente…", + "gcp-billing-description": "{openLink}Ouvrez la page de facturation Cloud Console{closeLink} et ajoutez un compte pour poursuivre la procédure.", + "gcp-billing-error": "Impossible de récupérer les informations de facturation", + "gcp-billing-error-zero": "Vous devez ajouter un compte de facturation pour pouvoir continuer.", + "gcp-click-create": "Cliquez sur \"Create\" (Créer).", + "gcp-create-new-project": "{openLink}Créez un projet Google Cloud.{closeLink}", + "gcp-create-new-vm": "{openLink}Créez une instance de VM{closeLink}.", + "gcp-create-project": "Créer un projet Google Cloud", + "gcp-create-server": "Créer votre projet Google Cloud", + "gcp-create-vm": "Créer une instance de VM", + "gcp-disconnect-account": "Déconnecter le compte Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Ajoutez une règle de pare-feu{closeLink} à votre projet Compute Engine.", + "gcp-firewall-create-1": "Saisissez \"outline\" dans le champ \"Name\" (Nom).", + "gcp-firewall-create-2": "Saisissez \"outline\" dans le champ \"Target tags\" (Tags cibles).", + "gcp-firewall-create-3": "Saisissez \"0.0.0.0/0\" dans le champ \"Source IP ranges\" (Plages d'adresses IP sources).", + "gcp-firewall-create-4": "Sélectionnez \"Allow all\" (Tout autoriser) sous \"Protocols and ports\" (Protocoles et ports).", + "gcp-name-your-project": "Nommez votre projet dans le champ \"Nom du projet\" (Project name).", + "gcp-project-setup-error": "Une erreur s'est produite lors de la configuration de votre projet Google Cloud", + "gcp-select-machine-type": "Sélectionnez \"f1-micro\" sous \"Type de machine\" (Machine type)", + "gcp-select-networking": "Cliquez sur \"Gestion, sécurité, disques, mise en réseau et location unique\" ('Management, security, disks, networking, sole tenancy), puis sur \"Réseau\" (Networking)", + "gcp-select-region": "Sélectionnez une région proche de l'emplacement des utilisateurs du serveur sous \"Région\" (Region).", + "gcp-type-network-tag": "Saisissez \"outline\" dans le champ \"Tags réseau\" (Network tags).", + "gcp-type-outline-server": "Saisissez \"outline-server\" dans le champ \"Nom\" (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Comté de Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Francfort", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londres", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Virginie du Nord", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Séoul", + "geo-sg": "Singapour", + "geo-south-carolina": "Caroline du Sud", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsovie", + "geo-zurich": "Zurich", + "key": "Clé {keyId}", + "manual-server-assign-firewall": "Attribuer une règle de pare-feu", + "manual-server-assign-group": "Attribuer un groupe de sécurité", + "manual-server-create-firewall": "Créer une règle de pare-feu", + "manual-server-create-group": "Créer un groupe de sécurité", + "manual-server-description": "Cette procédure permet d'installer Outline sur un serveur Linux {cloudProvider}", + "manual-server-firewall": "Configurer votre pare-feu", + "manual-server-install-paste": "Collez le résultat de l'installation ici", + "manual-server-install-run": "Connectez-vous à votre serveur et exécutez cette commande", + "manual-server-instructions": "Instructions", + "manual-server-show-me": "Accéder à la console", + "manual-server-title": "Suivez les instructions ci-dessous", + "metrics-description": "Partagez des statistiques anonymes afin de nous aider à améliorer la fiabilité et les performances d'Outline, pour vous, mais aussi pour les personnes avec lesquelles vous partagez votre serveur. {openLink}En savoir plus{closeLink}", + "metrics-share": "Partager les statistiques", + "metrics-skip": "Ignorer", + "metrics-title": "Partage des statistiques", + "nav-about": "À propos", + "nav-data-collection": "Collecte d'informations", + "nav-feedback": "Commentaires", + "nav-help": "Aide", + "nav-licenses": "Licences", + "nav-privacy": "Confidentialité", + "nav-terms": "Conditions", + "no-data-limit": "Aucune", + "notification-app-update": "Une nouvelle version d'Outline Manager a été téléchargée. Elle sera installée au redémarrage de l'application.", + "notification-feedback-thanks": "Merci de nous aider à améliorer notre produit ! Votre avis nous intéresse.", + "notification-key-added": "Clé ajoutée", + "notification-key-removed": "Clé supprimée", + "notification-server-destroyed": "Serveur supprimé", + "notification-server-exists": "Serveur déjà ajouté", + "notification-server-removed": "Serveur retiré", + "oauth-account-active": "Votre compte DigitalOcean a été activé.", + "oauth-account-active-tag": "Compte activé ! Chargement des emplacements de serveur…", + "oauth-activate-account": "Activez votre compte DigitalOcean", + "oauth-billing": "Saisissez vos informations de facturation sur digitalocean.com, puis revenez dans l'application une fois que vous avez terminé.", + "oauth-billing-tag": "Saisissez vos informations de facturation…", + "oauth-connect-description": "Votre compte facilite la création d'un serveur Outline et sa connexion.", + "oauth-connect-tag": "En attente de connexion de votre compte…", + "oauth-connect-title": "Connectez-vous ou créez un compte avec DigitalOcean", + "oauth-sign-out": "Se déconnecter", + "oauth-verify": "Vérifiez dans votre boîte de réception si vous avez reçu un e-mail de DigitalOcean, puis cliquez sur le lien qu'il contient pour valider votre compte.", + "oauth-verify-tag": "Confirmez votre adresse e-mail…", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Définir une limite de données personnalisée", + "per-key-data-limit-dialog-title": "Limite de données - {keyName}", + "region-best-value": "Meilleur rapport qualité/prix", + "region-description": "Ce serveur vous permettra d'accéder à Internet.", + "region-setup": "Installer Outline", + "region-title": "Sélectionnez l'emplacement de votre serveur", + "remove": "Supprimer", + "retry": "Réessayer", + "save": "Enregistrer", + "saved": "Enregistré", + "saving": "Enregistrement…", + "server-access": "Accès au serveur", + "server-access-key-new": "Ajouter une clé", + "server-access-key-rename": "Renommer", + "server-access-keys": "Clés d'accès", + "server-connections": "Connexions", + "server-data-transfer": "Données transférées/30 derniers jours", + "server-data-used": "Dotation utilisée/30 derniers jours", + "server-destroy": "Supprimer le serveur", + "server-help-access-key-description": "Partagez vos clés d'accès avec vos proches, afin qu'ils puissent se connecter à votre serveur Outline. Ils peuvent utiliser la même clé d'accès sur tous leurs appareils.", + "server-help-access-key-next": "Suivant", + "server-help-access-key-title": "Créer des clés et partager l'accès", + "server-help-connection-description": "Cliquez ici pour installer l'application cliente Outline à l'aide de votre clé personnelle d'accès à votre serveur Outline.", + "server-help-connection-ok": "OK", + "server-help-connection-title": "Vous n'êtes pas encore connecté", + "server-keys": "Clés", + "server-my-access-key": "Ma clé d'accès", + "server-name": "Serveur Outline {serverLocation}", + "server-remove": "Supprimer le serveur", + "server-settings": "Paramètres", + "server-unreachable": "Serveur inaccessible", + "server-unreachable-description": "Impossible de se connecter au serveur.", + "server-unreachable-managed-description": "Réessayez ou supprimez ce serveur de l'application", + "server-unreachable-manual-description": "Réessayez, ou supprimez ce serveur et l'hôte virtuel", + "server-usage": "Utilisation (30 derniers jours)", + "servers-add": "Ajouter un serveur", + "servers-digitalocean": "Serveurs DigitalOcean", + "servers-gcp": "Serveurs Google Cloud Platform", + "servers-manual": "Serveurs", + "settings-access-key-port": "Port associé aux nouvelles clés d'accès", + "settings-metrics-header": "Partagez des statistiques anonymes", + "settings-server-api-url": "URL de l'API Management", + "settings-server-cost": "Coût mensuel", + "settings-server-creation": "Date de création", + "settings-server-hostname": "Nom d'hôte", + "settings-server-id": "ID serveur", + "settings-server-info": "Informations sur le serveur", + "settings-server-location": "Emplacement du serveur", + "settings-server-name": "Nom", + "settings-server-rename": "Attribuez un nouveau nom à votre serveur. Notez que cette modification ne sera pas visible sur les appareils des utilisateurs que vous avez invités à se connecter au serveur.", + "settings-server-version": "Version du serveur", + "settings-transfer-limit": "Volume maximal de données transférées", + "setup-action": "Installer", + "setup-advanced": "Avancé", + "setup-anywhere": "Installer Outline sur n'importe quel serveur cloud", + "setup-cancel": "Annulation possible à tout moment", + "setup-create": "Créer un serveur", + "setup-description": "Vous n'avez pas de serveur ? Créez un compte auprès de DigitalOcean.", + "setup-do-cost": "Seulement 6 USD par mois", + "setup-do-create": "Créez un serveur avec votre compte DigitalOcean pour 6 USD de plus/30 jours pour un volume de 1 To de données transférées.", + "setup-do-data": "Volume maximal de données transférées : 1 To", + "setup-do-description": "Cette opération peut prendre quelques minutes. Vous pouvez à tout moment supprimer ce serveur.", + "setup-do-easiest": "Configuration aisée", + "setup-do-title": "Configuration d'Outline", + "setup-firewall-instructions": "Instructions relatives au pare-feu", + "setup-gcp-create": "Créez un serveur avec votre compte Google. Les coûts varient selon le lieu et l'utilisation.", + "setup-gcp-easy": "Configuration aisée", + "setup-gcp-free-tier": "Avec la {openLinkFreeTier}version gratuite{closeLink}, vous disposez de votre premier serveur à partir de {openLinkIpPrice}3 US$/mois{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Essai gratuit de 90 jours{closeLink} pour les nouveaux utilisateurs", + "setup-gcp-promo": "Tester le nouveau processus de création automatique de serveur Outline pour Google Cloud", + "setup-recommended": "Recommandé", + "setup-simple-commands": "Commandes d'installation simples", + "setup-step-by-step": "Guide d'installation détaillé", + "setup-tested": "Test effectué sur VULTR, Linode et Liquid Web", + "setup-title": "Sélectionnez un service cloud pour installer Outline", + "share-description": "Copiez cette invitation et envoyez-la avec l'outil de communication de votre choix. {openLink}Besoin d'aide ?{closeLink}", + "share-invite-access-key-copied": "Clé d'accès copiée dans le presse-papiers", + "share-invite-copied": "Invitation copiée dans le presse-papiers", + "share-invite-copy": "Copier l'invitation", + "share-invite-copy-access-key": "Copier la clé d'accès", + "share-invite-html": "Ce serveur vous permet d'accéder en toute sécurité à Internet :

1) Téléchargez et installez l'application Outline pour votre appareil.

- iOS : https://itunes.apple.com/app/outline-app/id1356177741
- MacOS : https://itunes.apple.com/app/outline-app/id1356178125
- Windows : https://s3.amazonaws.com/outline -releases/client/windows/stable/Outline-Client.exe
- Linux : https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android : https://play.google.com/store/apps/details?id=org.outline.android.client
- Lien alternatif Android : https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Vous recevrez une clé d'accès qui commence par ss://. Une fois que vous l'avez reçue, copiez cette clé d'accès.

3) Ouvrez l'application cliente Outline. Si votre clé d'accès est détectée automatiquement, appuyez sur \"Connect\" (Se connecter) et continuez. Si votre clé d'accès n'est pas détectée automatiquement, collez-la dans le champ, puis appuyez sur \"Connect\" (Se connecter) et continuez.

Vous êtes prêt à utiliser l'Internet ouvert ! Pour vérifier que vous êtes bien connecté au serveur, recherchez \"quelle est mon adresse IP\" dans la recherche Google. L'adresse IP indiquée par Google doit correspondre à l'adresse IP du client Outline.

En savoir plus sur Outline : https://getoutline.org/", + "share-invite-instructions": "Suivez nos instructions d'invitation sur GitHub :", + "share-invite-trouble": "Vous n'arrivez pas à accéder au lien d'invitation ?", + "share-title": "Partagez l'accès", + "survey-data-limits-title": "Nous aider à trouver comment améliorer les limites de données", + "survey-decline": "Refuser", + "survey-disclaimer": "Cliquez sur \"Continuer\" pour être redirigé vers une rapide enquête dans Google Forms. Nous recommandons que vous soyez connecté à Outline lorsque vous y répondez.", + "survey-go-to-survey": "Accéder à l'enquête", + "terms-of-service": "J'ai lu et compris les {openLink}Conditions d'utilisation d'Outline{closeLink}" +} diff --git a/server_manager/messages/he.json b/server_manager/messages/he.json new file mode 100644 index 0000000000..286a78c429 --- /dev/null +++ b/server_manager/messages/he.json @@ -0,0 +1,275 @@ +{ + "about-outline": "אפליקציית Outline היא פרויקט בקוד פתוח שנוצר על ידי Jigsaw כדי להעניק לגופי תקשורת ועיתונאים גישה מאובטחת יותר לאינטרנט.

Outline מופעלת על ידי Shadowsocks ועדיין נמצאת בשלבי פיתוח מוקדמים. אפשר לתרום לקוד ב-GitHub ולעקוב אחרינו ב-Reddit וב-Medium כדי להיות עם יד על הדופק ולשמוע כשנוספות תכונות חדשות וכשהאפליקציה מתרחבת לפלטפורמות נוספות.", + "about-version": "גרסה {version}", + "aws-lightsail-firewall-0": "עוברים למסך של מופעי {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "לוחצים על המופע שבו רוצים לארח את Outline.", + "aws-lightsail-firewall-2": "עוברים לכרטיסייה \"Networking\" [רשתות].", + "aws-lightsail-firewall-3": "בקטע \"Firewall\" [חומת אש], לוחצים על \"Add another\" [הוספה].", + "aws-lightsail-firewall-4": "מגדירים את \"Application\" [שימוש] ל-\"All TCP+UDP\" [כל TCP+UDP].", + "aws-lightsail-firewall-5": "לוחצים על \"Save\" [שמירה].", + "cancel": "ביטול", + "close": "סגירה", + "confirmation-server-destroy": "למשתמשים הקיימים לא תהיה יותר גישה לשרת. זו פעולה בלתי הפיכה.", + "confirmation-server-destroy-title": "למחוק את השרת?", + "confirmation-server-remove": "השרת שלך יוסר מאפליקציית מנהל Outline, אבל המשתמשים הקיימים עדיין יוכלו להתחבר אליו ולגלוש דרכו באינטרנט. יהיה צריך למחוק ידנית את השרת של Outline מהמכונה המארחת שלך.", + "confirmation-server-remove-title": "להסיר את השרת?", + "data-limit": "מגבלת נתונים", + "data-limit-per-key": "מגבלת נתונים לכל מפתח", + "data-limits": "מגבלות נתונים", + "data-limits-description": "אפשר להגדיר מגבלה מתגלגלת ל-30 יום על העברת נתונים למי שמשתמש במפתחות גישה בשרת.", + "data-limits-dialog-text": "אפשר להיכנס לכרטיסייה 'הגדרות' כדי להגדיר מגבלה על העברת נתונים למי שמשתמש במפתחות גישה בשרת.", + "data-limits-dialog-title": "רוצה למנוע שימוש יתר בנתונים?", + "data-limits-disclaimer": "השימוש במגבלות הנתונים ייכלל במדדים שמדווחים על ידיך. למידע נוסף, אפשר לקרוא את {openLink}מדיניות איסוף המידע{closeLink}.", + "data-limits-usage": "‎{used} מתוך ‎{total} בשימוש", + "destroy": "מחיקה", + "digitalocean-disconnect-account": "התנתקות מהחשבון ב-DigitalOcean", + "digitalocean-unreachable": "ייתכן שהשגיאה נובעת מחומת אש ברשת שלך או מבעיות קישוריות זמניות ב-digitalocean.com.", + "disabled": "מושבתת", + "disconnect": "ניתוק", + "done": "סיום", + "enabled": "פועלת", + "error-connectivity": "לא הצלחנו להתחבר לחשבון שלך ב-DigitalOcean. לפעמים הסיבה לכך היא בעיה זמנית ב-DigitalOcean או בחיבור לאינטרנט. אם ניסית שוב ללא הצלחה, יכול להיות שכניסה מחדש ל-DigitalOcean תפתור את הבעיה.", + "error-connectivity-title": "יש בעיה בחיבור", + "error-do-account-info": "פרטי החשבון ב-DigitalOcean לא נטענו", + "error-do-auth": "האימות באמצעות DigitalOcean נכשל", + "error-do-limit": "הגעת למכסת השרתים שאפשר ליצור בחשבון DigitalOcean שלך ({num}). כאן אפשר לשלוח בקשה להגדלת המכסה: https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "רשימת האזורים הזמינים לא נטענה", + "error-do-warning": "אזהרה בקשר ל-DigitalOcean:‏ \"{message}\"", + "error-feedback": "המשוב לא נשלח. אפשר לנסות שוב.", + "error-gcp-auth": "האימות ב-Google Cloud Platform נכשל", + "error-hostname-invalid": "צריך להזין כאן כתובת IP או שם מארח תקין.", + "error-key-add": "המפתח לא נוסף", + "error-key-remove": "המפתח לא הוסר", + "error-key-rename": "השם של המפתח לא שונה", + "error-keys-get": "רשימת המפתחות לא נטענה", + "error-keys-port-bad-input": "מספר היציאה צריך להיות שלם ובין 1 ל-65,535.", + "error-keys-port-in-use": "יציאה זאת כבר נמצאת בשימוש בשרת.", + "error-licenses": "הרישיונות לא נטענו.", + "error-metrics": "ההגדרה של שיתוף המדדים לא שונתה", + "error-network": "הייתה שגיאה ברשת.", + "error-not-saved": "השמירה נכשלה", + "error-remove-data-limit": "ברירת המחדל של מגבלת הנתונים לא הושבתה", + "error-remove-per-key-limit": "מגבלת הנתונים לא הוסרה ממפתח הגישה הזה", + "error-server-creation": "לא הצלחנו ליצור את השרת שלך ב-Outline.", + "error-server-destroy": "השרת לא נמחק", + "error-server-removed": "השרת {serverName} לא קיים יותר בחשבון שלך ב-DigitalOcean.", + "error-server-rename": "השם של השרת לא שונה", + "error-server-unreachable": "השרת שלך ב-Outline הותקן נכון, אבל לא הצלחנו להתחבר אליו. רוב הסיכויים שכללי חומת האש של השרת חוסמים חיבורים נכנסים. מומלץ לבדוק את הכללים ולאפשר חיבורי TCP נכנסים ביציאות 1024 עד 65535.", + "error-server-unreachable-title": "לא הצלחנו להתחבר לשרת שלך ב-Outline", + "error-servers-removed": "השרתים {serverNames} לא קיימים יותר בחשבון שלך ב-DigitalOcean.", + "error-set-data-limit": "ברירת המחדל של מגבלת הנתונים לא נוצרה", + "error-set-per-key-limit": "מגבלת הנתונים לא נוצרה למפתח הגישה הזה", + "error-unexpected": "הייתה שגיאה בלתי צפויה.", + "experimental": "ניסיוני", + "experiments": "פיצ'רים ניסיוניים", + "experiments-description": "רוצה לבדוק פיצ'רים חדשים ולתת לנו משוב לפני שהם מופצים?", + "experiments-disclaimer": "הפיצ'רים הניסיוניים נמצאים בשלבי פיתוח, ואנחנו עשויים לשנות או להסיר אותם מהאפליקציה. כשמדווחים על מדדים, השימוש בפיצ'רים ניסיוניים נכלל בהם. למידע נוסף, אפשר לקרוא את {openLink}מדיניות איסוף המידע{closeLink}.", + "experiments-feedback": "יש לך הצעות? {openLink}כאן אפשר לשלוח לנו משוב.{closeLink}", + "feedback-cloud-provider": "בחירת ספק שירותי ענן", + "feedback-cloud-provider-error": "צריך לבחור ספק שירותי ענן.", + "feedback-connection": "לא הצלחתי להתחבר לשרת שלי", + "feedback-connection-others": "אנשים אחרים לא מצליחים להתחבר לשרת שלי", + "feedback-disclaimer": "חשוב לזכור שהצוות שלנו יכול לענות למשוב רק באנגלית.", + "feedback-email": "כתובת אימייל (לא חובה)", + "feedback-error": "לא הזנת משוב.", + "feedback-explanation-install": "לא הצלחנו להתקין את Outline בשרת שלך. אם לא הצלחת לפתור את הבעיה בעצמך, אפשר לשלוח לנו משוב. כדאי גם לצרף כתובת אימייל כדי שנוכל לחזור אליך.", + "feedback-general": "משוב כללי", + "feedback-install": "בעיות בהתקנת Outline", + "feedback-label": "המשוב שלך", + "feedback-management": "בעיות בניהול השרת", + "feedback-other": "אחר", + "feedback-privacy": "המשוב, כתובת האימייל שלך (אם תצורף) ושאר המידע שמפורט ב{openLink}מדיניות הפרטיות{closeLink} יישלחו לצוות של Outline.", + "feedback-submit": "שליחה", + "feedback-suggestion": "הצעות", + "feedback-title-generic": "שליחת משוב", + "feedback-title-install": "השרת של Outline לא הותקן", + "gcp-billing-action": "לשלב הבא", + "gcp-billing-body": "מחכים לראות ש{openLink}הוספת חשבון לחיוב ב-Google Cloud{closeLink}", + "gcp-billing-description": "כדי להמשיך, {openLink}יש לפתוח את דף החיובים ב-Cloud Console{closeLink} ולהוסיף חשבון.", + "gcp-billing-error": "לא ניתן לאחזר את נתוני החיוב", + "gcp-billing-error-zero": "כדי להמשיך, יש להוסיף חשבון לחיוב.", + "gcp-click-create": "לוחצים על \"Create\" [יצירה].", + "gcp-create-new-project": "{openLink}איך יוצרים פרויקט חדש ב-Google Cloud?{closeLink}", + "gcp-create-new-vm": "{openLink}איך יוצרים מופע חדש של VM?{closeLink}", + "gcp-create-project": "איך יוצרים פרויקט ב-Google Cloud?", + "gcp-create-server": "יצירת פרויקט ב-Google Cloud", + "gcp-create-vm": "איך יוצרים מופע של VM?", + "gcp-disconnect-account": "התנתקות מחשבון Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}מוסיפים כלל חדש לחומת האש{closeLink} בפרויקט ב-Compute Engine.", + "gcp-firewall-create-1": "כותבים \"outline\" בשדה \"Name\" [שם].", + "gcp-firewall-create-2": "כותבים \"outline\" בשדה \"Target tags\" [תגי יעד].", + "gcp-firewall-create-3": "כותבים \"'0.0.0.0/0\" בשדה \"Source IP ranges\" [טווחי כתובות IP של המקור].", + "gcp-firewall-create-4": "בקטע \"Protocols and ports\" [פרוטוקולים ויציאות] לוחצים על \"Allow all\" [אישור הכול].", + "gcp-name-your-project": "נותנים לפרויקט שם בשדה \"Project name\" [שם הפרויקט].", + "gcp-project-setup-error": "אירעה שגיאה בהגדרת הפרויקט שלך ב-Google Cloud", + "gcp-select-machine-type": "בהגדרה \"Machine Type\" [סוג המכונה] בוחרים את \"f1-micro\".", + "gcp-select-networking": "לוחצים על \"Management, security, disks, networking, sole tenancy\" [ניהול, אבטחה, דיסקים, רשתות, דייר יחיד] ואז על \"Networking\" [רשתות].", + "gcp-select-region": "בהגדרה \"Region\" [אזור] בוחרים אזור שקרוב למשתמשי השרת.", + "gcp-type-network-tag": "כותבים \"outline\" בשדה \"Network tags\" [תגי רשת].", + "gcp-type-outline-server": "כותבים \"outline-server\" בשדה \"Name\" [שם].", + "geo-amsterdam": "אמסטרדם", + "geo-bangalore": "בנגלור", + "geo-changhua-county": "מחוז צ'נגואה", + "geo-delhi": "דלהי", + "geo-eemshaven": "אמסהבן", + "geo-frankfurt": "פרנקפורט", + "geo-hamina": "האמינה", + "geo-hk": "הונג קונג", + "geo-iowa": "איווה", + "geo-jakarta": "ג'אקארטה", + "geo-jurong-west": "ג'ורונג ווסט", + "geo-las-vegas": "לאס וגאס", + "geo-london": "לונדון", + "geo-los-angeles": "לוס אנג'לס", + "geo-melbourne": "מלבורן", + "geo-montreal": "מונטריאול", + "geo-mumbai": "מומבאי", + "geo-new-york-city": "ניו יורק", + "geo-northern-virginia": "צפון וירג'יניה", + "geo-oregon": "אורגון", + "geo-osaka": "אוסקה", + "geo-salt-lake-city": "סולט לייק סיטי", + "geo-san-francisco": "סן פרנסיסקו", + "geo-sao-paulo": "סאו פאולו", + "geo-seoul": "סיאול", + "geo-sg": "סינגפור", + "geo-south-carolina": "דרום קרוליינה", + "geo-st-ghislain": "סאן גילאן", + "geo-sydney": "סידני", + "geo-tokyo": "טוקיו", + "geo-toronto": "טורונטו", + "geo-warsaw": "ורשה", + "geo-zurich": "ציריך", + "key": "מפתח {keyId}", + "manual-server-assign-firewall": "הגדרת כלל לחומת האש", + "manual-server-assign-group": "הקצאת קבוצת אבטחה", + "manual-server-create-firewall": "יצירת כלל לחומת האש", + "manual-server-create-group": "יצירה של קבוצת אבטחה", + "manual-server-description": "ההוראות האלה יעזרו לך להתקין את Outline בשרת Linux של {cloudProvider}.", + "manual-server-firewall": "הגדרה של חומת האש", + "manual-server-install-paste": "מדביקים כאן את פלט ההתקנה.", + "manual-server-install-run": "צריך להיכנס לשרת ולהריץ את הפקודה הזו.", + "manual-server-instructions": "הוראות", + "manual-server-show-me": "לפתיחת מסוף הניהול", + "manual-server-title": "ממשיכים לפי ההוראות הבאות", + "metrics-description": "רוצה לשתף מדדים אנונימיים כדי לעזור לנו לשפר את את האמינות והביצועים של Outline, למענך ולמען כל מי ששיתפת איתו את השרת? {openLink}למידע נוסף{closeLink}.", + "metrics-share": "שיתוף מדדים", + "metrics-skip": "דילוג", + "metrics-title": "שיתוף מדדים", + "nav-about": "מידע כללי", + "nav-data-collection": "איסוף נתונים", + "nav-feedback": "משוב", + "nav-help": "עזרה", + "nav-licenses": "רישיונות", + "nav-privacy": "פרטיות", + "nav-terms": "תנאים", + "no-data-limit": "ללא", + "notification-app-update": "הורדנו למכשיר שלך גרסה חדשה של מנהל Outline. היא תותקן כשהאפליקציה תופעל מחדש.", + "notification-feedback-thanks": "תודה על כך שעזרת לנו להשתפר! אנחנו תמיד שמחים לקבל משוב.", + "notification-key-added": "המפתח נוסף", + "notification-key-removed": "המפתח הוסר", + "notification-server-destroyed": "השרת נמחק", + "notification-server-exists": "כבר הוספת את השרת", + "notification-server-removed": "השרת הוסר", + "oauth-account-active": "החשבון שלך ב-DigitalOcean הופעל.", + "oauth-account-active-tag": "החשבון הופעל! מיקומי השרתים מיד ייטענו...", + "oauth-activate-account": "צריך להפעיל את החשבון ב-DigitalOcean.", + "oauth-billing": "מזינים את נתוני החיוב ב-digitalocean.com וחוזרים לאפליקציה כשמסיימים.", + "oauth-billing-tag": "צריך להזין את נתוני החיוב...", + "oauth-connect-description": "אם ל-Outline תהיה גישה לחשבון שלך, יהיה לך קל ליצור שרת ולהתחבר.", + "oauth-connect-tag": "אנחנו ממתינים לחיבור החשבון...", + "oauth-connect-title": "יש לך חשבון ב-DigitalOcean? אפשר להיכנס אליו. אם אין לך, אפשר ליצור אחד.", + "oauth-sign-out": "יציאה", + "oauth-verify": "מחפשים בתיבת הדואר הנכנס אימייל מ-DigitalOcean ולוחצים על הקישור כדי לאמת את החשבון.", + "oauth-verify-tag": "צריך לאמת את כתובת האימייל שלך...", + "okay": "אישור", + "per-key-data-limit-dialog-set-custom": "הגדרה של מגבלת נתונים בהתאמה אישית", + "per-key-data-limit-dialog-title": "מגבלת נתונים – {keyName}", + "region-best-value": "התמורה המשתלמת ביותר", + "region-description": "מכאן יגיע החיבור שלך לאינטרנט.", + "region-setup": "התקנת Outline", + "region-title": "צריך לבחור את המיקום של השרת.", + "remove": "הסרה", + "retry": "אני רוצה לנסות שוב", + "save": "שמירה", + "saved": "השמירה בוצעה", + "saving": "השמירה מתבצעת...", + "server-access": "מפתחות גישה לשרת", + "server-access-key-new": "הוספת מפתח חדש", + "server-access-key-rename": "שינוי השם", + "server-access-keys": "מפתחות גישה", + "server-connections": "חיבורים", + "server-data-transfer": "כמות הנתונים שהועברו ב-30 הימים האחרונים", + "server-data-used": "אחוז הניצול ב-30 הימים האחרונים", + "server-destroy": "מחיקת השרת", + "server-help-access-key-description": "הידעת שאפשר לשתף את מפתחות הגישה עם חברים כדי שהם יוכלו להתחבר לשרת שלך ב-Outline? הם יוכלו להשתמש באותו מפתח גישה בכל המכשירים שלהם.", + "server-help-access-key-next": "הבא", + "server-help-access-key-title": "יצירת מפתחות, שיתוף הגישה", + "server-help-connection-description": "אפשר ללחוץ כאן כדי להתקין את אפליקציית הלקוח של Outline ולהשתמש במפתח הגישה האישי לשרת שלך ב-Outline.", + "server-help-connection-ok": "אוקיי, הבנתי!", + "server-help-connection-title": "עוד לא התחברת!", + "server-keys": "מפתחות", + "server-my-access-key": "מפתח הגישה שלי", + "server-name": "שרת Outline, {serverLocation}", + "server-remove": "הסרת השרת", + "server-settings": "הגדרות", + "server-unreachable": "השרת לא זמין", + "server-unreachable-description": "לא הצלחנו להתחבר לשרת הזה.", + "server-unreachable-managed-description": "אפשר לנסות שוב או להסיר את השרת הזה מהאפליקציה.", + "server-unreachable-manual-description": "אפשר לנסות שוב או למחוק את השרת הזה והמארח הווירטואלי.", + "server-usage": "שימוש (30 ימים אחרונים)", + "servers-add": "הוספת שרת", + "servers-digitalocean": "שרתי DigitalOcean", + "servers-gcp": "שרתי Google Cloud Platform", + "servers-manual": "שרתים", + "settings-access-key-port": "יציאה למפתחות גישה חדשים", + "settings-metrics-header": "שיתוף מדדים אנונימיים", + "settings-server-api-url": "כתובת ה-URL של ה-API לניהול", + "settings-server-cost": "מחיר לחודש", + "settings-server-creation": "תאריך יצירה", + "settings-server-hostname": "שם מארח", + "settings-server-id": "מזהה השרת", + "settings-server-info": "פרטי השרת", + "settings-server-location": "מיקום השרת", + "settings-server-name": "שם", + "settings-server-rename": "אפשר לבחור שם חדש לשרת. השם הזה לא ישתנה במכשירים של המשתמשים שהזמנת להתחבר אליו.", + "settings-server-version": "גרסת השרת", + "settings-transfer-limit": "מכסה להעברת נתונים", + "setup-action": "התקנה", + "setup-advanced": "מתקדמות", + "setup-anywhere": "אפשר להתקין את Outline בכל מקום", + "setup-cancel": "ביטול מתי שרוצים", + "setup-create": "יצירת שרת", + "setup-description": "אין לך שרת? אפשר ליצור חשבון ב-DigitalOcean.", + "setup-do-cost": "רק $6 לחודש", + "setup-do-create": "אפשר ליצור שרת חדש בחשבון שלך ב-DigitalOcean תמורת $6 נוספים ל-30 יום ולקבל מכסה של 1TB להעברת נתונים.", + "setup-do-data": "מכסה של 1TB להעברת נתונים", + "setup-do-description": "הפעולה הזו עשויה להימשך כמה דקות. אפשר למחוק את השרת הזה מתי שרוצים.", + "setup-do-easiest": "תהליך התקנה קל", + "setup-do-title": "רק רגע, אנחנו מתקינים את Outline.", + "setup-firewall-instructions": "הוראות להגדרה של חומת האש", + "setup-gcp-create": "יצירת שרת חדש עם החשבון שלך ב-Google. העלויות משתנות בהתאם למיקום ולשימוש.", + "setup-gcp-easy": "תהליך התקנה קל", + "setup-gcp-free-tier": "ב{openLinkFreeTier}תוכנית ללא תשלום{closeLink}, השרת הראשון עולה החל מ-{openLinkIpPrice}3 דולר ארה\"ב לחודש{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}תקופת ניסיון בחינם ל-90 יום{closeLink} למשתמשים חדשים", + "setup-gcp-promo": "כדאי לנסות את תהליך היצירה האוטומטי החדש של שרת Outline ל-Google Cloud", + "setup-recommended": "מומלץ", + "setup-simple-commands": "פקודות התקנה פשוטות", + "setup-step-by-step": "מדריך מפורט", + "setup-tested": "האפליקציה נבדקה ב-VULTR,‏ Linode ו-Liquid Web", + "setup-title": "צריך לבחור ספק שירותי ענן שבו השרת של Outline יותקן.", + "share-description": "פשוט מעתיקים את ההזמנה הזו ושולחים אותה מכלי תקשורת שסומכים עליו. {openLink}לא הסתדרת?{closeLink}", + "share-invite-access-key-copied": "מפתח הגישה הועתק ללוח", + "share-invite-copied": "ההזמנה הועתקה ללוח", + "share-invite-copy": "העתקת ההזמנה", + "share-invite-copy-access-key": "העתקת מפתח הגישה", + "share-invite-html": "אפשר להשתמש בשרת הזה כדי לגשת בבטחה לאינטרנט הפתוח:

1) מורידים ומתקינים את אפליקציית Outline למכשיר:

– iOS:‏ https://itunes.apple.com/app/outline-app/id1356177741‏
– MacOS:‏ https://itunes.apple.com/app/outline-app/id1356178125‏
– Windows:‏ https://s3.amazonaws.com/outlinereleases/client/windows/stable/Outline-Client.exe‏
– Linux:‏ https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage‏
– Android:‏ https://play.google.com/store/apps/details?id=org.outline.android.client‏
– קישור חלופי ל-Android:‏ https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.APK‏

2) יישלח אליך מפתח גישה שמתחיל ב-ss://‎. אחרי שמקבלים את מפתח הגישה, מעתיקים אותו.

3) פותחים את אפליקציית הלקוח של Outline. אם מפתח הגישה מזוהה באופן אוטומטי, מקישים על 'התחברות' וממשיכים. אם מפתח הגישה לא מזוהה באופן אוטומטי, מדביקים אותו בשדה, מקישים על 'התחברות' וממשיכים.

הכול מוכן לשימוש באינטרנט הפתוח! כדי לוודא שהתחברת בהצלחה לשרת, כדאי לנסות לחפש \"מהי כתובת ה-IP שלי\" בחיפוש Google. כתובת ה-IP שמוצגת ב-Google צריכה להיות תואמת לכתובת ה-IP באפליקציית הלקוח של Outline.

מידע נוסף על Outline זמין כאן: https://getoutline.org/‎", + "share-invite-instructions": "פועלים לפי הוראות ההזמנה שלנו ב-GitHub:", + "share-invite-trouble": "לא הצלחת להתחבר לשרת דרך קישור ההזמנה?", + "share-title": "שיתוף הגישה", + "survey-data-limits-title": "נשמח להבין איך נוכל לשפר את מגבלות הנתונים", + "survey-decline": "אני לא רוצה לענות", + "survey-disclaimer": "לחיצה על 'למענה על הסקר' תוביל אותך לסקר קצר ב-Google Forms. מומלץ לענות על הסקר בזמן שמחוברים ל-Outline.", + "survey-go-to-survey": "למענה על הסקר", + "terms-of-service": "קראתי והבנתי את {openLink}התנאים וההגבלות של Outline{closeLink}" +} diff --git a/server_manager/messages/hi.json b/server_manager/messages/hi.json new file mode 100644 index 0000000000..7fcb280861 --- /dev/null +++ b/server_manager/messages/hi.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline, Jigsaw का एक 'ओपन सोर्स प्रोजेक्ट' है, जो समाचार संगठनों और पत्रकारों को इंटरनेट ऐक्सेस करने के लिए सुरक्षित तरीका देता है.

Outline, Shadowsocks से चलता है और अब भी शुरुआती चरण का प्रॉडक्ट है. आप GitHub पर कोड में योगदान कर सकते हैं और आप हमारी तरफ से ज़्यादा प्लैटफ़ॉर्म बढ़ाने और नई सुविधाएं जोड़ने के बारे में जानने के लिए Reddit और Medium पर हमें फ़ॉलो कर सकते हैं.", + "about-version": "वर्शन {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} की इंस्टेंस स्क्रीन पर जाएं.", + "aws-lightsail-firewall-1": "उस इंस्टेंस पर क्लिक करें जिस पर आप Outline को होस्ट करना चाहते हैं.", + "aws-lightsail-firewall-2": "'नेटवर्किंग (Networking)' टैब पर जाएं.", + "aws-lightsail-firewall-3": "'फ़ायरवॉल (Firewall)' सेक्शन में, 'दूसरा जोड़ें (Add another)' पर क्लिक करें.", + "aws-lightsail-firewall-4": "'सभी टीसीपी + यूडीपी (All TCP + UDP)' में 'ऐप्लिकेशन (Application)' का मान सेट करें.", + "aws-lightsail-firewall-5": "'सेव करें (Save)' पर क्लिक करें.", + "cancel": "रद्द करें", + "close": "बंद करें", + "confirmation-server-destroy": "मौजूदा उपयोगकर्ता ऐक्सेस खो देंगे. इस कार्रवाई को पहले जैसा नहीं किया जा सकता.", + "confirmation-server-destroy-title": "सर्वर मिटाएं?", + "confirmation-server-remove": "इस कार्रवाई से Outline Manager से आपका सर्वर हट जाएगा, लेकिन इस्तेमाल करने वालों के लिए प्रॉक्सी का ऐक्सेस ब्लॉक नहीं होगा. आपको अब भी अपनी होस्ट मशीन से Outline सर्वर मिटाना होगा.", + "confirmation-server-remove-title": "सर्वर हटाएं?", + "data-limit": "डेटा ट्रांसफ़र करने की सीमा", + "data-limit-per-key": "हर ऐक्सेस कुंजी के लिए, डेटा ट्रांसफ़र करने की सीमा", + "data-limits": "डेटा ट्रांसफ़र करने की सीमा", + "data-limits-description": "इस सर्वर पर ऐक्सेस कुंजियों के लिए, डेटा ट्रांसफ़र करने की सीमा 30 दिन के लिए सेट करें.", + "data-limits-dialog-text": "इस सर्वर पर ऐक्सेस कुंजियों के लिए, डेटा ट्रांसफ़र करने की सीमा सेट करने के लिए 'सेटिंग' टैब पर जाएं.", + "data-limits-dialog-title": "ज़्यादा डेटा खर्च करने से बचें", + "data-limits-disclaimer": "फ़िलहाल, आप मेट्रिक की जानकारी भेज रहे हैं. इसलिए, इसमें डेटा सीमा की सुविधा के इस्तेमाल की जानकारी भी शामिल की जाएगी. ज़्यादा जानकारी के लिए, कृपया {openLink}डेटा इकट्ठा करने की नीति{closeLink} देखें.", + "data-limits-usage": "{total} में से {used} का इस्तेमाल किया गया", + "destroy": "मिटाएं", + "digitalocean-disconnect-account": "DigitalOcean खाते से डिसकनेक्ट करें", + "digitalocean-unreachable": "यह गड़बड़ी आपके नेटवर्क पर फ़ायरवॉल या digitalocean.com में कभी-कभी होने वाली कनेक्टिविटी की समस्याओं की वजह से हो सकती है.", + "disabled": "बंद करें", + "disconnect": "डिसकनेक्ट करें", + "done": "हो गया", + "enabled": "चालू करें", + "error-connectivity": "हमें आपके DigitalOcean सर्वर से कनेक्ट करने में समस्या आ रही है. DigitalOcean या आपके इंटरनेट कनेक्शन में कुछ देर के लिए होने वाली समस्या की वजह से कभी-कभी ऐसा होता है. अगर दोबारा कोशिश करने से काम नहीं बनता है, तो DigitalOcean में लॉग इन करने से समस्या ठीक हो सकती है.", + "error-connectivity-title": "कनेक्शन की समस्या", + "error-do-account-info": "DigitalOcean खाते की जानकारी नहीं मिल सकी", + "error-do-auth": "DigitalOcean के साथ पुष्टि नहीं की जा सकी", + "error-do-limit": "आपके DigitalOcean खाते में {num} से ज़्यादा ड्रॉपलेट नहीं हो सकते. इस लिंक पर अनुरोध करके ज़्यादा ड्रॉपलेट बनाएं: https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "उपलब्ध क्षेत्रों की सूची नहीं मिली", + "error-do-warning": "DigitalOcean की चेतावनी: \"{message}\"", + "error-feedback": "सुझाव सबमिट नहीं किया जा सका. कृपया फिर से कोशिश करें.", + "error-gcp-auth": "Google Cloud Platform खाते के लिए, पुष्टि नहीं की जा सकी", + "error-hostname-invalid": "यह एक आईपी पता या मान्य होस्टनाम होना चाहिए.", + "error-key-add": "कुंजी नहीं जोड़ी जा सकी", + "error-key-remove": "कुंजी को हटाया नहीं जा सका", + "error-key-rename": "कुंजी का नाम नहीं बदला जा सका", + "error-keys-get": "कुंजियां लोड नहीं हो सकीं", + "error-keys-port-bad-input": "पोर्ट, 1 और 65,535 के बीच का कोई पूर्णांक होना चाहिए.", + "error-keys-port-in-use": "पोर्ट पहले से सर्वर पर इस्तेमाल किया जा रहा है.", + "error-licenses": "लाइसेंस लोड नहीं हो सके.", + "error-metrics": "मेट्रिक को चालू करते समय गड़बड़ी हुई", + "error-network": "इंटरनेट से कनेक्ट नहीं है.", + "error-not-saved": "सेव नहीं हुआ", + "error-remove-data-limit": "डेटा ट्रांसफ़र करने की डिफ़ॉल्ट सीमा बंद नहीं की जा सकी", + "error-remove-per-key-limit": "इस ऐक्सेस कुंजी से, डेटा ट्रांसफ़र करने की सीमा नहीं हटाई जा सकी", + "error-server-creation": "आपका Outline सर्वर बनाने में कोई गड़बड़ी हुई.", + "error-server-destroy": "सर्वर को मिटाया नहीं जा सका", + "error-server-removed": "{serverName} अब आपके DigitalOcean खाते में मौजूद नहीं है.", + "error-server-rename": "सर्वर का नाम नहीं बदला जा सका", + "error-server-unreachable": "आपका Outline सर्वर ठीक से इंस्टॉल हो गया था, लेकिन हम उससे कनेक्ट नहीं हो सके. इस बात की ज़्यादा संभावना है कि आपके सर्वर के फ़ायरवॉल नियम, आने वाले कनेक्शन ब्लॉक कर रहे हों. कृपया नियमों को देखें और 1024 से 65535 तक के पोर्ट पर आने वाले टीसीपी कनेक्शन की अनुमति दें.", + "error-server-unreachable-title": "आपके Outline सर्वर से कनेक्ट नहीं हो सका", + "error-servers-removed": "{serverNames} अब आपके DigitalOcean खाते में मौजूद नहीं है.", + "error-set-data-limit": "डेटा ट्रांसफ़र करने की डिफ़ॉल्ट सीमा सेट नहीं की जा सकी", + "error-set-per-key-limit": "इस ऐक्सेस कुंजी के लिए, डेटा ट्रांसफ़र करने की सीमा सेट नहीं की जा सकी", + "error-unexpected": "अचानक कोई गड़बड़ी हुई.", + "experimental": "अभी आज़माया जा रहा है", + "experiments": "प्रयोग", + "experiments-description": "नई सुविधाएं जांचें और उनके रिलीज़ होने से पहले हमें अपने सुझाव दें.", + "experiments-disclaimer": "ऐप्लिकेशन की सुविधाओं पर अभी काम चल रहा है. ऐसा हो सकता है कि इनमें बदलाव कर दिया जाए या ऐप्लिकेशन में से हटा दिया जाए. अगर आप मेट्रिक की जानकारी अभी दे रहे हैं, तो उन सुविधाओं के इस्तेमाल को शामिल किया जाएगा जिन पर काम चल रहा है. कृपया ज़्यादा जानकारी के लिए, {openLink}डेटा इकट्ठा करने की नीति{closeLink} देखें.", + "experiments-feedback": "क्या आपके पास कोई सुझाव है? {openLink}यहां सुझाव सबमिट करें.{closeLink}", + "feedback-cloud-provider": "क्लाउड सेवा देने वाली कंपनी चुनें", + "feedback-cloud-provider-error": "क्लाउड सेवा देने वाली कंपनी चुनें.", + "feedback-connection": "मेरे सर्वर से कनेक्ट नहीं हो पा रहा है", + "feedback-connection-others": "दूसरे उपयोगकर्ता मेरे सर्वर से कनेक्ट नहीं हो पा रहे हैं", + "feedback-disclaimer": "कृपया ध्यान दें कि हमारी टीम केवल अंग्रेज़ी में जवाब दे सकती है.", + "feedback-email": "ईमेल पता (वैकल्पिक)", + "feedback-error": "कृपया सुझाव या शिकायत दर्ज करें.", + "feedback-explanation-install": "आपके सर्वर पर Outline इंस्टॉल करते समय कोई गड़बड़ी हुई. अगर आपको कोई समाधान नहीं मिला है, तो कृपया हमें सुझाव या शिकायत भेजें और हमें अपना ईमेल पता (ज़रूरी नहीं) बताएं ताकि हम आपसे संपर्क कर सकें.", + "feedback-general": "सामान्य सुझाव", + "feedback-install": "Outline इंस्टॉल करने में कठिनाई आ रही है", + "feedback-label": "आपका सुझाव", + "feedback-management": "मेरे सर्वर के प्रबंधन में कठिनाई आ रही है", + "feedback-other": "सेवा देने वाली दूसरी कंपनियां", + "feedback-privacy": "आपकी शिकायत या सुझाव, ईमेल पता (अगर उपलब्ध है), और {openLink}निजता नीति{closeLink} में दी गई ज़्यादा जानकारी को Outline टीम को भेजा जाएगा.", + "feedback-submit": "सबमिट करें", + "feedback-suggestion": "सुझाव", + "feedback-title-generic": "शिकायत या सुझाव भेजें", + "feedback-title-install": "Outline सर्वर इंस्टॉल नहीं किया जा सका", + "gcp-billing-action": "आगे बढ़ें", + "gcp-billing-body": "कृपया {openLink}Google Cloud पर कोई बिलिंग खाता जोड़ें{closeLink}", + "gcp-billing-description": "जारी रखने के लिए, {openLink}Cloud Console का बिलिंग पेज खोलें{closeLink}. इसके बाद, कोई खाता जोड़ें.", + "gcp-billing-error": "बिलिंग की जानकारी दिखाई नहीं जा सकी", + "gcp-billing-error-zero": "जारी रखने के लिए, आपको कोई बिलिंग खाता जोड़ना होगा.", + "gcp-click-create": "'बनाएं (Create)' पर क्लिक करें.", + "gcp-create-new-project": "{openLink}नया 'Google क्लाउड' प्रोजेक्ट बनाएं{closeLink}.", + "gcp-create-new-vm": "{openLink}नया VM इंस्टेंस बनाएं{closeLink}.", + "gcp-create-project": "नया 'Google क्लाउड' प्रोजेक्ट बनाएं", + "gcp-create-server": "नया 'Google क्लाउड' प्रोजेक्ट बनाएं", + "gcp-create-vm": "VM इंस्टेंस बनाएं", + "gcp-disconnect-account": "Google Cloud Platform खाते को डिसकनेक्ट करें", + "gcp-firewall-create-0": "अपने Compute Engine प्रोजेक्ट में {openLink}नया फ़ायरवॉल नियम जोड़ें{closeLink}.", + "gcp-firewall-create-1": "'नाम (Name)' फ़ील्ड में 'outline' लिखें.", + "gcp-firewall-create-2": "'टारगेट टैग (Target tags)' फ़ील्ड में 'outline' टाइप करें", + "gcp-firewall-create-3": "'स्रोत आईपी सीमा (Source IP ranges)' फ़ील्ड में '0.0.0.0/0' लिखें.", + "gcp-firewall-create-4": "'प्रोटोकॉल और पोर्ट (Protocols and ports)' में जाकर 'सभी की अनुमति दें ('Allow all)' चुनें.", + "gcp-name-your-project": "'प्रोजेक्ट के नाम (Project name)' फ़ील्ड में अपने प्रोजेक्ट का नाम लिखें.", + "gcp-project-setup-error": "Google Cloud प्रोजेक्ट को सेट अप करने के दौरान, कोई गड़बड़ी हुई", + "gcp-select-machine-type": "'मशीन किस तरह की है (Machine type)' में 'f1-micro' चुनें", + "gcp-select-networking": "पहले 'मैनेजमेंट, सिक्योरिटी, डिस्क, नेटवर्किंग, सोल टेनेंसी (Management, security, disks, networking, sole tenancy)' पर क्लिक करें. उसके बाद 'नेटवर्किंग (Networking)' पर क्लिक करें", + "gcp-select-region": "सर्वर को इस्तेमाल करने वाले के आस-पास का इलाका चुनें, जो 'इलाके (region)' में आएगा.", + "gcp-type-network-tag": "'नेटवर्क टैग (Network tags)' फ़ील्ड में 'आउटलाइन' टाइप करें", + "gcp-type-outline-server": "'नाम (Name)' फ़ील्ड में 'आउटलाइन-सर्वर' लिखें.", + "geo-amsterdam": "एम्स्टर्डम", + "geo-bangalore": "बेंगलुरु", + "geo-changhua-county": "चैंगुआ काउंटी", + "geo-delhi": "दिल्ली", + "geo-eemshaven": "एम्सहावन", + "geo-frankfurt": "फ़्रंकफ़र्ट", + "geo-hamina": "हामिना", + "geo-hk": "हॉन्ग कॉन्ग", + "geo-iowa": "आयोवा", + "geo-jakarta": "जकार्ता", + "geo-jurong-west": "जिरॉन्ग वेस्ट", + "geo-las-vegas": "लास वेगस", + "geo-london": "लंदन", + "geo-los-angeles": "लॉस ऐंजेलिस", + "geo-melbourne": "मेलबर्न", + "geo-montreal": "मॉन्ट्रियॉल", + "geo-mumbai": "मुंबई", + "geo-new-york-city": "न्यूयॉर्क", + "geo-northern-virginia": "नॉर्दर्न वर्जीनिया", + "geo-oregon": "ओरेगॉन", + "geo-osaka": "ओसाका", + "geo-salt-lake-city": "सॉल्ट लेक सिटी", + "geo-san-francisco": "सैन फ़्रैंसिस्को", + "geo-sao-paulo": "साओ पाओलो", + "geo-seoul": "सोल", + "geo-sg": "सिंगापुर", + "geo-south-carolina": "साउथ कैरोलाइना", + "geo-st-ghislain": "सेंट जिस्लेन", + "geo-sydney": "सिडनी", + "geo-tokyo": "टोक्यो", + "geo-toronto": "टोरोंटो", + "geo-warsaw": "वारसॉ", + "geo-zurich": "ज़्यूरिख", + "key": "{keyId} कुंजी", + "manual-server-assign-firewall": "फ़ायरवॉल नियम असाइन करें", + "manual-server-assign-group": "सुरक्षा ग्रुप असाइन करें", + "manual-server-create-firewall": "फ़ायरवॉल नियम बनाएं", + "manual-server-create-group": "सुरक्षा ग्रुप बनाएं", + "manual-server-description": "इन निर्देशों से आपको {cloudProvider} Linux सर्वर पर Outline इंस्टॉल करने में मदद मिलेगी.", + "manual-server-firewall": "अपना फ़ायरवॉल कॉन्फ़िगर करें", + "manual-server-install-paste": "अपना इंस्टॉलेशन आउटपुट यहां चिपकाएं.", + "manual-server-install-run": "अपने सर्वर में लॉग इन करें और इस कमांड को चलाएं.", + "manual-server-instructions": "निर्देश", + "manual-server-show-me": "मुझे जगह की जानकारी दें", + "manual-server-title": "नीचे दिए गए निर्देशों का पालन करें", + "metrics-description": "पहचान ज़ाहिर न करने वाली मेट्रिक शेयर करें. इससे आपके लिए और जिनसे आप सर्वर शेयर करते हैं उनके लिए, Outline को ज़्यादा भरोसेमंद और बेहतर बनाने में मदद मिलती है. {openLink}ज़्यादा जानें.{closeLink}", + "metrics-share": "मेट्रिक शेयर करें", + "metrics-skip": "अभी नहीं", + "metrics-title": "मेट्रिक शेयर करना", + "nav-about": "परिचय", + "nav-data-collection": "डेटा संग्रह", + "nav-feedback": "सुझाव/राय दें या शिकायत करें", + "nav-help": "सहायता", + "nav-licenses": "लाइसेंस", + "nav-privacy": "निजता", + "nav-terms": "शर्तें", + "no-data-limit": "कोई सीमा नहीं", + "notification-app-update": "Outline Manager का एक अपडेट किया वर्शन डाउनलोड किया गया है. ऐप्लिकेशन को रीस्टार्ट करने पर यह इंस्टॉल हो जाएगा.", + "notification-feedback-thanks": "हमें बेहतर बनाने में मदद करने के लिए धन्यवाद! हमें आपसे जुड़े रहना अच्छा लगता है.", + "notification-key-added": "कुंजी जोड़ दी गई", + "notification-key-removed": "कुंजी हटा दी गई", + "notification-server-destroyed": "सर्वर मिटा दिया गया", + "notification-server-exists": "सर्वर को पहले ही जोड़ दिया गया है", + "notification-server-removed": "सर्वर हटा दिया गया", + "oauth-account-active": "आपका DigitalOcean खाता चालू कर दिया गया है.", + "oauth-account-active-tag": "खाता चालू किया गया! सर्वर की जगहें लोड हो रही हैं...", + "oauth-activate-account": "अपना DigitalOcean खाता चालू करें.", + "oauth-billing": "digitalocean.com पर अपनी बिलिंग की जानकारी दर्ज करें और काम पूरा होने के बाद ऐप्लिकेशन पर वापस आएं.", + "oauth-billing-tag": "बिलिंग की जानकारी दर्ज करें...", + "oauth-connect-description": "अपने खाते के साथ, Outline की सहायता से सर्वर बनाना और कनेक्ट करना आसान हो जाता है.", + "oauth-connect-tag": "आपके खाते से कनेक्ट होने का इंतज़ार कर रहा है...", + "oauth-connect-title": "DigitalOcean में साइन इन करें या खाता बनाएं.", + "oauth-sign-out": "साइन आउट करें", + "oauth-verify": "अपने इनबॉक्स में DigitalOcean का ईमेल देखें और खाते की पुष्टि करने के लिए, इसमें दिए गए लिंक पर क्लिक करें.", + "oauth-verify-tag": "अपने ईमेल की पुष्टि करें...", + "okay": "ठीक", + "per-key-data-limit-dialog-set-custom": "अपनी पसंद के मुताबिक, डेटा ट्रांसफ़र करने की सीमा सेट करें", + "per-key-data-limit-dialog-title": "डेटा ट्रांसफ़र करने की सीमा - {keyName}", + "region-best-value": "किफ़ायती प्लान", + "region-description": "यह वह जगह है जहां मौजूद सर्वर से आप इंटरनेट ऐक्सेस कर पाएंगे", + "region-setup": "Outline सेट अप करें", + "region-title": "अपने सर्वर की जगह चुनें.", + "remove": "हटाएं", + "retry": "फिर से कोशिश करें", + "save": "सेव करें", + "saved": "सेव हो गया", + "saving": "सेव किया जा रहा है...", + "server-access": "सर्वर का ऐक्सेस", + "server-access-key-new": "नई कुंजी जोड़ें", + "server-access-key-rename": "नाम बदलें", + "server-access-keys": "ऐक्सेस कुंजियां", + "server-connections": "कनेक्शन", + "server-data-transfer": "ट्रांसफ़र किया गया डेटा / पिछले 30 दिनों में", + "server-data-used": "इस्तेमाल किया गया कुल डेटा / पिछले 30 दिनों में", + "server-destroy": "सर्वर मिटाएं", + "server-help-access-key-description": "दोस्तों के साथ ऐक्सेस कुंजियां शेयर करें, ताकि वे आपके आउटलाइन सर्वर से कनेक्ट हो सकें. वे अपने सभी डिवाइस पर उसी ऐक्सेस कुंजी का इस्तेमाल कर सकते हैं.", + "server-help-access-key-next": "आगे बढ़ें", + "server-help-access-key-title": "कुंजियां बनाएं और ऐक्सेस शेयर करें", + "server-help-connection-description": "अपने Outline सर्वर की निजी ऐक्सेस कुंजी का इस्तेमाल करके, Outline क्लाइंट ऐप्लिकेशन इंस्टॉल करने के लिए यहां क्लिक करें.", + "server-help-connection-ok": "ठीक है, समझ लिया!", + "server-help-connection-title": "आप अभी तक कनेक्ट नहीं हैं!", + "server-keys": "कुंजियां", + "server-my-access-key": "मेरी ऐक्सेस कुंजी", + "server-name": "Outline सर्वर {serverLocation}", + "server-remove": "सर्वर मिटाएं", + "server-settings": "सेटिंग", + "server-unreachable": "सर्वर से संपर्क नहीं हो पा रहा है", + "server-unreachable-description": "हमें इस सर्वर से कनेक्ट करने में समस्या आ रही है.", + "server-unreachable-managed-description": "फिर से कोशिश करें या ऐप्लिकेशन से इस सर्वर को हटा दें.", + "server-unreachable-manual-description": "फिर से कोशिश करें या इस सर्वर और वर्चुअल होस्ट को मिटा दें.", + "server-usage": "इस्तेमाल की जानकारी (पिछले 30 दिनों में)", + "servers-add": "सर्वर जोड़ें", + "servers-digitalocean": "DigitalOcean सर्वर", + "servers-gcp": "Google Cloud Platform के सर्वर", + "servers-manual": "सर्वर", + "settings-access-key-port": "नई सर्वर कुंजियों के लिए पोर्ट करें", + "settings-metrics-header": "पहचान ज़ाहिर न करने वाली मेट्रिक शेयर करें", + "settings-server-api-url": "प्रबंधन एपीआई यूआरएल", + "settings-server-cost": "एक महीने का शुल्क", + "settings-server-creation": "बनाने की तारीख", + "settings-server-hostname": "होस्टनाम", + "settings-server-id": "सर्वर आईडी", + "settings-server-info": "सर्वर की जानकारी", + "settings-server-location": "सर्वर की जगह", + "settings-server-name": "नाम", + "settings-server-rename": "अपने सर्वर का नया नाम सेट करें. ध्यान दें कि यह उन उपयोगकर्ताओं के डिवाइस पर दिखाई नहीं देगा जिन्हें आपने इससे कनेक्ट होने का न्योता दिया था.", + "settings-server-version": "सर्वर का वर्शन", + "settings-transfer-limit": "डेटा ट्रांसफ़र करने की सुविधा", + "setup-action": "सेट अप करें", + "setup-advanced": "बेहतर", + "setup-anywhere": "Outline को कहीं भी सेट अप करें", + "setup-cancel": "किसी भी समय रद्द करें", + "setup-create": "सर्वर बनाएं", + "setup-description": "सर्वर नहीं है? DigitalOcean के साथ खाता बनाएं.", + "setup-do-cost": "हर महीने सिर्फ़ छह डॉलर", + "setup-do-create": "अपने DigitalOcean खाते का इस्तेमाल करके नया सर्वर बनाएं. इसमें आपको हर महीने छह डॉलर ज़्यादा देकर, 1 TB डेटा ट्रांसफ़र करने की सुविधा मिलती है.", + "setup-do-data": "1 TB डेटा ट्रांसफ़र करने की सुविधा", + "setup-do-description": "इस प्रोसेस को पूरा होना में कुछ मिनट लग सकते हैं. आप इस सर्वर को किसी भी समय बंद कर सकते हैं.", + "setup-do-easiest": "सेट अप करने की आसान प्रक्रिया", + "setup-do-title": "Outline सेट अप हो रहा है.", + "setup-firewall-instructions": "फ़ायरवॉल से जुड़े निर्देश", + "setup-gcp-create": "अपने Google खाते का इस्तेमाल करके नया सर्वर बनाएं. जगह और इस्तेमाल के हिसाब से कीमतें बदल सकती हैं.", + "setup-gcp-easy": "सेट अप करने की आसान प्रक्रिया", + "setup-gcp-free-tier": "{openLinkFreeTier}फ़्री टियर{closeLink} प्लान के हिसाब से, आपको अपने पहले सर्वर के इस्तेमाल के लिए, {openLinkIpPrice}हर महीने 3 डॉलर{closeLink} देने होंगे", + "setup-gcp-free-trial": "नए उपयोगकर्ताओं के लिए, {openLinkFreeTrial}90 दिनों तक मुफ़्त में सर्वर इस्तेमाल करने की सुविधा{closeLink}", + "setup-gcp-promo": "Google Cloud के लिए, Outline सर्वर बनाने की अपने-आप होने वाली नई प्रोसेस आज़माएं", + "setup-recommended": "सुझाए गए", + "setup-simple-commands": "इंस्टॉल करने के सामान्य निर्देश", + "setup-step-by-step": "सिलसिलेवार निर्देश वाली सेट अप गाइड", + "setup-tested": "VULTR, Linode, और Liquid Web पर जांच की गई", + "setup-title": "Outline सेट अप करने के लिए कोई क्लाउड सेवा चुनें.", + "share-description": "इस न्योते को कॉपी करें और इसे अपनी सबसे भरोसेमंद संचार सुविधा के ज़रिए भेज दें. {openLink}सहायता चाहिए?{closeLink}", + "share-invite-access-key-copied": "ऐक्सेस कुंजी को क्लिपबोर्ड पर कॉपी किया गया", + "share-invite-copied": "न्योते को क्लिपबोर्ड पर कॉपी किया गया", + "share-invite-copy": "न्योता कॉपी करें", + "share-invite-copy-access-key": "ऐक्सेस कुंजी कॉपी करें", + "share-invite-html": "ओपन इंटरनेट को सुरक्षित तरीके से ऐक्सेस करने के लिए, यह सर्वर इस्तेमाल करें:

1) अपने डिवाइस पर Outline ऐप्लिकेशन डाउनलोड और इंस्टॉल करें. इसके लिए, इनमें से किसी लिंक का इस्तेमाल करें:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android के लिए दूसरा लिंक: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) आपको ss:// से शुरू होने वाली ऐक्सेस कुंजी मिलेगी. कुंजी मिलने के बाद, उसे कॉपी करें.

3) Outline क्लाइंट ऐप्लिकेशन खोलें. अगर आपकी ऐक्सेस कुंजी अपने-आप पहचानी जाती है, तो \"कनेक्ट करें\" पर टैप करें और फिर आगे बढ़ें. अगर आपकी ऐक्सेस कुंजी अपने-आप नहीं पहचानी जाती, तो उसे फ़ील्ड में चिपकाएं. इसके बाद, \"कनेक्ट करें\" पर टैप करें और फिर आगे बढ़ें.

अब ओपन इंटरनेट का इस्तेमाल किया जा सकता है! यह पक्का करने के लिए कि आपने सर्वर से कनेक्ट कर लिया है, Google Search पर \"मेरा आईपी पता क्या है\" खोजें. खोज के नतीजे में दिखाया गया आईपी पता, Outline क्लाइंट में मौजूद आईपी पते से मेल खाना चाहिए.

यहां Outline के बारे में ज़्यादा जानें: https://getoutline.org/", + "share-invite-instructions": "GitHub पर हमारे न्योते के निर्देशों का पालन करें:", + "share-invite-trouble": "न्योते के लिंक को ऐक्सेस करने में कठिनाई आ रही है?", + "share-title": "ऐक्सेस शेयर करें", + "survey-data-limits-title": "डेटा सीमा को बेहतर बनाने में हमारी मदद करें", + "survey-decline": "अस्वीकार करें", + "survey-disclaimer": "अगर आप 'जारी रखें' पर क्लिक करेंगे, आपको Google Forms पर छोटा सा सर्वे दिखेगा. हमारा सुझाव है कि Outline से कनेक्ट होने पर सर्वे को पूरा करें.", + "survey-go-to-survey": "सर्वे पर जाएं", + "terms-of-service": "मैंने {openLink}Outline सेवा की शर्तें{closeLink} पढ़ और समझ ली हैं" +} diff --git a/server_manager/messages/hr.json b/server_manager/messages/hr.json new file mode 100644 index 0000000000..9ef79cb22e --- /dev/null +++ b/server_manager/messages/hr.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline je projekt otvorenog izvornog kôda koji je osmislila tvrtka Jigsaw radi pružanja sigurnijih načina pristupa internetu za novinske organizacije i novinare.

Outline omogućuje Shadowsocks i još je uvijek projekt u ranoj fazi. Kôdu možete pridonijeti na servisu GitHub, a možete nas pratiti i na servisima Reddit i Medium da biste čuli kada ćemo se proširiti na druge platforme i dodati nove značajke.", + "about-version": "Verzija {version}", + "aws-lightsail-firewall-0": "Otvorite zaslon instance {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Kliknite instancu na kojoj želite hostati Outline.", + "aws-lightsail-firewall-2": "Otvorite karticu \"Umrežavanje\" (Networking).", + "aws-lightsail-firewall-3": "U odjeljku \"Vatrozid\" (Firewall) kliknite \"Dodaj još jedno pravilo\" (Add another).", + "aws-lightsail-firewall-4": "Vrijednost \"Aplikacije\" (Application) postavite na \"All TCP+UDP\".", + "aws-lightsail-firewall-5": "Kliknite \"Spremi\" (Save).", + "cancel": "Odustani", + "close": "Zatvori", + "confirmation-server-destroy": "Postojeći korisnici izgubit će pristup. Ta se radnja ne može poništiti.", + "confirmation-server-destroy-title": "Želite li izbrisati poslužitelj?", + "confirmation-server-remove": "Ova radnja uklanja vaš poslužitelj iz upravitelja Outlinea, no ne blokira proxy pristup korisnicima. I dalje ćete morati ručni izbrisati Outline poslužitelj iz svojeg glavnog računala.", + "confirmation-server-remove-title": "Ukloni poslužitelj?", + "data-limit": "Ograničenje podatkovnog prometa", + "data-limit-per-key": "Ograničenje podatkovnog prometa po ključu", + "data-limits": "Ograničenja prijenosa podataka", + "data-limits-description": "Postavite 30-dnevno ograničenje praćenja prijenosa podataka za pristupne ključeve na ovom poslužitelju.", + "data-limits-dialog-text": "Otvorite karticu Postavke da biste postavili ograničenje prijenosa podataka za pristupne ključeve na ovom poslužitelju.", + "data-limits-dialog-title": "Izbjegnite prekomjernu potrošnju podataka", + "data-limits-disclaimer": "Budući da trenutačno prijavljujete mjerne podatke, uključit će se značajka ograničenja podatkovnog prometa. Više pojedinosti potražite u {openLink}pravilima o prikupljanju podataka{closeLink}.", + "data-limits-usage": "Iskorišteno: {used} od {total}", + "destroy": "Izbriši", + "digitalocean-disconnect-account": "Prekinite vezu s DigitalOcean računom", + "digitalocean-unreachable": "Pogreška je možda nastala zbog vatrozida na vašoj mreži ili privremenim problemima s povezivanjem putem digitalocean.com.", + "disabled": "Onemogućeno", + "disconnect": "Prekini vezu", + "done": "Gotovo", + "enabled": "Omogućeno", + "error-connectivity": "Imamo poteškoće pri povezivanju s vašim DigitalOcean računom. To je ponekad privremeni problem s DigitalOceanom ili vašom internetskom vezom. Ako ponovni pokušaj ne uspije, ponovljena prijava na DigitalOcean trebala bi popraviti problem.", + "error-connectivity-title": "Problem s povezivanjem", + "error-do-account-info": "Podaci o DigitalOcean računu nisu uspješno dohvaćeni", + "error-do-auth": "Autentifikacija na DigitalOceanu nije uspjela", + "error-do-limit": "Vaš DigitalOcean račun dosegao je ograničenje broja poslužitelja od {num}. Povećanje možete zatražiti na https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Nije uspješno dohvaćen popis svih dostupnih regija", + "error-do-warning": "Upozorenje DigitalOceana: {message}", + "error-feedback": "Slanje povratnih informacija nije uspjelo. Pokušajte ponovno.", + "error-gcp-auth": "Autentifikacija putem Google Cloud Platforma nije uspjela", + "error-hostname-invalid": "Mora biti IP adresa ili važeći naziv hosta.", + "error-key-add": "Dodavanje ključa nije uspjelo", + "error-key-remove": "Uklanjanje ključa nije uspjelo", + "error-key-rename": "Preimenovanje ključa nije uspjelo", + "error-keys-get": "Ključevi se nisu mogli učitati", + "error-keys-port-bad-input": "Priključak mora biti cijeli broj od 1 do 65.535.", + "error-keys-port-in-use": "Priključak se već upotrebljava na poslužitelju.", + "error-licenses": "Licence se nisu mogle učitati.", + "error-metrics": "Pogreška pri postavljanju omogućivanja mjernih podataka", + "error-network": "Došlo je do pogreške mreže.", + "error-not-saved": "Nije spremljeno", + "error-remove-data-limit": "Zadano ograničenje podatkovnog prometa ne može se onemogućiti", + "error-remove-per-key-limit": "Ograničenje podatkovnog prometa ne može se ukloniti za ovaj pristupni ključ", + "error-server-creation": "Došlo je do pogreške pri izradi vašeg Outline poslužitelja.", + "error-server-destroy": "Poslužitelj nije uspješno izbrisan", + "error-server-removed": "Poslužitelj {serverName} više nije prisutan na vašem DigitalOcean računu.", + "error-server-rename": "Preimenovanje poslužitelja nije uspjelo", + "error-server-unreachable": "Vaš je Outline poslužitelj ispravno instaliran, no ne možemo se povezati s njim. Najvjerojatnije je to zato što pravila vatrozida vašeg poslužitelja blokiraju dolazne veze. Pregledajte ih i provjerite da ste dopustili dolazne TCP veze na priključcima u rasponu od 1024 do 65535.", + "error-server-unreachable-title": "Povezivanje s vašim Outline poslužiteljem nije moguće", + "error-servers-removed": "Poslužitelj {serverNames} više nije prisutan na vašem DigitalOcean računu.", + "error-set-data-limit": "Postavljanje zadanog ograničenja podatkovnog prometa nije moguće", + "error-set-per-key-limit": "Ograničenje podatkovnog prometa ne može se postaviti za ovaj pristupni ključ", + "error-unexpected": "Došlo je do neočekivane pogreške.", + "experimental": "Eksperimentalno", + "experiments": "Eksperimenti", + "experiments-description": "Testirajte nove značajke i pošaljite nam povratne informacije prije nego što ih objavimo.", + "experiments-disclaimer": "Eksperimenti su u fazi razvoja te se mogu promijeniti ili ukloniti iz aplikacije. Ako trenutačno prijavljujete mjerne podatke, uključit će se upotreba eksperimentalnih značajki. Više pojedinosti potražite u {openLink}pravilima o prikupljanju podataka{closeLink}.", + "experiments-feedback": "Imate li prijedloge? {openLink}Ovdje pošaljite povratne informacije.{closeLink}", + "feedback-cloud-provider": "Odaberite davatelja usluga u oblaku", + "feedback-cloud-provider-error": "Odaberite davatelja usluge u oblaku.", + "feedback-connection": "Ne mogu se povezati s poslužiteljem", + "feedback-connection-others": "Drugi se ne mogu povezati s mojim poslužiteljem", + "feedback-disclaimer": "Naš tim može odgovarati na povratne informacije samo na engleskom.", + "feedback-email": "E-adresa (neobavezno)", + "feedback-error": "Unesite povratne informacije.", + "feedback-explanation-install": "Došlo je do pogreške prilikom pokušaja instalacije Outlinea na vaš poslužitelj. Ako još niste našli rješenje problema, pošaljite nam povratne informacije i javite svoju e-adresu (neobavezno) da vam se možemo javiti.", + "feedback-general": "Općenite povratne informacije", + "feedback-install": "Poteškoće s instalacijom Outlinea", + "feedback-label": "Vaše povratne informacije", + "feedback-management": "Poteškoće s upravljanjem poslužiteljem", + "feedback-other": "Drugo", + "feedback-privacy": "Vaše će se povratne informacije, e-adresa (ako ste je naveli) i dodatne informacije navedene u {openLink}pravilima o privatnosti{closeLink} poslati timu za Outline.", + "feedback-submit": "Pošalji", + "feedback-suggestion": "Prijedlozi", + "feedback-title-generic": "Pošaljite povratne informacije", + "feedback-title-install": "Instalacija Outline poslužitelja nije uspjela", + "gcp-billing-action": "Dalje", + "gcp-billing-body": "Čekamo da {openLink}dodate račun za naplatu na Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Otvorite stranicu za naplatu Cloud Consolea{closeLink} i dodajte račun za nastavak.", + "gcp-billing-error": "Podaci o naplati ne mogu se dohvatiti", + "gcp-billing-error-zero": "Morate dodati račun za naplatu prije nego što nastavite.", + "gcp-click-create": "Kliknite \"Izradi\".", + "gcp-create-new-project": "{openLink}Izradite novi Googleov projekt u oblaku{closeLink}.", + "gcp-create-new-vm": "{openLink}Izradite novu VM instancu{closeLink}.", + "gcp-create-project": "Izradite Googleov projekt u oblaku", + "gcp-create-server": "Izradite Googleov projekt u oblaku", + "gcp-create-vm": "Izradite VM instancu", + "gcp-disconnect-account": "Prekid veze računa za Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Dodajte novo pravilo za vatrozid{closeLink} na svoj Compute Engine projekt.", + "gcp-firewall-create-1": "Unesite \"outline\" u polje \"Naziv\".", + "gcp-firewall-create-2": "Unesite \"outline\" u polje \"Ciljne oznake\".", + "gcp-firewall-create-3": "Unesite \"0.0.0.0/0\" u polje \"Izvorni IP rasponi\".", + "gcp-firewall-create-4": "Odaberite \"Dopusti sve\" u \"Protokoli i priključci\".", + "gcp-name-your-project": "Dodijelite naziv svom projektu u polju \"Naziv projekta\" (Project name).", + "gcp-project-setup-error": "Došlo je do pogreške pri postavljanju projekta Google Clouda", + "gcp-select-machine-type": "Odaberite \"f1-micro\" u odjeljku \"Vrsta uređaja\" (Machine type)", + "gcp-select-networking": "Kliknite \"Upravljanje, sigurnost, diskovi, umrežavanje, jedan klijent\" (Management, security, disks, networking, sole tenancy), a zatim \"Umrežavanje\" (Networking)", + "gcp-select-region": "U odjeljku \"Područje\" (Region) odaberite područje koje se nalazi u blizini korisnika poslužitelja.", + "gcp-type-network-tag": "Unesite \"outline\" u polje \"Mrežne oznake\" (Network tags).", + "gcp-type-outline-server": "Unesite \"outline-server\" u polje \"Naziv\" (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Okrug Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Sjeverna Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapur", + "geo-south-carolina": "Južna Karolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varšava", + "geo-zurich": "Zürich", + "key": "Ključ {keyId}", + "manual-server-assign-firewall": "Dodijeli pravilo o vatrozidu", + "manual-server-assign-group": "Dodijeli sigurnosnu grupu", + "manual-server-create-firewall": "Izradite pravilo za vatrozid", + "manual-server-create-group": "Izrada sigurnosne grupe", + "manual-server-description": "Ovi će vam koraci pomoći da instalirate Outline na {cloudProvider} Linux poslužitelj.", + "manual-server-firewall": "Konfigurirajte svoj vatrozid", + "manual-server-install-paste": "Ovdje zalijepite rezultat instalacije.", + "manual-server-install-run": "Prijavite se na svoj poslužitelj i pokrenite tu naredbu.", + "manual-server-instructions": "Upute", + "manual-server-show-me": "Pokaži mi gdje", + "manual-server-title": "Pratite upute u nastavku", + "metrics-description": "Podijelite anonimizirane mjerne podatke i tako pomozite u poboljšanju pouzdanosti i izvedbe Outlinea, za vas i druge s kojima dijelite svoj poslužitelj. {openLink}Saznajte više.{closeLink}", + "metrics-share": "Podijelite mjerne podatke", + "metrics-skip": "Preskoči", + "metrics-title": "Dijeljenje mjernih podataka", + "nav-about": "O aplikaciji", + "nav-data-collection": "Prikupljanje podataka", + "nav-feedback": "Povratne informacije", + "nav-help": "Pomoć", + "nav-licenses": "Licence", + "nav-privacy": "Privatnost", + "nav-terms": "Uvjeti", + "no-data-limit": "Nema", + "notification-app-update": "Preuzeta je ažurirana verzija upravitelja Outlinea. Instalirat će se kada ponovno pokrenete aplikaciju.", + "notification-feedback-thanks": "Hvala vam što ste nam pomogli da se poboljšamo! Volimo čuti vaše mišljenje.", + "notification-key-added": "Ključ je dodan", + "notification-key-removed": "Ključ je uklonjen", + "notification-server-destroyed": "Poslužitelj je izbrisan", + "notification-server-exists": "Poslužitelj je već dodan", + "notification-server-removed": "Poslužitelj je uklonjen", + "oauth-account-active": "Vaš je DigitalOcean račun aktiviran.", + "oauth-account-active-tag": "Račun je aktiviran! Učitavaju se lokacije poslužitelja...", + "oauth-activate-account": "Aktivirajte svoj DigitalOcean račun.", + "oauth-billing": "Unesite svoje podatke o naplati na digitalocean.com, pa se vratite u aplikaciju nakon što to učinite.", + "oauth-billing-tag": "Unesite podatke o naplati...", + "oauth-connect-description": "Uz vaš račun, Outline olakšava izradu poslužitelja i povezivanje.", + "oauth-connect-tag": "Čekanje na povezivanje vašeg računa...", + "oauth-connect-title": "Prijavite se ili izradite račun na DigitalOceanu.", + "oauth-sign-out": "Odjavite se", + "oauth-verify": "Provjerite je li u vašu pristiglu poštu stigla poruka od Digital Oceana, pa kliknite vezu u poruci da potvrdite svoj račun.", + "oauth-verify-tag": "Potvrdite svoju e-adresu...", + "okay": "U redu", + "per-key-data-limit-dialog-set-custom": "Postavljanje prilagođenog ograničenja podatkovnog prometa", + "per-key-data-limit-dialog-title": "Ograničenje podatkovnog prometa – {keyName}", + "region-best-value": "Najbolja vrijednost", + "region-description": "S ove lokacije će se prenositi vaš doživljaj interneta.", + "region-setup": "Postavi Outline", + "region-title": "Odaberite lokaciju svojeg poslužitelja.", + "remove": "Ukloni", + "retry": "Ponovi", + "save": "Spremi", + "saved": "Spremljeno", + "saving": "Spremanje...", + "server-access": "Pristup poslužitelju", + "server-access-key-new": "Dodaj novi ključ", + "server-access-key-rename": "Preimenuj", + "server-access-keys": "Pristupni ključevi", + "server-connections": "Veze", + "server-data-transfer": "Preneseni podaci / posljednjih 30 dana", + "server-data-used": "Iskorišteno dopuštenje / posljednjih 30 dana", + "server-destroy": "Izbriši poslužitelj", + "server-help-access-key-description": "Podijelite pristupne ključeve s prijateljima kako bi se mogli povezati s vašim Outline poslužiteljem. Mogu koristiti iste pristupne ključeve na svim svojim uređajima.", + "server-help-access-key-next": "Dalje", + "server-help-access-key-title": "Izradite ključeve, podijelite pristup", + "server-help-connection-description": "Kliknite ovdje da biste instalirali klijentsku aplikaciju Outline pomoću osobnog pristupnog ključa za Outline poslužitelj.", + "server-help-connection-ok": "U redu, shvaćam!", + "server-help-connection-title": "Još niste povezani!", + "server-keys": "Ključevi", + "server-my-access-key": "Moj pristupni ključ", + "server-name": "Poslužitelj za Outline {serverLocation}", + "server-remove": "Ukloni poslužitelj", + "server-settings": "Postavke", + "server-unreachable": "Poslužitelj nije dostupan", + "server-unreachable-description": "Došlo je do poteškoće pri povezivanju s ovim poslužiteljem.", + "server-unreachable-managed-description": "Pokušajte ponovno ili uklonite ovaj poslužitelj iz aplikacije.", + "server-unreachable-manual-description": "Pokušajte ponovno ili izbrišite ovaj poslužitelj i virtualno glavno računalo.", + "server-usage": "Upotreba (posljednjih 30 dana)", + "servers-add": "Dodaj poslužitelj", + "servers-digitalocean": "DigitalOcean poslužitelji", + "servers-gcp": "Poslužitelji Google Cloud Platforma", + "servers-manual": "Poslužitelji", + "settings-access-key-port": "Priključak za nove pristupne ključeve", + "settings-metrics-header": "Podijeli anonimne mjerne podatke", + "settings-server-api-url": "URL API-ja za upravljanje", + "settings-server-cost": "Mjesečni trošak", + "settings-server-creation": "Izrađeno", + "settings-server-hostname": "Naziv hosta", + "settings-server-id": "ID poslužitelja", + "settings-server-info": "Informacije o poslužitelju", + "settings-server-location": "Lokacija poslužitelja", + "settings-server-name": "Naziv", + "settings-server-rename": "Postavite novi naziv svojeg poslužitelja. Napominjemo da se to neće odraziti na uređaje korisnika koje ste pozvali da se povežu s njim.", + "settings-server-version": "Verzija poslužitelja", + "settings-transfer-limit": "Dopuštenje za prijenos podataka", + "setup-action": "Postavljanje", + "setup-advanced": "Napredno", + "setup-anywhere": "Postavite Outline bilo gdje", + "setup-cancel": "Otkažite u bilo kojem trenutku", + "setup-create": "Izradi poslužitelj", + "setup-description": "Nemate poslužitelj? Izradite račun kod davatelja usluge DigitalOcean.", + "setup-do-cost": "Samo 6 USD mjesečno", + "setup-do-create": "Izradite novi poslužitelj pomoću svojeg DigitalOcean računa za dodatnih 6 USD za 30 dana da biste mogli prenijeti 1 TB podataka.", + "setup-do-data": "Dopuštenje prijenosa podataka od 1 TB", + "setup-do-description": "To bi moglo potrajati nekoliko minuta. Ovaj poslužitelj možete izbrisati bilo kada.", + "setup-do-easiest": "Najjednostavniji postupak postavljanja", + "setup-do-title": "Postavljanje Outlinea.", + "setup-firewall-instructions": "Upute za vatrozid", + "setup-gcp-create": "Izradite novi poslužitelj putem Google računa. Cijena ovisi o lokaciji i upotrebi.", + "setup-gcp-easy": "Jednostavan postupak postavljanja", + "setup-gcp-free-tier": "Uz {openLinkFreeTier}Free Tier{closeLink} početna cijena za vaš prvi poslužitelj je {openLinkIpPrice}tri USD mjesečno{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Besplatna proba od 90 dana{closeLink} za nove korisnike", + "setup-gcp-promo": "Isprobajte novi automatski postupak izrade poslužitelja Outline za Google Cloud", + "setup-recommended": "Preporuka", + "setup-simple-commands": "Naredbe za jednostavnu instalaciju", + "setup-step-by-step": "Detaljan vodič za postavljanje", + "setup-tested": "Za testiranje su korišteni VULTR, Linode i Liquid Web", + "setup-title": "Odaberite uslugu u oblaku da biste postavili Outline.", + "share-description": "Kopirajte ovu pozivnicu i pošaljite je putem pouzdanog alata za komunikaciju. {openLink}Trebate pomoć?{closeLink}", + "share-invite-access-key-copied": "Pristupni ključ kopiran je u međuspremnik", + "share-invite-copied": "Pozivnica je kopirana u međuspremnik", + "share-invite-copy": "Kopiraj pozivnicu", + "share-invite-copy-access-key": "Kopiraj pristupni ključ", + "share-invite-html": "Upotrijebite ovaj poslužitelj za siguran pristup otvorenom internetu:

1) Preuzmite i instalirajte aplikaciju Outline za svoj uređaj:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Alternativna veza za Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Dobit ćete pristup ključu koji započinje sa ss://. Nakon što ga primite, kopirajte taj pristupni ključ.

3) Otvorite klijentsku aplikaciju Outline. Ako se vaš pristupni ključ automatski prepozna, dodirnite Poveži i nastavite. Ako se pristupni ključ ne prepozna automatski, zalijepite ga u polje, a zatim dodirnite Poveži i nastavite.

Spremni ste za upotrebu otvorenog interneta! Da biste provjerili jeste li se uspješno povezali s poslužiteljem, pokušajte na Google pretraživanju potražiti \"kako glasi moj IP\". IP adresa prikazana na Googleu trebala bi se podudarati s IP adresom u klijentskoj aplikaciji Outline.

Više o Outlineu saznajte ovdje: https://getoutline.org/", + "share-invite-instructions": "Pratite naše upute za pozivnicu na GitHubu:", + "share-invite-trouble": "Imate li poteškoća prilikom pristupanja vezi s pozivnicom?", + "share-title": "Podijelite pristup", + "survey-data-limits-title": "Pomozite nam da saznamo kako možemo poboljšati ograničenje podatkovnog prometa", + "survey-decline": "Odbij", + "survey-disclaimer": "Ako kliknete opciju Nastavi, otvorit će se kratka anketa na Google obrascima. Preporučujemo da ispunite anketu dok ste povezani s Outlineom.", + "survey-go-to-survey": "Prijeđi na anketu", + "terms-of-service": "Pročitao/la sam i razumijem {openLink}Uvjete pružanja usluge za Outline{closeLink}" +} diff --git a/server_manager/messages/hu.json b/server_manager/messages/hu.json new file mode 100644 index 0000000000..77c6a534cb --- /dev/null +++ b/server_manager/messages/hu.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Az Outline a Jigsaw egy nyílt forráskódú projektje, amely segítségével az újságok és a sajtó munkatársai biztonságosan férhetnek hozzá az internethez.

A még korai fázisában lévő Outline szolgáltatást a Shadowsocks üzemelteti. A kóddal kapcsolatban itt segíthet: GitHub, ha pedig meg szeretné kapni a más platformokra való megjelenésről és új funkciókról szóló híreinket, kövessen minket a következőkön: Reddit és Medium.", + "about-version": "Verzió: {version}", + "aws-lightsail-firewall-0": "Lépjen az {openLink}Amazon Lightsail{closeLink} példányait tartalmazó képernyőre.", + "aws-lightsail-firewall-1": "Kattintson arra a példányra, amelyen az Outline-t futtatni szeretné.", + "aws-lightsail-firewall-2": "Váltson a „Hálózat” (Networking) lapra.", + "aws-lightsail-firewall-3": "Kattintson a „Tűzfal” (Firewall) szakasz „Újabb hozzáadása” (Add another) elemére.", + "aws-lightsail-firewall-4": "Állítsa át az „Alkalmazás” (Application) beállítást a „Minden TCP+UDP” (All TCP+UDP) értékre.", + "aws-lightsail-firewall-5": "Kattintson a Mentés (Save) gombra.", + "cancel": "Mégse", + "close": "Bezárás", + "confirmation-server-destroy": "A meglévő felhasználók elveszítik a hozzáférésüket. A művelet nem vonható vissza.", + "confirmation-server-destroy-title": "Megsemmisíti a szervert?", + "confirmation-server-remove": "A művelettel eltávolítja a szervert az Outline Managerből, de nem tiltja le a proxyhozzáférést a felhasználókhoz. Manuálisan kell törölnie az Outline-szervert a gazdagépről.", + "confirmation-server-remove-title": "Eltávolítja a szervert?", + "data-limit": "Adatforgalmi korlátozás", + "data-limit-per-key": "Adatforgalmi korlátozás kulcsonként", + "data-limits": "Adatforgalmi korlátozások", + "data-limits-description": "30 napos adatforgalmi korlátozás beállítása a kiszolgálón tárolt hozzáférési kulcsokhoz.", + "data-limits-dialog-text": "Menjen a Beállítások lapra, és állítson be adatforgalmi korlátozást a kiszolgálón tárolt hozzáférési kulcsokhoz.", + "data-limits-dialog-title": "Előzze meg az adatkeret túllépését!", + "data-limits-disclaimer": "Jelenleg jelentést küld a mutatókról, így ezentúl a jelentésekben adatforgalmi korlátozási funkció használata is szerepelni fog. További részleteket {openLink}az adatgyűjtési irányelvekben{closeLink} talál.", + "data-limits-usage": "{total}/{used} felhasználva", + "destroy": "Megsemmisítés", + "digitalocean-disconnect-account": "DigitalOcean-fiók leválasztása", + "digitalocean-unreachable": "A hibát okozhatja a hálózatra telepített tűzfal vagy a digitalocean.com oldallal kapcsolatban fellépő ideiglenes kapcsolódási hiba.", + "disabled": "Letiltva", + "disconnect": "Leválasztás", + "done": "Kész", + "enabled": "Engedélyezve", + "error-connectivity": "Nem tudtunk csatlakozni a DigitalOcean-fiókjához. Ezt néha ideiglenes hiba okozza a DigitalOceannél vagy az internetkapcsolattal. Ha az újrapróbálkozás után sem sikerül, jelentkezzen be újra a DigitalOcean rendszerébe. Ez valószínűleg megoldja a problémát.", + "error-connectivity-title": "Csatlakozási hiba", + "error-do-account-info": "Nem sikerült lekérni a DigitalOcean-fiókadatokat", + "error-do-auth": "Sikertelen DigitalOcean-hitelesítés", + "error-do-limit": "A DigitalOcean-fiókja elérte a dropletek maximális számát ({num}). A https://cloud.digitalocean.com/account/team/droplet_limit_increase oldalon kérheti a korlát emelését.", + "error-do-regions": "Nem sikerült lekérni a rendelkezésre álló régiók listáját.", + "error-do-warning": "DigitalOcean-figyelmeztetés: „{message}”", + "error-feedback": "Nem sikerült elküldeni a visszajelzést. Próbálkozzon újra.", + "error-gcp-auth": "Nem sikerült a hitelesítés a Google Cloud Platformnál", + "error-hostname-invalid": "IP-címnek vagy érvényes gazdagépnévnek kell lennie.", + "error-key-add": "Nem sikerült hozzáadni a kulcsot", + "error-key-remove": "Nem sikerült eltávolítani a kulcsot", + "error-key-rename": "Nem sikerült átnevezni a kulcsot", + "error-keys-get": "Nem sikerült betölteni a kulcsokat.", + "error-keys-port-bad-input": "A portnak 1 és 65 535 közötti egész számnak kell lennie.", + "error-keys-port-in-use": "A port már használatban van a szerveren.", + "error-licenses": "Nem sikerült betölteni a licenceket.", + "error-metrics": "Hiba történt a mérőszámjelentés beállításakor", + "error-network": "Hálózati hiba történt.", + "error-not-saved": "Nincs mentve", + "error-remove-data-limit": "Nem sikerült kikapcsolni az alapértelmezett adatforgalmi korlátozást", + "error-remove-per-key-limit": "Nem sikerült törölni a hozzáférési kulcs adatforgalmi korlátozását", + "error-server-creation": "Hiba történt az Outline-szerver létrehozásakor.", + "error-server-destroy": "Nem sikerült megsemmisíteni a szervert", + "error-server-removed": "A szerverek ({serverName}) már nem találhatók meg a DigitalOcean-fiókjában.", + "error-server-rename": "Nem sikerült átnevezni a szervert", + "error-server-unreachable": "Az Outline-szervere megfelelően lett telepítve, de nem tudunk hozzá csatlakozni. Valószínűleg a szerver tűzfalszabályi korlátozzák a bejövő kapcsolatokat. Ellenőrizze a szabályokat, és állítsa be úgy őket, hogy engedélyezzék a bejövő TCP-kapcoslatokat a 1024-65535-ös portokon.", + "error-server-unreachable-title": "Nem sikerült csatlakozni az Outline-szerveréhez", + "error-servers-removed": "A szerverek ({serverNames}) már nem találhatók meg a DigitalOcean-fiókjában.", + "error-set-data-limit": "Nem sikerült beállítani az alapértelmezett adatforgalmi korlátozást", + "error-set-per-key-limit": "Nem sikerült beállítani a hozzáférési kulcs adatforgalmi korlátozását", + "error-unexpected": "Váratlan hiba történt.", + "experimental": "Kísérleti", + "experiments": "Kísérleti funkciók", + "experiments-description": "Tesztelje az új funkciókat még a kiadásuk előtt, és küldjön visszajelzést róluk.", + "experiments-disclaimer": "A kísérleti funkciók fejlesztés alatt állnak, ezért módosulhatnak, illetve el is tűnhetnek az alkalmazásból. Ha használ jelentéskészítési mutatókat, a kísérleti funkciók használati adatai is szerepelni fognak bennük. További részleteket {openLink}az adatgyűjtési irányelvekben{closeLink} talál.", + "experiments-feedback": "Javaslata van? {openLink}Itt küldje be a visszajelzését.{closeLink}", + "feedback-cloud-provider": "Felhőszolgáltató kiválasztása", + "feedback-cloud-provider-error": "Válasszon egy felhőszolgáltatót.", + "feedback-connection": "Nem sikerült csatlakozni a szerveremhez", + "feedback-connection-others": "Mások nem tudnak csatlakozni a szerveremhez", + "feedback-disclaimer": "Ne feledje, hogy a csapatunk csak az angolul írt visszajelzésekre tud válaszolni.", + "feedback-email": "E-mail-cím (nem kötelező)", + "feedback-error": "Írja be a visszajelzését.", + "feedback-explanation-install": "Hiba történt az Outline-nak a szerverén történő telepítésekor. Ha még nem oldotta meg a problémát, küldjön nekünk visszajelzést, és ossza meg velünk az e-mail-címét (nem kötelező), hogy felvehessük Önnel a kapcsolatot.", + "feedback-general": "Általános visszajelzés", + "feedback-install": "Az Outline telepítésekor észlelek problémát", + "feedback-label": "Saját visszajelzés", + "feedback-management": "A szerverem kezelésekor észlelek problémát", + "feedback-other": "Egyéb", + "feedback-privacy": "A visszajelzését, az e-mail-címét (ha megadta) és az {openLink}adatvédelmi irányelvek{closeLink} között szereplő többi adatot elküldjük az Outline csapatának.", + "feedback-submit": "Küldés", + "feedback-suggestion": "Javaslatok", + "feedback-title-generic": "Visszajelzés küldése", + "feedback-title-install": "Nem sikerült telepíteni az Outline-szervert", + "gcp-billing-action": "Következő", + "gcp-billing-body": "Arra várunk, hogy {openLink}megadjon egy számlázási fiókot a Google Cloudban{closeLink}", + "gcp-billing-description": "{openLink}Nyissa meg a Cloud Console számlázási oldalát{closeLink}, és adjon hozzá egy fiókot, hogy tovább léphessen.", + "gcp-billing-error": "Nem sikerült lekérni a számlázási adatokat", + "gcp-billing-error-zero": "Mielőtt továbblép, meg kell adnia egy számlázási fiókot.", + "gcp-click-create": "Kattintson a „Create” (Létrehozás) elemre.", + "gcp-create-new-project": "{openLink}Google Cloud-projekt létrehozása{closeLink}", + "gcp-create-new-vm": "{openLink}Új VM-példány létrehozása{closeLink}", + "gcp-create-project": "Google Cloud-projekt létrehozása", + "gcp-create-server": "Google Cloud-projekt létrehozása", + "gcp-create-vm": "VM-példány létrehozása", + "gcp-disconnect-account": "Google Cloud Platform-fiók leválasztása", + "gcp-firewall-create-0": "{openLink}Adjon új tűzfalszabályt{closeLink} a Compute Engine-projektjéhez.", + "gcp-firewall-create-1": "Írja be az „outline” értéket a „Name” (Név) mezőbe.", + "gcp-firewall-create-2": "Írja be az „outline” szót a Target tags (Célcímkék) mezőbe.", + "gcp-firewall-create-3": "Írja be a „0.0.0.0/0” értéket a „Source IP ranges” (Forrás IP-tartományok) mezőbe.", + "gcp-firewall-create-4": "Válassza az „Allow all” (Az összes engedélyezése) lehetőséget a „Protocols and ports” (Protokollok és portok) szakaszban.", + "gcp-name-your-project": "Nevezze el a projektet a „Projektnév” (Project name) mezőben.", + "gcp-project-setup-error": "Hiba történt a Google Cloud-projekt létrehozásakor", + "gcp-select-machine-type": "Válassza az „f1-micro” beállítást a „Gép típusa” (Machine type) területen.", + "gcp-select-networking": "Kattintson a „Kezelés, biztonság, lemezek, hálózat, egyéni bérlő” (Management, security, disks, networking, sole tenancy), majd a „Hálózat (Networking) elemre", + "gcp-select-region": "Válasszon ki egy a szerver felhasználóihoz közeli régiót a „Régió” (Region) területen.", + "gcp-type-network-tag": "Írja be az „outline” szót a Hálózati címkék (Network tags) mezőbe.", + "gcp-type-outline-server": "Írja be az „outline-server” értéket a „Név” (Name) mezőbe.", + "geo-amsterdam": "Amszterdam", + "geo-bangalore": "Bengaluru", + "geo-changhua-county": "Csanghua megye", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Észak-Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Oszaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Szöul", + "geo-sg": "Szingapúr", + "geo-south-carolina": "Dél-Karolina", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokió", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsó", + "geo-zurich": "Zürich", + "key": "Kulcs: {keyId}", + "manual-server-assign-firewall": "Tűzfalszabály hozzárendelése", + "manual-server-assign-group": "Biztonsági csoport hozzárendelése", + "manual-server-create-firewall": "Tűzfalszabály létrehozása", + "manual-server-create-group": "Biztonsági csoport létrehozása", + "manual-server-description": "Ezek a lépések segítenek Önnek telepíteni az Outline alkalmazást a szolgáltató ({cloudProvider}) Linux-szerverére.", + "manual-server-firewall": "A tűzfal konfigurálása", + "manual-server-install-paste": "Illessze be ide a telepítési kimenetet.", + "manual-server-install-run": "Jelentkezzen be a szerverre, és futtassa ezt a parancsot.", + "manual-server-instructions": "Utasítások", + "manual-server-show-me": "Mutassa meg, hol", + "manual-server-title": "Kövesse az alábbi utasításokat", + "metrics-description": "Az anonimizált mérőszámok megosztásával segíthet az Outline megbízhatóságának és teljesítményének javításában, így a rendszer Önnek és azoknak a felhasználóknak is többet nyújthat majd, akikkel megosztotta a szerverét. {openLink}További információ.{closeLink}", + "metrics-share": "Mérőszámok megosztása", + "metrics-skip": "Kihagyás", + "metrics-title": "Mérőszámmegosztás", + "nav-about": "Névjegy", + "nav-data-collection": "Adatgyűjtés", + "nav-feedback": "Visszajelzés", + "nav-help": "Súgó", + "nav-licenses": "Licencek", + "nav-privacy": "Adatvédelem", + "nav-terms": "Feltételek", + "no-data-limit": "Nincs", + "notification-app-update": "Letöltöttük az Outline Manager egy újabb verzióját. Az alkalmazás újraindításakor a rendszer telepíti.", + "notification-feedback-thanks": "Köszönjük, hogy segít a fejlesztésben! Örömmel vettük üzenetét.", + "notification-key-added": "Kulcs hozzáadva", + "notification-key-removed": "Kulcs eltávolítva", + "notification-server-destroyed": "Szerver megsemmisítve", + "notification-server-exists": "A szerver már hozzá van adva", + "notification-server-removed": "Szerver eltávolítva", + "oauth-account-active": "DigitalOcean-fiókját aktiváltuk.", + "oauth-account-active-tag": "Fiók aktiválva! Szerverhelyek betöltése...", + "oauth-activate-account": "Aktiválja a DigitalOcean-fiókját.", + "oauth-billing": "Adja meg a számlázási adatait a digitalocean.com oldalon, majd térjen vissza az appra.", + "oauth-billing-tag": "Adja meg a számlázási adatokat...", + "oauth-connect-description": "A fiókja segítségével egyszerűen hozhat létre szervert és csatlakozhat az Outline-ban.", + "oauth-connect-tag": "Várakozás a fiók csatlakoztatására...", + "oauth-connect-title": "Jelentkezzen be, vagy hozzon létre egy fiókot a DigitalOcean rendszerében.", + "oauth-sign-out": "Kijelentkezés", + "oauth-verify": "Keresse meg az e-mailjei között a DigitalOcean szolgáltatótól érkezett levelet, és kattintson a linkre a fiókja megerősítéséhez.", + "oauth-verify-tag": "Az e-mail-címe megerősítése...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Egyéni adatforgalmi korlátozás beállítása", + "per-key-data-limit-dialog-title": "Adatforgalmi korlátozás – {keyName}", + "region-best-value": "Legjobb ár", + "region-description": "Innen érkeznek az internetes élmények.", + "region-setup": "Az Outline beállítása", + "region-title": "Válassza ki a szerver helyét.", + "remove": "Eltávolítás", + "retry": "Újrapróbálkozás", + "save": "Mentés", + "saved": "Mentve", + "saving": "Mentés...", + "server-access": "Szerverhozzáférés", + "server-access-key-new": "Új kulcs hozzáadása", + "server-access-key-rename": "Átnevezés", + "server-access-keys": "Hozzáférési kulcsok", + "server-connections": "Kapcsolatok", + "server-data-transfer": "Adatforgalom/elmúlt 30 nap", + "server-data-used": "Felhasznált keret/elmúlt 30 nap", + "server-destroy": "Szerver megsemmisítése", + "server-help-access-key-description": "Ossza meg a hozzáférési kulcsokat az ismerőseivel, hogy csatlakozhassanak az Outline-szerveréhez. Az összes eszközükön ugyanazt a hozzáférési kulcsot használhatják.", + "server-help-access-key-next": "Következő", + "server-help-access-key-title": "Kulcsok létrehozása, hozzáférés megosztása", + "server-help-connection-description": "Kattintson ide az Outline ügyfélprogramnak az Outline-szerveréhez tartozó személyes hozzáférési kulccsal történő telepítéséhez", + "server-help-connection-ok": "Rendben, értem!", + "server-help-connection-title": "Még nem csatlakozott.", + "server-keys": "Kulcsok", + "server-my-access-key": "Saját hozzáférési kulcs", + "server-name": "Outline-szerver: {serverLocation}", + "server-remove": "Szerver eltávolítása", + "server-settings": "Beállítások", + "server-unreachable": "A szerver nem érhető el", + "server-unreachable-description": "Hiba történt a szerverhez való csatlakozáskor.", + "server-unreachable-managed-description": "Próbálkozzon újra, vagy távolítsa el a szervert az alkalmazásból.", + "server-unreachable-manual-description": "Próbálkozzon újra, vagy semmisítse meg ezt a szervert és a virtuális gazdagépet.", + "server-usage": "Használat (elmúlt 30 nap)", + "servers-add": "Szerver hozzáadása", + "servers-digitalocean": "DigitalOcean-szerverek", + "servers-gcp": "Google Cloud Platform-szerverek", + "servers-manual": "Szerverek", + "settings-access-key-port": "Új hozzáférési kulcsok portja", + "settings-metrics-header": "Anonim mérőszámok megosztása", + "settings-server-api-url": "Management API URL-címe", + "settings-server-cost": "Havi költség", + "settings-server-creation": "Létrehozva.", + "settings-server-hostname": "Gazdagépnév", + "settings-server-id": "Szerverazonosító", + "settings-server-info": "Szerveradatok", + "settings-server-location": "Szerver helye", + "settings-server-name": "Név", + "settings-server-rename": "Állítson be új nevet a szerverhez. Ne feledje, hogy ez a változás nem lesz látható azokon a felhasználói eszközökön, amelyeket meghívott a csatlakozásra.", + "settings-server-version": "Szerver verziója", + "settings-transfer-limit": "Megengedett adatátvitel", + "setup-action": "Beállítás", + "setup-advanced": "Speciális", + "setup-anywhere": "Bárhol beállíthatja az Outline-t", + "setup-cancel": "Bármikor lemondhatja", + "setup-create": "Szerver létrehozása", + "setup-description": "Nincs szervere? Hozzon létre egy fiókot a DigitalOceannel.", + "setup-do-cost": "Csak havi 6 USD", + "setup-do-create": "Hozzon létre új szervert a DigitalOcean-fiókjával mindössze ennyiért: 6 USD/30 nap (1 TB-nyi adatátvitel).", + "setup-do-data": "1 TB-os adatátvitel-korlát", + "setup-do-description": "Ez eltarthat néhány percig. A szervert bármikor megsemmisítheti.", + "setup-do-easiest": "A legegyszerűbb beállítási folyamat", + "setup-do-title": "Az Outline beállítása.", + "setup-firewall-instructions": "Tűzfallal kapcsolatos utasítások", + "setup-gcp-create": "Hozzon létre új szervert a Google-fiókjával! A díjak a helytől és a használattól függenek.", + "setup-gcp-easy": "Egyszerű beállítási folyamat", + "setup-gcp-free-tier": "A {openLinkFreeTier}Díjmentes szint{closeLink} keretében az első szerver kezdő díja {openLinkIpPrice}3 USD/hó{closeLink}.", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 napos díjmentes próbaidőszak{closeLink} az új felhasználóknak", + "setup-gcp-promo": "Próbálja ki az új automatikus folyamatot, amellyel Outline szerver hozható létre a Google Cloud platformon!", + "setup-recommended": "Javasolt", + "setup-simple-commands": "Egyszerű telepítési parancsok", + "setup-step-by-step": "Lépésenkénti beállítási útmutató", + "setup-tested": "Tesztelve a következőkön: VULTR, Linode és Liquid Web", + "setup-title": "Válassza ki azt a felhőszolgáltatót, amellyel be szeretné állítani az Outline-t.", + "share-description": "Másolja ki ezt a meghívót, és küldje át egy megbízható kommunikációs eszközben. {openLink}Segítségre van szüksége?{closeLink}", + "share-invite-access-key-copied": "A hozzáférési kulcs a vágólapra másolva", + "share-invite-copied": "A meghívó a vágólapra másolva", + "share-invite-copy": "Meghívó kimásolása", + "share-invite-copy-access-key": "Hozzáférési kulcs másolása", + "share-invite-html": "Ezzel a szerverrel biztonságosan férhet hozzá a nyílt internethez:

1) Töltse le és telepítse az Outline alkalmazást az eszközére:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline -releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Alternatív Android-link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2. Kap egy ss:// kezdetű hozzáférési kulcsot. Amikor megérkezik a hozzáférési kulcs, másolja ki.

3) Nyissa meg az Outline ügyfélalkalmazást. Ha a rendszer automatikusan észleli a hozzáférési kulcsot, koppintson a „Csatlakozás” gombra, és lépjen tovább. Ha a rendszer nem észleli automatikusan a hozzáférési kulcsot, illessze be a mezőbe, majd koppintson a „Csatlakozás” gombra, és lépjen tovább.

Készen áll a nyílt internet használatára. Ellenőrizze, hogy sikerült-e kapcsolatot létesíteni a szerverrel: keressen rá a „mi az ip-címem” kifejezésre a Google Keresőben. A Google-ban megjelenő IP-címnek meg kell egyeznie az Outline-ügyfél IP-címével.

Az Outline-ról itt tájékozódhat: https://getoutline.org/", + "share-invite-instructions": "Kövesse a meghívásról szóló utasításokat a GitHub oldalán:", + "share-invite-trouble": "Hiba történt a meghívólinkhez való hozzáféréskor?", + "share-title": "Hozzáférés megosztása", + "survey-data-limits-title": "Segítsen megértenünk, hogyan javíthatnánk az adatforgalmi korlátozások működését.", + "survey-decline": "Elutasítás", + "survey-disclaimer": "Amikor a folytatás gombra kattint, megnyílik egy rövid felmérés a Google Űrlapokban. Azt javasoljuk, hogy úgy töltse ki a felmérést, hogy fennáll a kapcsolat az Outline-nal.", + "survey-go-to-survey": "Felmérés megnyitása", + "terms-of-service": "Elolvastam és megértettem az {openLink}Outline Általános Szerződési Feltételeit{closeLink}." +} diff --git a/server_manager/messages/hy.json b/server_manager/messages/hy.json new file mode 100644 index 0000000000..7fdc9a9765 --- /dev/null +++ b/server_manager/messages/hy.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline-ը Jigsaw-ի՝ բաց կոդով նախագծերից է, որի նպատակը համացանցի ավելի ապահով մուտքի ապահովումն է լրատվական գործակալությունների և լրագրողների համար։

Outline-ն օգտագործում է Shadowsocks հաղորդակարգը և դեռևս գտնվում է մշակման վաղ փուլում։ Դուք կարող եք միանալ նախագծի աշխատանքին GitHub հարթակում, ինչպես նաև բաժանորդագրվել մեր նորություններին Reddit և Medium կայքերում՝ նոր հարթակների և գործառույթների ավելացման մասին իմանալու համար։", + "about-version": "Տարբերակ {version}", + "aws-lightsail-firewall-0": "Անցեք {openLink}Amazon Lightsail{closeLink} նմուշների էկրան։", + "aws-lightsail-firewall-1": "Ընտրեք նմուշը, որում ուզում եք տեղակայել Outline-ը։", + "aws-lightsail-firewall-2": "Անցեք «Networking» (Ցանց) ներդիր։", + "aws-lightsail-firewall-3": "«Firewall» (հրապատ) բաժնում սեղմեք «Add another» (Ավելացնել)։", + "aws-lightsail-firewall-4": "«Application» (Հավելված) պարամետրի համար նշեք «All TCP+UDP» (Բոլոր TCP և UDP միացքները) արժեքը։", + "aws-lightsail-firewall-5": "Սեղմեք «Save» (Պահել)։", + "cancel": "Չեղարկել", + "close": "Փակել", + "confirmation-server-destroy": "Գոյություն ունեցող օգտատերերը կզրկվեն մուտքից։ Այս գործողությունը հնարավոր չէ հետարկել։", + "confirmation-server-destroy-title": "Հեռացնե՞լ սերվերը", + "confirmation-server-remove": "Այս գործողության արդյունքում ձեր սերվերը կհեռացվի Outline Manager-ից, սակայն պրոքսի միացումների միջոցով օգտատերերի մուտքը չի արգելափակվի։ Լիակատար հեռացման համար անհրաժեշտ է ձեռքով հեռացնել Outline-ի սերվերը ձեր խնամորդից։", + "confirmation-server-remove-title": "Հեռացնե՞լ սերվերը", + "data-limit": "Թրաֆիկի սահմանաչափը", + "data-limit-per-key": "Թրաֆիկի սահմանաչափ մուտքի բանալիների համար", + "data-limits": "Թրաֆիկի սահմանափակումներ", + "data-limits-description": "Սահմանեք տվյալների փոխանցման սահող սահմանաչափ այս սերվերի մուտքի բանալիների համար վերջին 30 օրվա կտրվածքով։", + "data-limits-dialog-text": "Բացեք «Կարգավորումներ» ներդիրը և նշեք տվյալների փոխանցման սահմանաչափ այս սերվերի մուտքի բանալիների համար։", + "data-limits-dialog-title": "Աշխատեք չգերազանցել թրաֆիկի սահմանաչափը", + "data-limits-disclaimer": "Թրաֆիկի սահմանափակումների օգտագործումը հաշվի կառնվի ձեր հաշվետվությունների համար վիճակագրություն հավաքելիս։ Լրացուցիչ տեղեկություններ ստանալու համար ծանոթացեք {openLink}տվյալների հավաքման քաղաքականությանը{closeLink}։", + "data-limits-usage": "Օգտագործվում է {used}՝ {total}-ից", + "destroy": "Հեռացնել", + "digitalocean-disconnect-account": "Անջատել DigitalOcean հաշիվը", + "digitalocean-unreachable": "Այս սխալը կարող է առաջացած լինել ձեր ցանցի հրապատի կամ digitalocean.com կայքի հետ կապի ժամանակավոր ընդհատման պատճառով։", + "disabled": "Անջատված է", + "disconnect": "Անջատել", + "done": "Պատրաստ է", + "enabled": "Միացված է", + "error-connectivity": "Ձեր DigitalOcean հաշվին միանալիս խնդիրներ առաջացան։ Դա կարող է պայմանավորված լինել ինչպես DigitalOcean-ի հետ կապված ժամանակավոր խնդիրներով, այնպես էլ ձեր ինտերնետ կապի որակով։ Եթե նորից փորձելը չի օգնում, DigitalOcean հաշվից դուրս գալու ու նորից հաշիվ մտնելու արդյունքում կարող է խնդիրը շտկվել։", + "error-connectivity-title": "Միացման խնդիր", + "error-do-account-info": "Չհաջողվեց ստանալ DigitalOcean հաշվի տվյալները", + "error-do-auth": "Իսկորոշման սխալ՝ DigitalOcean ծառայությունում", + "error-do-limit": "Ձեր DigitalOcean հաշվում արդեն առավելագույն թույլատրելի թվով ({num}) դրոփլեթներ կան։ Սահմանաչափն ավելացնելու համար կարող եք հայտ ներկայացնել https://cloud.digitalocean.com/account/team/droplet_limit_increase էջում։", + "error-do-regions": "Չհաջողվեց բեռնել հասանելի տարածաշրջանների ցանկը", + "error-do-warning": "DigitalOcean ծանուցում․ «{message}»", + "error-feedback": "Չհաջողվեց կարծիք ուղարկել։ Նորից փորձեք։", + "error-gcp-auth": "Իսկորոշման սխալ՝ Google Cloud Platform-ում", + "error-hostname-invalid": "Նշեք IP հասցե կամ խնամորդի վավեր անվանում։", + "error-key-add": "Չհաջողվեց ավելացնել բանալին", + "error-key-remove": "Չհաջողվեց հեռացնել բանալին", + "error-key-rename": "Չհաջողվեց վերանվանել բանալին", + "error-keys-get": "Չհաջողվեց բեռնել բանալիները", + "error-keys-port-bad-input": "Միացքի համար նշեք ամբողջ թիվ 1-ից 65 535 միջակայքում։", + "error-keys-port-in-use": "Այս միացքն արդեն օգտագործվում է սերվերում։", + "error-licenses": "Չհաջողվեց բեռնել լիցենզիաները։", + "error-metrics": "Ցուցանիշների ակտիվացման սխալ", + "error-network": "Ցանցի սխալ առաջացավ։", + "error-not-saved": "Չհաջողվեց պահել", + "error-remove-data-limit": "Չհաջողվեց անջատել թրաֆիկի կանխադրված սահմանաչափը", + "error-remove-per-key-limit": "Չհաջողվեց հեռացնել թրաֆիկի սահմանաչափը մուտքի այս բանալու համար", + "error-server-creation": "Outline-ի սերվեր ստեղծելիս սխալ առաջացավ։", + "error-server-destroy": "Չհաջողվեց հեռացնել սերվերը", + "error-server-removed": "{serverName} սերվերն այլևս ձեր DigitalOcean հաշվում չէ։", + "error-server-rename": "Չհաջողվեց վերանվանել սերվերը", + "error-server-unreachable": "Outline-ի ձեր սերվերը ճիշտ է տեղադրված, սակայն մեզ չի հաջողվում միանալ դրան։ Ամենայն հավանականությամբ դա պայմանավորված է նրանով, որ ձեր սերվերի հրապատի կանոններն արգելափակում են մուտքային միացումները։ Ստուգեք կարգավորումները և համոզվեք, որ միացքների 1024-ից 65 535 միջակայքի համար մուտքային TCP միացումները թույլատրված են։", + "error-server-unreachable-title": "Չհաջողվեց միանալ Outline-ի ձեր սերվերին", + "error-servers-removed": "Այս սերվերները ({serverNames}) այլևս ձեր DigitalOcean հաշվում չեն։", + "error-set-data-limit": "Չհաջողվեց նշել թրաֆիկի կանխադրված սահմանաչափ", + "error-set-per-key-limit": "Չհաջողվեց նշել թրաֆիկի սահմանաչափ մուտքի այս բանալու համար", + "error-unexpected": "Անսպասելի սխալ առաջացավ։", + "experimental": "Փորձնական գործառույթ", + "experiments": "Փորձարկումներ", + "experiments-description": "Փորձեք աշխատել նոր գործառույթներով, քանի դեռ դրանք հասանելի չեն լայն հանրությանը, և կիսվեք ձեր կարծիքով մեզ հետ։", + "experiments-disclaimer": "Փորձնական գործառույթները մշակման փուլում են և կարող են փոփոխվել կամ հեռացվել հավելվածից։ Այս գործառույթների օգտագործումը հաշվի կառնվի ձեր հաշվետվությունների համար վիճակագրություն հավաքելիս։ Լրացուցիչ տեղեկություններ ստանալու համար ծանոթացեք {openLink}տվյալների հավաքման քաղաքականությանը{closeLink}։", + "experiments-feedback": "Առաջարկնե՞ր ունեք։ Այստեղ կարող եք {openLink}կարծիք հայտնել{closeLink}։", + "feedback-cloud-provider": "Ընտրեք ամպային ծառայություն", + "feedback-cloud-provider-error": "Ընտրեք ամպային ծառայությունը։", + "feedback-connection": "Չեմ կարողանում միանալ իմ սերվերին", + "feedback-connection-others": "Մյուս օգտատերերը չեն կարողանում միանալ իմ սերվերին", + "feedback-disclaimer": "Նկատի ունեցեք, որ աջակցման թիմը կարող է պատասխանել միայն անգլերեն լեզվով ուղարկված կարծիքներին։", + "feedback-email": "Էլ․ հասցե (պարտադիր չէ)", + "feedback-error": "Գրեք կարծիք։", + "feedback-explanation-install": "Ձեր սերվերում Outline-ը տեղադրելիս սխալ առաջացավ։ Եթե ձեզ չհաջողվի ինքնուրույն վերացնել սխալը, ուղարկեք մեզ հաղորդագրություն՝ նկարագրելով իրավիճակը։ Հաղորդագրության մեջ կարող եք նշել ձեր էլ․ հասցեն, որպեսզի մենք կարողանանք պատասխանել ձեզ։", + "feedback-general": "Ընդհանուր կարծիք", + "feedback-install": "Outline-ը տեղադրելիս խնդիրներ առաջացան", + "feedback-label": "Ձեր կարծիքը", + "feedback-management": "Սերվերը կառավարելիս խնդիրներ են առաջացել", + "feedback-other": "Այլ", + "feedback-privacy": "Outline-ի թիմին կուղարկվեն ձեր կարծիքը, էլ․ հասցեն (եթե նշել եք), ինչպես նաև լրացուցիչ տեղեկություններ՝ համաձայն {openLink}գաղտնիության քաղաքականության{closeLink}։", + "feedback-submit": "Ուղարկել", + "feedback-suggestion": "Առաջարկներ", + "feedback-title-generic": "Կարծիք հայտնել", + "feedback-title-install": "Չհաջողվեց տեղադրել Outline-ի սերվերը", + "gcp-billing-action": "Հաջորդ", + "gcp-billing-body": "{openLink}Ավելացրեք վճարային օգտահաշիվ Google Cloud-ի համար{closeLink}", + "gcp-billing-description": "Շարունակելու համար {openLink}բացեք Cloud Console-ի հաշիվների ներկայացման էջը{closeLink} և ավելացրեք հաշիվ։", + "gcp-billing-error": "Չհաջողվեց բեռնել վճարային տվյալները", + "gcp-billing-error-zero": "Շարունակելու համար ավելացրեք վճարային օգտահաշիվ։", + "gcp-click-create": "Սեղմեք «Create» (Ստեղծել)։", + "gcp-create-new-project": "{openLink}Ստեղծեք Google Cloud-ի նոր նախագիծ{closeLink}։", + "gcp-create-new-vm": "{openLink}Ստեղծեք ՎՄ նմուշ{closeLink}։", + "gcp-create-project": "Ինչպես ստեղծել Google Cloud-ի նախագիծ", + "gcp-create-server": "Ինչպես ստեղծել Google Cloud-ի նախագիծ", + "gcp-create-vm": "Ինչպես ստեղծել ՎՄ նմուշ", + "gcp-disconnect-account": "Google Cloud Platform հաշվի անջատում", + "gcp-firewall-create-0": "{openLink}Ավելացրեք հրապատի նոր կանոն{closeLink} Compute Engine-ի ձեր նախագծում։", + "gcp-firewall-create-1": "«Name» (Անվանում) դաշտում մուտքագրեք «outline»։", + "gcp-firewall-create-2": "«Target tags» (Թիրախային թեգեր) դաշտում մուտքագրեք «outline»։", + "gcp-firewall-create-3": "«Source IP ranges» (աղբյուրի IP հասցեների միջակայքեր) դաշտում մուտքագրեք «0.0.0.0/0»։", + "gcp-firewall-create-4": "«Protocols and ports» (Հաղորդակարգեր և միացքներ) բաժնում ընտրեք «Allow all» (Թույլատրել բոլորը)։", + "gcp-name-your-project": "Մուտքագրեք նախագծի անվանումը «Project name» (Նախագծի անվանում) դաշտում։", + "gcp-project-setup-error": "Google Cloud-ի ձեր նախագիծը կարգավորելիս սխալ առաջացավ", + "gcp-select-machine-type": "«Machine type» (Մեքենայի տեսակը) բաժնում ընտրեք «f1-micro»", + "gcp-select-networking": "Սեղմեք «Management, security, disks, networking, sole tenancy» (Կառավարման, անվտանգության, սկավառակների, ցանցի, միանձնյա տիրապետման պարամետրերի կարգավորում), այնուհետև ընտրեք «Networking» (Ցանց)։", + "gcp-select-region": "«Region» (Տարածաշրջան) բաժնում ընտրեք տարածաշրջանը, որի մոտակայքում են գտնվելու սերվերի օգտատերերը։", + "gcp-type-network-tag": "«Network tags» (Ցանցային թեգեր) դաշտում մուտքագրեք «outline»", + "gcp-type-outline-server": "«Name» (Անվանում) դաշտում մուտքագրեք «outline-server»։", + "geo-amsterdam": "Ամստերդամ", + "geo-bangalore": "Բանգալոր", + "geo-changhua-county": "Չժանհուա", + "geo-delhi": "Դելի", + "geo-eemshaven": "Էմսհավեն", + "geo-frankfurt": "Ֆրանկֆուրտ", + "geo-hamina": "Համինա", + "geo-hk": "Հոնկոնգ", + "geo-iowa": "Այովա", + "geo-jakarta": "Ջակարտա", + "geo-jurong-west": "Ջուրոնգ Ուեսթ", + "geo-las-vegas": "Լաս Վեգաս", + "geo-london": "Լոնդոն", + "geo-los-angeles": "Լոս Անջելես", + "geo-melbourne": "Մելբուրն", + "geo-montreal": "Մոնրեալ", + "geo-mumbai": "Մումբայ", + "geo-new-york-city": "Նյու Յորք", + "geo-northern-virginia": "Հյուսիսային Վիրջինիա", + "geo-oregon": "Օրեգոն", + "geo-osaka": "Օսակա", + "geo-salt-lake-city": "Սոլթ Լեյք Սիթի", + "geo-san-francisco": "Սան Ֆրանցիսկո", + "geo-sao-paulo": "Սան Պաուլու", + "geo-seoul": "Սեուլ", + "geo-sg": "Սինգապուր", + "geo-south-carolina": "Հարավային Կարոլինա", + "geo-st-ghislain": "Սեն Գիլեն", + "geo-sydney": "Սիդնեյ", + "geo-tokyo": "Տոկիո", + "geo-toronto": "Տորոնտո", + "geo-warsaw": "Վարշավա", + "geo-zurich": "Ցյուրիխ", + "key": "Բանալի {keyId}", + "manual-server-assign-firewall": "Կարգավորեք հրապատի կանոն", + "manual-server-assign-group": "Անվտանգության խմբի նշանակում", + "manual-server-create-firewall": "Ստեղծեք հրապատի կանոն", + "manual-server-create-group": "Ստեղծեք անվտանգության խումբ", + "manual-server-description": "Կատարելով այս քայլերը՝ դուք կտեղադրեք Outline-ը {cloudProvider} ամպային ծառայության Լինուքս սերվերում։", + "manual-server-firewall": "Կարգավորեք ձեր հրապատը", + "manual-server-install-paste": "Տեղադրեք սերվերի տեղադրման հրահանգաշարի կատարման ժամանակ ստացված տեղեկություններն այստեղ։", + "manual-server-install-run": "Մուտք գործեք սերվեր և գործարկեք այս հրամանը։", + "manual-server-instructions": "Ցուցումներ", + "manual-server-show-me": "Ցույց տալ", + "manual-server-title": "Հետևեք ստորև ներկայացված ցուցումներին", + "metrics-description": "Կիսվեք անանունացված ցուցանիշներով՝ օգնելու ձեզ և Outline-ի ձեր սերվերի մյուս օգտատերերին բարելավել դրա հուսալիությունը և արդյունավետությունը։ {openLink}Իմանալ ավելին։{closeLink}", + "metrics-share": "Կիսվել ցուցանիշներով", + "metrics-skip": "Բաց թողնել", + "metrics-title": "Կիսվեք ցուցանիշներով", + "nav-about": "Հավելվածի մասին", + "nav-data-collection": "Տվյալների հավաքում", + "nav-feedback": "Կարծիք", + "nav-help": "Օգնություն", + "nav-licenses": "Լիցենզիաներ", + "nav-privacy": "Գաղտնիություն", + "nav-terms": "Պայմաններ", + "no-data-limit": "Նշված չէ", + "notification-app-update": "Outline Manager-ի թարմացված տարբերակ է ներբեռնվել։ Այն ավտոմատ կտեղադրվի, հենց որ վերագործարկեք հավելվածը։", + "notification-feedback-thanks": "Շնորհակալություն, որ օգնում եք մեզ կատարելագործվել։ Միշտ ուրախ ենք լսել ձեր կարծիքը։", + "notification-key-added": "Բանալին ավելացվեց", + "notification-key-removed": "Բանալին հեռացվեց", + "notification-server-destroyed": "Սերվերը հեռացվեց", + "notification-server-exists": "Սերվերն արդեն ավելացվել է", + "notification-server-removed": "Սերվերը հեռացվեց", + "oauth-account-active": "Ձեր DigitalOcean հաշիվը ակտիվացվել է։", + "oauth-account-active-tag": "Հաշիվն ակտիվացված է։ Սերվերի տեղակայման վայրերի բեռնում...", + "oauth-activate-account": "Ակտիվացրեք ձեր DigitalOcean հաշիվը։", + "oauth-billing": "Մուտքագրեք ձեր վճարային տվյալները digitalocean.com կայքում, որից հետո վերադարձեք հավելված։", + "oauth-billing-tag": "Մուտքագրեք վճարային տվյալները...", + "oauth-connect-description": "Ձեր հաշվի օգնությամբ Outline-ը հեշտացնում է սերվերի ստեղծման և դրան միանալու գործընթացը։", + "oauth-connect-tag": "Սպասում ենք ձեր հաշվի միացմանը...", + "oauth-connect-title": "Մտեք ձեր DigitalOcean հաշիվ կամ ստեղծեք նորը։", + "oauth-sign-out": "Դուրս գալ", + "oauth-verify": "Ձեր «Մուտքային» պանակում գտեք DigitalOcean-ից ստացած նամակը և սեղմեք դրանում նշված հղումը՝ ձեր հաշիվը հաստատելու համար։", + "oauth-verify-tag": "Հաստատեք ձեր էլ․ հասցեն...", + "okay": "Եղավ", + "per-key-data-limit-dialog-set-custom": "Սահմանել թրաֆիկի սահմանաչափ", + "per-key-data-limit-dialog-title": "Թրաֆիկի սահմանաչափ – {keyName}", + "region-best-value": "Շահավետ առաջարկ", + "region-description": "Հենց այստեղից է սկիզբ առնում ձեր ինտերնետը։", + "region-setup": "Կարգավորել Outline-ը", + "region-title": "Ընտրեք ձեր սերվերի տեղակայման վայրը։", + "remove": "Հեռացնել", + "retry": "Նորից փորձել", + "save": "Պահել", + "saved": "Պահվեց", + "saving": "Պահվում է...", + "server-access": "Սերվերի հասանելիություն", + "server-access-key-new": "Ավելացնել նոր բանալի", + "server-access-key-rename": "Վերանվանել", + "server-access-keys": "Մուտքի բանալիներ", + "server-connections": "Միացումներ", + "server-data-transfer": "Փոխանցված տվյալներ / վերջին 30 օրը", + "server-data-used": "Տվյալների օգտագործված ծավալը / վերջին 30 օրը", + "server-destroy": "Հեռացնել սերվերը", + "server-help-access-key-description": "Կիսվեք մուտքի բանալիով ընկերների հետ, որպեսզի նրանք կարողանան միանալ Outline-ի ձեր սերվերին։ Նրանցից յուրաքանչյուրն իր բոլոր սարքերում կարող է օգտագործել մուտքի նույն բանալին։", + "server-help-access-key-next": "Հաջորդ", + "server-help-access-key-title": "Ստեղծեք բանալիներ, տրամադրեք հասանելիություն", + "server-help-connection-description": "Սեղմեք այստեղ, որպեսզի տեղադրեք Outline-ի սպասառու հավելվածը՝ օգտագործելով Outline-ի սերվերի մուտքի անձնական բանալին։", + "server-help-connection-ok": "Պարզ է", + "server-help-connection-title": "Դուք դեռ միացած չեք", + "server-keys": "Բանալիներ", + "server-my-access-key": "Մուտքի իմ բանալին", + "server-name": "Outline-ի սերվեր, {serverLocation}", + "server-remove": "Հեռացնել սերվերը", + "server-settings": "Կարգավորումներ", + "server-unreachable": "Սերվերն անհասանելի է", + "server-unreachable-description": "Այս սերվերին միանալիս խնդիրներ առաջացան", + "server-unreachable-managed-description": "Նորից փորձեք կամ հեռացրեք այս սերվերը հավելվածից։", + "server-unreachable-manual-description": "Նորից փորձեք կամ ջնջեք այս սերվերն ու վիրտուալ խնամորդը։", + "server-usage": "Օգտագործումը (վերջին 30 օրվա ընթացքում)", + "servers-add": "Ավելացնել սերվեր", + "servers-digitalocean": "DigitalOcean-ի սերվեր", + "servers-gcp": "Google Cloud Platform-ի սերվերներ", + "servers-manual": "Սերվերներ", + "settings-access-key-port": "Մուտքի նոր բանալիների միացք", + "settings-metrics-header": "Կիսվել անանուն վիճակագրությամբ", + "settings-server-api-url": "Management API-ի URL", + "settings-server-cost": "Ամսական վճարում", + "settings-server-creation": "Ստեղծման ամսաթիվը", + "settings-server-hostname": "Խնամորդի անվանումը", + "settings-server-id": "Սերվերի ID", + "settings-server-info": "Տեղեկություններ սերվերի մասին", + "settings-server-location": "Սերվերի տեղակայման վայրը", + "settings-server-name": "Անվանում", + "settings-server-rename": "Նշեք նոր անվանում ձեր սերվերի համար։ Նկատի ունեցեք, որ սա չի ազդի այն օգտատերերի սարքերի աշխատանքի վրա, որոնց դուք հրավիրել եք միանալու սերվերին։", + "settings-server-version": "Սերվերի տարբերակը", + "settings-transfer-limit": "Թրաֆիկի փաթեթ տվյալների փոխանցման համար", + "setup-action": "Կարգավորել", + "setup-advanced": "Ընդլայնված", + "setup-anywhere": "Կարգավորեք Outline-ը ցանկացած սարքում", + "setup-cancel": "Ցանկացած ժամանակ կարող եք չեղարկել", + "setup-create": "Ստեղծել սերվեր", + "setup-description": "Չունե՞ք սերվեր։ Ստեղծեք հաշիվ DigitalOcean ամպային ծառայությունում։", + "setup-do-cost": "Ամսական ընդամենը 6 ԱՄՆ դոլար", + "setup-do-create": "Ստեղծեք նոր սերվեր ձեր DigitalOcean հաշվում թրաֆիկի 1 ՏԲ փաթեթով՝ հավելյալ վճարելով ընդամենը 6 ԱՄՆ դոլար 30 օրվա համար։", + "setup-do-data": "Թրաֆիկի փաթեթ 1 ՏԲ տվյալների փոխանցման համար", + "setup-do-description": "Սա կարող է մի քանի րոպե տևել։ Դուք ցանկացած ժամանակ կարող եք հեռացնել այս սերվերը։", + "setup-do-easiest": "Չափազանց պարզ կարգավորում", + "setup-do-title": "Outline-ի կարգավորում։", + "setup-firewall-instructions": "Հրապատի կարգավորման ցուցումներ", + "setup-gcp-create": "Ստեղծեք նոր սերվեր ձեր Google հաշվի օգնությամբ։ Գինը կախված է տեղակայման վայրից և օգտագործումից։", + "setup-gcp-easy": "Պարզ կարգավորում", + "setup-gcp-free-tier": "{openLinkFreeTier}Անվճար սակագնային պլանով{closeLink} առաջին սերվերի արժեքը կազմում է {openLinkIpPrice}ամսական 3 ԱՄՆ դոլար{closeLink}", + "setup-gcp-free-trial": "Նոր օգտատերերի համար {openLinkFreeTrial}առաջին 90 օրն՝ անվճար{closeLink}", + "setup-gcp-promo": "Փորձեք Google Cloud-ում Outline-ի սերվերի ստեղծման ավտոմատ գործընթացը", + "setup-recommended": "Առաջարկվող", + "setup-simple-commands": "Տեղադրման պարզ հրահանգներ", + "setup-step-by-step": "Կարգավորման քայլ առ քայլ ուղեցույց", + "setup-tested": "Փորձարկված է VULTR, Linode և Liquid Web ամպային ծառայություններում", + "setup-title": "Ընտրեք որևէ ամպային ծառայություն՝ Outline-ը կարգավորելու համար։", + "share-description": "Պատճենեք այս հրավերը և ուղարկեք այն վստահելի կապուղով։ {openLink}Օգնությո՞ւն է հարկավոր։{closeLink}", + "share-invite-access-key-copied": "Մուտքի բանալին պատճենվեց սեղմատախտակին", + "share-invite-copied": "Հրավերը պատճենվեց սեղմատախտակին", + "share-invite-copy": "Պատճենել հրավերը", + "share-invite-copy-access-key": "Պատճենել մուտքի բանալին", + "share-invite-html": "Բաց ինտերնետ ապահով մուտք գործելու համար օգտագործեք այս սերվերը՝

1) Ներբեռնեք և տեղադրեք ձեր սարքի համար նախատեսված Outline հավելվածը

– iOS՝ https://itunes.apple.com/app/outline-app/id1356177741
– MacOS՝ https://itunes.apple.com/app/outline-app/id1356178125
– Windows՝ https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Լինուքս՝ https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android՝ https://play.google.com/store/apps/details?id=org.outline.android.client
– Android (լրացուցիչ հղում)՝ https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Դուք կստանաք մուտքի բանալի, որը սկսվում է ss:// նախածանցով։ Ստանալուց հետո պատճենեք այն։

3) Բացեք Outline-ի սպասառու հավելվածը։ Եթե մուտքի բանալին ավտոմատ հայտնաբերվել է, հպեք «Միանալ» և շարունակեք։ Եթե մուտքի բանալին ավտոմատ չի հայտնաբերվել, ապա տեղադրեք այն համապատասխան դաշտում, այնուհետև հպեք «Միանալ» և շարունակեք։

Այժմ դուք կարող եք օգտվել բաց ինտերնետից։ Համոզվելու համար, որ հաջողությամբ միացել եք սերվերին, բացեք Google Որոնումը, մուտքագրեք «what is my ip» (որն է իմ IP-ն) և սեղմեք Enter։ Google-ում ցուցադրված IP հասցեն պետք է համընկնի IP հասցեի հետ, որը տեսնում եք Outline-ի սպասառու հավելվածում։

Outline-ի մասին լրացուցիչ տեղեկություններ կարող եք գտնել այստեղ՝ https://getoutline.org/", + "share-invite-instructions": "Հետևեք հրավերի ցուցումներին GitHub-ում՝", + "share-invite-trouble": "Չի՞ հաջողվում բացել հրավերի հղումը", + "share-title": "Հասանելիության տրամադրում", + "survey-data-limits-title": "Օգնեք մեզ բարելավել թրաֆիկի սահմանափակումների գործառույթը", + "survey-decline": "Մերժել", + "survey-disclaimer": "Սեղմելով «Անցնել հարցմանը»՝ դուք կվերահղվեք Google Ձևաթղթերի միջոցով ստեղծված կարճ հարցման էջ։ Խորհուրդ ենք տալիս հարցմանը մասնակցելուց առաջ միանալ Outline-ին։", + "survey-go-to-survey": "Անցնել հարցմանը", + "terms-of-service": "Ես կարդացել եմ և ընդունում եմ {openLink}Outline-ի օգտագործման պայմանները{closeLink}" +} diff --git a/server_manager/messages/id.json b/server_manager/messages/id.json new file mode 100644 index 0000000000..447c37f9fb --- /dev/null +++ b/server_manager/messages/id.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline adalah proyek open source yang dibuat oleh Jigsaw untuk menyediakan cara yang lebih aman bagi organisasi dan jurnalis berita dalam mengakses internet.

Outline menggunakan teknologi Shadowsocks dan masih dalam produk tahap awal. Anda dapat membantu di bidang coding di GitHub, serta mengikuti kami di Reddit dan Medium untuk mendapatkan pemberitahuan ketika kami melakukan perkembangan ke lebih banyak platform dan menambahkan fitur baru.", + "about-version": "Versi {version}", + "aws-lightsail-firewall-0": "Buka layar instance {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Klik instance tempat Anda ingin menghosting Outline.", + "aws-lightsail-firewall-2": "Buka tab 'Jaringan (Networking)'.", + "aws-lightsail-firewall-3": "Di bagian 'Firewall', klik 'Tambahkan lainnya (Add another)'.", + "aws-lightsail-firewall-4": "Tetapkan nilai 'Aplikasi (Application)' ke 'Semua TCP+UDP (All TCP+UDP)'.", + "aws-lightsail-firewall-5": "Klik 'Simpan (Save)'.", + "cancel": "Batal", + "close": "Tutup", + "confirmation-server-destroy": "Pengguna lama akan kehilangan akses. Tindakan ini tidak dapat diurungkan.", + "confirmation-server-destroy-title": "Hancurkan Server?", + "confirmation-server-remove": "Tindakan ini akan menghapus server Anda dari Outline Manager, tetapi tidak memblokir akses proxy ke pengguna. Anda tetap perlu menghapus server Outline secara manual dari komputer host.", + "confirmation-server-remove-title": "Hapus Server?", + "data-limit": "Batas Data", + "data-limit-per-key": "Batas data per kunci", + "data-limits": "Batas data", + "data-limits-description": "Tetapkan pemantauan batas transfer data untuk kunci akses di server ini selama 30 hari.", + "data-limits-dialog-text": "Buka tab Setelan untuk menetapkan batas data transfer bagi kunci akses di server ini.", + "data-limits-dialog-title": "Hindari transfer data berlebih", + "data-limits-disclaimer": "Karena saat ini Anda melaporkan metrik, penggunaan fitur batas data akan disertakan. Baca {openLink}kebijakan pengumpulan data{closeLink} untuk detail selengkapnya.", + "data-limits-usage": "{used} dari {total} digunakan", + "destroy": "Hancurkan", + "digitalocean-disconnect-account": "Putus sambungan akun DigitalOcean", + "digitalocean-unreachable": "Error ini mungkin disebabkan oleh firewall di jaringan Anda atau masalah konektivitas sementara dengan digitalocean.com.", + "disabled": "Nonaktifkan", + "disconnect": "Putuskan koneksi", + "done": "Selesai", + "enabled": "Aktifkan", + "error-connectivity": "Kami mengalami masalah saat menyambungkan ke akun DigitalOcean Anda. Biasanya, ini merupakan masalah sementara dengan DigitalOcean atau koneksi internet Anda. Jika tetap tidak berhasil setelah mencoba kembali, login ulang ke DigitalOcean seharusnya dapat memperbaiki masalah tersebut.", + "error-connectivity-title": "Masalah sambungan", + "error-do-account-info": "Gagal mendapatkan informasi akun DigitalOcean", + "error-do-auth": "Autentikasi DigitalOcean gagal", + "error-do-limit": "Akun DigitalOcean Anda telah mencapai batas {num} Droplet. Anda dapat meminta peningkatan batas Droplet di https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Gagal mendapatkan daftar region yang tersedia", + "error-do-warning": "Peringatan DigitalOcean: \"{message}\"", + "error-feedback": "Gagal mengirim masukan. Coba lagi.", + "error-gcp-auth": "Autentikasi dengan Google Cloud Platform gagal", + "error-hostname-invalid": "Harus berupa alamat IP atau hostname yang valid.", + "error-key-add": "Gagal menambahkan kunci", + "error-key-remove": "Gagal menghapus kunci", + "error-key-rename": "Gagal mengganti nama kunci", + "error-keys-get": "Tidak dapat memuat kunci", + "error-keys-port-bad-input": "Port harus berupa bilangan bulat antara 1 hingga 65.535.", + "error-keys-port-in-use": "Port sudah digunakan di server.", + "error-licenses": "Tidak dapat memuat lisensi.", + "error-metrics": "Terjadi error saat mengaktifkan metrik setelan", + "error-network": "Terjadi error jaringan.", + "error-not-saved": "Tidak Disimpan", + "error-remove-data-limit": "Tidak dapat menonaktifkan batas data default", + "error-remove-per-key-limit": "Tidak dapat menghapus batas data dari kunci akses ini", + "error-server-creation": "Terjadi error saat membuat server Outline Anda.", + "error-server-destroy": "Gagal menghancurkan server", + "error-server-removed": "{serverName} tidak lagi berada di akun DigitalOcean Anda.", + "error-server-rename": "Gagal mengganti nama server", + "error-server-unreachable": "Server Outline Anda telah diinstal dengan benar, tetapi kami tidak dapat terhubung ke server tersebut. Kemungkinan besar masalah ini terjadi karena aturan firewall server Anda memblokir sambungan masuk. Tinjau aturan tersebut dan pastikan Anda mengizinkan sambungan TCP masuk pada port 1024 hingga 65535.", + "error-server-unreachable-title": "Tidak dapat terhubung ke Server Outline Anda", + "error-servers-removed": "{serverNames} tidak lagi berada di akun DigitalOcean Anda.", + "error-set-data-limit": "Tidak dapat menetapkan batas data default", + "error-set-per-key-limit": "Tidak dapat menetapkan batas data untuk kunci akses ini", + "error-unexpected": "Terjadi error tidak terduga.", + "experimental": "Eksperimental", + "experiments": "Eksperimen", + "experiments-description": "Uji fitur baru dan beri kami masukan sebelum fitur tersebut dirilis.", + "experiments-disclaimer": "Eksperimen saat ini berada dalam tahap pengembangan dan dapat berubah atau dihapus dari aplikasi. Jika saat ini Anda melaporkan metrik, penggunaan fitur eksperimen akan disertakan. Baca {openLink}kebijakan pengumpulan data{closeLink} untuk detail selengkapnya.", + "experiments-feedback": "Punya saran? {openLink}Kirim masukan di sini.{closeLink}", + "feedback-cloud-provider": "Pilih penyedia cloud", + "feedback-cloud-provider-error": "Pilih penyedia cloud.", + "feedback-connection": "Tidak dapat terhubung ke server", + "feedback-connection-others": "Pengguna lain tidak dapat terhubung ke server saya", + "feedback-disclaimer": "Perlu diketahui bahwa tim kami hanya dapat menanggapi masukan dalam bahasa Inggris.", + "feedback-email": "Alamat email (opsional)", + "feedback-error": "Isi kolom masukan.", + "feedback-explanation-install": "Terjadi error saat mencoba menginstal Outline di server Anda. Jika belum dapat menemukan solusinya, pertimbangkan untuk mengirim masukan dan beri tahu kami alamat email Anda (opsional) agar kami dapat menghubungi Anda kembali.", + "feedback-general": "Masukan umum", + "feedback-install": "Mengalami masalah saat menginstal Outline", + "feedback-label": "Masukan Anda", + "feedback-management": "Mengalami masalah saat mengelola server saya", + "feedback-other": "Lainnya", + "feedback-privacy": "Masukan, alamat email Anda (jika diberikan), dan informasi tambahan yang disebutkan dalam {openLink}kebijakan privasi{closeLink} akan dikirim ke tim Outline.", + "feedback-submit": "Kirim", + "feedback-suggestion": "Saran", + "feedback-title-generic": "Kirim Masukan", + "feedback-title-install": "Penginstalan Server Outline Gagal", + "gcp-billing-action": "Berikutnya", + "gcp-billing-body": "Menunggu Anda {openLink}menambahkan akun penagihan di Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Buka halaman penagihan Cloud Console{closeLink} dan tambahkan rekening untuk melanjutkan.", + "gcp-billing-error": "Tidak dapat mengambil informasi penagihan", + "gcp-billing-error-zero": "Anda harus menambahkan akun penagihan sebelum melanjutkan.", + "gcp-click-create": "Klik 'Buat (Create)'.", + "gcp-create-new-project": "{openLink}Buat Google Cloud Project baru{closeLink}.", + "gcp-create-new-vm": "{openLink}Buat instance VM baru{closeLink}.", + "gcp-create-project": "Buat Google Cloud Project", + "gcp-create-server": "Buat Google Cloud Project", + "gcp-create-vm": "Membuat Instance VM", + "gcp-disconnect-account": "Putuskan sambungan akun Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Tambahkan aturan firewall baru{closeLink} untuk project Compute Engine Anda.", + "gcp-firewall-create-1": "Ketik 'outline' di kolom 'Nama (Name)'.", + "gcp-firewall-create-2": "Ketik 'outline' di kolom 'Tag target (Target tags)'.", + "gcp-firewall-create-3": "Ketik '0.0.0.0/0' di kolom 'Rentang IP sumber (Source IP ranges)'.", + "gcp-firewall-create-4": "Pilih 'Izinkan semua (Allow all)' di bagian 'Protokol dan port (Protocols and ports)'.", + "gcp-name-your-project": "Beri nama project Anda di kolom 'Nama project (Project name)'.", + "gcp-project-setup-error": "Terjadi error saat menyiapkan project Google Cloud Anda", + "gcp-select-machine-type": "Pilih 'f1-micro' di bagian 'Jenis mesin (Machine type)'", + "gcp-select-networking": "Klik 'Pengelolaan (Management), keamanan (security), disk (disk), jaringan (network), tenant tunggal' (sole tenancy), lalu 'Jaringan (Networking)'", + "gcp-select-region": "Pilih region yang dekat dengan tempat pengguna server berada di bagian 'Region'.", + "gcp-type-network-tag": "Ketik 'outline' di kolom 'Tag jaringan (Network tags)'.", + "gcp-type-outline-server": "Ketik 'server outline' di kolom 'Nama (Name)'.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "County Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Northern Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapura", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warsaw", + "geo-zurich": "Zürich", + "key": "Kunci {keyId}", + "manual-server-assign-firewall": "Tetapkan aturan firewall", + "manual-server-assign-group": "Tetapkan Grup Keamanan", + "manual-server-create-firewall": "Buat aturan firewall", + "manual-server-create-group": "Buat Grup Keamanan", + "manual-server-description": "Langkah-langkah berikut akan membantu Anda menginstal Outline di server Linux {cloudProvider}.", + "manual-server-firewall": "Konfigurasikan firewall Anda", + "manual-server-install-paste": "Tempel output penginstalan Anda di sini.", + "manual-server-install-run": "Login ke server Anda, lalu jalankan perintah ini.", + "manual-server-instructions": "Petunjuk", + "manual-server-show-me": "Tunjukkan lokasinya", + "manual-server-title": "Ikuti petunjuk di bawah", + "metrics-description": "Bagikan metrik anonim untuk membantu meningkatkan keandalan dan performa Outline bagi Anda dan orang-orang yang berbagi server dengan Anda. {openLink}Pelajari lebih lanjut.{closeLink}", + "metrics-share": "Bagikan metrik", + "metrics-skip": "Lewati", + "metrics-title": "Berbagi metrik", + "nav-about": "Tentang", + "nav-data-collection": "Pengumpulan data", + "nav-feedback": "Masukan", + "nav-help": "Bantuan", + "nav-licenses": "Lisensi", + "nav-privacy": "Privasi", + "nav-terms": "Persyaratan", + "no-data-limit": "Tidak Ada", + "notification-app-update": "Versi terbaru Outline Manager telah didownload. Versi ini akan diinstal saat Anda memulai ulang aplikasi.", + "notification-feedback-thanks": "Terima kasih atas bantuan Anda dalam upaya penyempurnaan kami. Senang sekali bisa mendengar pendapat Anda.", + "notification-key-added": "Kunci telah ditambahkan", + "notification-key-removed": "Kunci telah dihapus", + "notification-server-destroyed": "Server telah dihancurkan", + "notification-server-exists": "Server telah ditambahkan", + "notification-server-removed": "Server telah dihapus", + "oauth-account-active": "Akun DigitalOcean Anda telah diaktifkan.", + "oauth-account-active-tag": "Akun berhasil diaktifkan. Memuat lokasi server...", + "oauth-activate-account": "Aktifkan akun DigitalOcean Anda.", + "oauth-billing": "Masukkan informasi penagihan Anda di digitalocean.com, lalu kembali ke aplikasi setelah selesai.", + "oauth-billing-tag": "Masukkan informasi penagihan...", + "oauth-connect-description": "Dengan akun Anda, Outline dapat mempermudah proses pembuatan server dan terhubung.", + "oauth-connect-tag": "Menunggu menyambungkan akun Anda...", + "oauth-connect-title": "Login atau buat akun DigitalOcean.", + "oauth-sign-out": "Logout", + "oauth-verify": "Periksa kotak masuk Anda untuk menemukan email dari DigitalOcean, lalu klik link di dalamnya untuk mengonfirmasi akun Anda.", + "oauth-verify-tag": "Konfirmasi email Anda...", + "okay": "Oke", + "per-key-data-limit-dialog-set-custom": "Tetapkan batas data kustom", + "per-key-data-limit-dialog-title": "Batas Data - {keyName}", + "region-best-value": "Nilai Terbaik", + "region-description": "Dari sinilah pengalaman internet Anda berasal.", + "region-setup": "Siapkan Outline", + "region-title": "Pilih lokasi server Anda.", + "remove": "Hapus", + "retry": "Coba lagi", + "save": "Simpan", + "saved": "Disimpan", + "saving": "Menyimpan...", + "server-access": "Akses server", + "server-access-key-new": "Tambahkan kunci baru", + "server-access-key-rename": "Ganti nama", + "server-access-keys": "Kunci akses", + "server-connections": "Sambungan", + "server-data-transfer": "Data yang ditransfer/30 hari terakhir", + "server-data-used": "Batas yang digunakan/30 hari terakhir", + "server-destroy": "Hancurkan server", + "server-help-access-key-description": "Bagikan kunci akses dengan teman agar mereka dapat terhubung ke server Outline Anda. Mereka dapat menggunakan kunci akses yang sama di semua perangkatnya.", + "server-help-access-key-next": "Berikutnya", + "server-help-access-key-title": "Buat kunci, bagikan akses", + "server-help-connection-description": "Klik di sini untuk menginstal aplikasi klien Outline, menggunakan kunci akses pribadi ke server Outline Anda.", + "server-help-connection-ok": "Oke, mengerti.", + "server-help-connection-title": "Anda belum terhubung.", + "server-keys": "Kunci", + "server-my-access-key": "Kunci akses saya", + "server-name": "Server Outline {serverLocation}", + "server-remove": "Hapus server", + "server-settings": "Setelan", + "server-unreachable": "Server tidak dapat dijangkau", + "server-unreachable-description": "Kami mengalami masalah saat menyambungkan ke server ini.", + "server-unreachable-managed-description": "Coba lagi atau hapus server ini dari aplikasi.", + "server-unreachable-manual-description": "Coba lagi atau hancurkan server ini dan host virtual", + "server-usage": "Penggunaan (30 hari terakhir)", + "servers-add": "Tambahkan server", + "servers-digitalocean": "Server DigitalOcean", + "servers-gcp": "Server Google Cloud Platform", + "servers-manual": "Server", + "settings-access-key-port": "Port untuk kunci akses baru", + "settings-metrics-header": "Bagikan metrik anonim", + "settings-server-api-url": "URL Management API", + "settings-server-cost": "Biaya bulanan", + "settings-server-creation": "Dibuat", + "settings-server-hostname": "Hostname", + "settings-server-id": "ID Server", + "settings-server-info": "Informasi Server", + "settings-server-location": "Lokasi server", + "settings-server-name": "Nama", + "settings-server-rename": "Tetapkan nama baru untuk server Anda. Perlu diperhatikan bahwa nama ini tidak akan ditunjukkan di perangkat milik pengguna yang Anda undang untuk terhubung ke server tersebut.", + "settings-server-version": "Versi server", + "settings-transfer-limit": "Batas transfer data", + "setup-action": "Siapkan", + "setup-advanced": "Lanjutan", + "setup-anywhere": "Siapkan Outline di mana saja", + "setup-cancel": "Batalkan kapan saja", + "setup-create": "Buat server", + "setup-description": "Tidak memiliki server? Buat akun DigitalOcean.", + "setup-do-cost": "Hanya US$6 per bulan", + "setup-do-create": "Buat server baru menggunakan akun DigitalOcean Anda dengan biaya tambahan sebesar US$6/30 hari untuk mendapatkan transfer data sebanyak 1 TB.", + "setup-do-data": "Batas transfer data sebesar 1 TB", + "setup-do-description": "Proses ini memerlukan waktu beberapa menit. Anda dapat menghapus server ini kapan saja.", + "setup-do-easiest": "Proses penyiapan termudah", + "setup-do-title": "Menyiapkan Outline.", + "setup-firewall-instructions": "Petunjuk firewall", + "setup-gcp-create": "Buat server baru menggunakan Akun Google Anda. Biaya bervariasi berdasarkan lokasi dan penggunaan.", + "setup-gcp-easy": "Proses penyiapan yang mudah", + "setup-gcp-free-tier": "Dengan {openLinkFreeTier}Paket Gratis{closeLink}, server pertama Anda dimulai dari {openLinkIpPrice}US$3/bulan{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Uji coba gratis 90 hari{closeLink} untuk pengguna baru", + "setup-gcp-promo": "Coba proses baru pembuatan server Outline otomatis untuk Google Cloud", + "setup-recommended": "Direkomendasikan", + "setup-simple-commands": "Perintah instal yang mudah", + "setup-step-by-step": "Panduan penyiapan langkah demi langkah", + "setup-tested": "Diuji di VULTR, Linode, dan Liquid Web", + "setup-title": "Pilih layanan cloud untuk menyiapkan Outline.", + "share-description": "Salin undangan ini, lalu kirim melalui fitur komunikasi yang dipercaya. {openLink}Perlu bantuan?{closeLink}", + "share-invite-access-key-copied": "Kunci akses disalin ke papan klip", + "share-invite-copied": "Undangan disalin ke papan klip", + "share-invite-copy": "Salin undangan", + "share-invite-copy-access-key": "Salin kunci akses", + "share-invite-html": "Gunakan server ini untuk mengakses internet terbuka dengan aman:

1) Download dan instal aplikasi Outline untuk perangkat Anda:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Link alternatif Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Anda akan menerima kunci akses yang diawali dengan ss://. Setelah Anda menerimanya, salin kunci akses ini.

3) Buka aplikasi klien Outline. Jika kunci akses Anda terdeteksi secara otomatis, ketuk \"Hubungkan\" dan lanjutkan. Jika kunci akses Anda tidak terdeteksi secara otomatis, tempelkan kunci akses di kolom, lalu ketuk \"Hubungkan\" dan lanjutkan.

Anda siap menggunakan internet terbuka. Untuk memastikan Anda telah terhubung ke server dengan baik, coba telusuri \"apa IP saya\" di Google Penelusuran. Alamat IP yang ditampilkan di Google harus cocok dengan alamat IP di aplikasi Outline.

Pelajari Outline lebih lanjut di sini: https://getoutline.org/", + "share-invite-instructions": "Ikuti petunjuk undangan kami di GitHub:", + "share-invite-trouble": "Mengalami masalah saat mengakses link undangan?", + "share-title": "Bagikan akses", + "survey-data-limits-title": "Bantu kami memahami cara meningkatkan batas data", + "survey-decline": "Tolak", + "survey-disclaimer": "Dengan mengklik lanjutkan, Anda akan diarahkan ke survei singkat di Google Formulir. Sebaiknya ikuti survei saat terhubung ke Outline.", + "survey-go-to-survey": "Buka survei", + "terms-of-service": "Saya telah membaca dan memahami {openLink}Persyaratan Layanan Outline{closeLink}" +} diff --git a/server_manager/messages/is.json b/server_manager/messages/is.json new file mode 100644 index 0000000000..2359d755cf --- /dev/null +++ b/server_manager/messages/is.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline er verkefni með opnum kóða úr smiðju Jigsaw sem veitir fréttaveitum og blaðamönnum öruggari aðgang að netinu.

Outline er knúið af Shadowsocks og er enn á frumstigi. Þú getur lagt þitt af mörkum til kóðans á GitHub og fylgt okkur á Reddit og Medium til að fá fréttir af því þegar við færum út kvíarnar og bætum við fleiri verkvöngum eða nýjum eiginleikum.", + "about-version": "Útgáfa {version}", + "aws-lightsail-firewall-0": "Farðu á tilvikaskjá {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Smelltu á tilvikið sem þú vilt að hýsi Outline.", + "aws-lightsail-firewall-2": "Farðu í flipann „Net (Networking)“.", + "aws-lightsail-firewall-3": "Smelltu á „Bæta við nýjum (Add another)“ í hlutanum „Eldveggur (Firewall)“.", + "aws-lightsail-firewall-4": "Stilltu gildið fyrir „Forrit (Application)“ á „Allt TCP+UDP (All TCP+UDP)“.", + "aws-lightsail-firewall-5": "Smelltu á „Vista (Save)“.", + "cancel": "Hætta við", + "close": "Loka", + "confirmation-server-destroy": "Núverandi notendur munu missa aðgang. Ekki er hægt að afturkalla þessa aðgerð.", + "confirmation-server-destroy-title": "Eyðileggja þjón?", + "confirmation-server-remove": "Þessi aðgerð fjarlægir þjóninn úr Outline Manager en kemur ekki í veg fyrir að notendur hafi aðgang með staðgengilsþjóni. Þú þarft samt sem áður að eyða Outline-þjóninum handvirkt úr hýsingarvélinni.", + "confirmation-server-remove-title": "Viltu fjarlægja þjón?", + "data-limit": "Gagnamörk", + "data-limit-per-key": "Gagnamörk hvers lykils", + "data-limits": "Gagnamörk", + "data-limits-description": "Stilltu 30 daga gagnamarkaferil fyrir aðgangslykla á þjóninum.", + "data-limits-dialog-text": "Farðu í stillingaflipann til að stilla hámark gagnaflutnings fyrir aðgangslykla á þessum þjóni.", + "data-limits-dialog-title": "Forðastu að fara yfir gagnamörk", + "data-limits-disclaimer": "Þar sem þú skráir mæligildi verður notkun á eiginleika gagnamarka höfð með. Skoðaðu {openLink}reglur um gagnasöfnun{closeLink} til að fá frekari upplýsingar.", + "data-limits-usage": "{used} af {total} í notkun", + "destroy": "Eyðileggja", + "digitalocean-disconnect-account": "Aftengja DigitalOcean-reikning", + "digitalocean-unreachable": "Villan kemur hugsanlega upp vegna eldveggs á netinu þínu eða tímabundinna vandamála við tengingu á digitalocean.com.", + "disabled": "Slökkt", + "disconnect": "Aftengja", + "done": "Lokið", + "enabled": "Kveikt", + "error-connectivity": "Við eigum í vandræðum með að tengjast DigitalOcean-reikningnum þínum. Þetta er tímabundin villa sem kemur stundum upp varðandi DigitalOcean eða nettenginguna. Ef ekki virkar að reyna aftur ætti vandamálið að leysast ef þú skráir þig aftur inn á DigitalOcean.", + "error-connectivity-title": "Vandamál með tengingu", + "error-do-account-info": "Ekki tókst að sækja upplýsingar um DigitalOcean-reikning", + "error-do-auth": "Auðkenning með DigitalOcean tókst ekki", + "error-do-limit": "DigitalOcean-reikningurinn þinn hefur náð hámarkinu sem eru {num} dropar (Droplets). Þú getur beðið um fleiri á https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Ekki tókst að sækja lista yfir tiltæk svæði", + "error-do-warning": "Viðvörun frá DigitalOcean: „{message}“", + "error-feedback": "Ekki tókst að senda inn ábendingu. Reyndu aftur.", + "error-gcp-auth": "Auðkenning með Google Cloud Platform tókst ekki", + "error-hostname-invalid": "Þetta þarf að vera IP-tala eða gilt hýsilheiti.", + "error-key-add": "Ekki tókst að bæta við lykli", + "error-key-remove": "Ekki tókst að fjarlægja lykil", + "error-key-rename": "Ekki tókst að endurnefna lykil", + "error-keys-get": "Ekki tókst að hlaða lyklum", + "error-keys-port-bad-input": "Gáttin verður að vera heiltala á milli 1 og 65.535.", + "error-keys-port-in-use": "Gáttin er þegar í notkun á þjóninum.", + "error-licenses": "Ekki tókst að hlaða leyfum.", + "error-metrics": "Villa við að kveikja á skráningu mæligilda", + "error-network": "Netvilla kom upp.", + "error-not-saved": "Ekki vistað", + "error-remove-data-limit": "Ekki tókst að gera sjálfgefin gagnamörk óvirk", + "error-remove-per-key-limit": "Ekki tókst að fjarlægja gagnamörk aðgangslykilsins", + "error-server-creation": "Villa kom upp við að búa til Outline-þjón.", + "error-server-destroy": "Ekki tókst að eyðileggja þjón", + "error-server-removed": "{serverName} er ekki lengur til staðar á DigitalOcean-reikningnum þínum.", + "error-server-rename": "Ekki tókst að endurnefna þjón", + "error-server-unreachable": "Outline-þjónninn var settur rétt upp en við gátum ekki tengst honum. Það er líklegast vegna þess að eldveggsreglur þjónsins loka fyrir mótteknar tengingar. Yfirfarðu þær og vertu viss um að leyfa mótteknar TCP-tengingar í gáttum frá 1024 til 65535.", + "error-server-unreachable-title": "Ekki tókst að tengjast Outline-þjóni", + "error-servers-removed": "{serverNames} er ekki lengur til staðar á DigitalOcean-reikningnum þínum.", + "error-set-data-limit": "Ekki tókst að stilla sjálfgefin gagnamörk", + "error-set-per-key-limit": "Ekki tókst að stilla gagnamörk fyrir þennan aðgangslykil", + "error-unexpected": "Óvænt villa kom upp.", + "experimental": "Á tilraunastigi", + "experiments": "Tilraunir", + "experiments-description": "Prófaðu nýja eiginleika og sendu okkur ábendingar áður en við gefum þá út.", + "experiments-disclaimer": "Tilraunir eru í þróun og gætu breyst eða verið fjarlægðar úr forritinu. Ef þú skráir mæligildi verða tilraunaeiginleikar hafðir með. Skoðaðu {openLink}reglur um gagnasöfnun{closeLink} til að fá frekari upplýsingar.", + "experiments-feedback": "Ertu með tillögur? {openLink}Sendu inn ábendingar hér.{closeLink}", + "feedback-cloud-provider": "Veldu skýjaþjónustu", + "feedback-cloud-provider-error": "Veldu skýjaþjónustu.", + "feedback-connection": "Ég næ ekki að tengjast þjóninum mínum", + "feedback-connection-others": "Aðrir geta ekki tengst þjóninum mínum", + "feedback-disclaimer": "Athugaðu að starfsfólk okkar getur aðeins svarað ábendingum á ensku.", + "feedback-email": "Netfang (valfrjálst)", + "feedback-error": "Sendu okkur ábendingu.", + "feedback-explanation-install": "Villa kom upp við uppsetningu Outline á þjóninum. Ef þér hefur ekki tekist að finna lausn skaltu íhuga að senda okkur ábendingu þar sem netfangið þitt kemur fram (valkvætt) svo við getum haft samband við þig.", + "feedback-general": "Almenn ábending", + "feedback-install": "Vandamál við uppsetningu Outline", + "feedback-label": "Ábendingin þín", + "feedback-management": "Ég á í vandræðum með að stjórna þjóninum", + "feedback-other": "Annað", + "feedback-privacy": "Ábendingin þín, netfangið þitt (ef þú gafst það upp) og aðrar upplýsingar sem koma fram í {openLink}persónuverndarstefnunni{closeLink} verða sendar til starfsfólks Outline.", + "feedback-submit": "Senda", + "feedback-suggestion": "Tillögur", + "feedback-title-generic": "Senda inn ábendingu", + "feedback-title-install": "Uppsetning Outline-þjóns tókst ekki", + "gcp-billing-action": "Áfram", + "gcp-billing-body": "Beðið er eftir að þú {openLink}bætir við greiðslureikningi á Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Opnaðu innheimtusíðu Cloud Console{closeLink} og bættu við reikningi til að halda áfram.", + "gcp-billing-error": "Ekki tókst að sækja greiðsluupplýsingar", + "gcp-billing-error-zero": "Þú þarft að bæta við greiðslureikningi áður en þú heldur áfram.", + "gcp-click-create": "Smelltu á „Búa til (Create)“.", + "gcp-create-new-project": "{openLink}Búa til nýtt Google Cloud-verkefni{closeLink}.", + "gcp-create-new-vm": "{openLink}Búa til nýtt VM-tilvik{closeLink}.", + "gcp-create-project": "Búa til Google Cloud-verkefni", + "gcp-create-server": "Búðu til Google Cloud-verkefni", + "gcp-create-vm": "Búa til VM-tilvik", + "gcp-disconnect-account": "Aftengja Google Cloud Platform-reikning", + "gcp-firewall-create-0": "{openLink}Bættu nýrri eldveggsreglu{closeLink} við Compute Engine-verkefnið.", + "gcp-firewall-create-1": "Sláðu inn „outline“ í reitinn „Heiti (Name)“.", + "gcp-firewall-create-2": "Sláðu inn „outline“ í reitinn „Markmerki (Target tags)“.", + "gcp-firewall-create-3": "Gerð „0.0.0.0/0“ í reitnum „IP-svið uppruna (Source IP ranges)“.", + "gcp-firewall-create-4": "Veldu „Leyfa allt (Allow all)“ undir „Samskiptareglur og gáttir (Protocols and ports)“.", + "gcp-name-your-project": "Gefðu verkefninu heiti í reitnum „Heiti verkefnis (Project name)“.", + "gcp-project-setup-error": "Villa kom upp við uppsetningu Google Cloud-verkefnisins", + "gcp-select-machine-type": "Veldu „f1-micro“ undir „Gerð vélar (Machine type)“", + "gcp-select-networking": "Smelltu á „Stjórnun, öryggi, diskar, net, einkaleiga (Management, security, disks, networking, sole tenancy)“ og síðan á „Net (Networking)“", + "gcp-select-region": "Veldu svæði sem er nálægt notendum þjónsins undir „Svæði (Region)“.", + "gcp-type-network-tag": "Sláðu inn „outline“ í reitinn „Netmerki (Network tags)“", + "gcp-type-outline-server": "Sláðu inn „outline-þjónn (outline-server)“ í reitinn „Heiti (Name)“", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua-sýsla", + "geo-delhi": "Delí", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Djakarta", + "geo-jurong-west": "Vestur-Jurong", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Norður-Virginía", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seúl", + "geo-sg": "Singapúr", + "geo-south-carolina": "Suður-Karólína", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tókýó", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsjá", + "geo-zurich": "Zürich", + "key": "Lykill {keyId}", + "manual-server-assign-firewall": "Úthluta eldveggsreglu", + "manual-server-assign-group": "Úthluta öryggishóp", + "manual-server-create-firewall": "Búa til eldveggsreglu", + "manual-server-create-group": "Búa til öryggishóp", + "manual-server-description": "Eftirfarandi skref hjálpa þér að setja Outline upp á {cloudProvider} Linux-þjóni.", + "manual-server-firewall": "Stilltu eldvegginn þinn", + "manual-server-install-paste": "Límdu úttak uppsetningarinnar hér.", + "manual-server-install-run": "Skráðu þig inn á þjóninn og keyrðu skipunina.", + "manual-server-instructions": "Leiðbeiningar", + "manual-server-show-me": "Sýna mér hvar", + "manual-server-title": "Fylgdu leiðbeiningunum hér fyrir neðan", + "metrics-description": "Deildu nafnlausum mæligildum til að hjálpa okkur að bæta áreiðanleika og afköst Outline fyrir þig og þau sem þú deilir þjóninum með. {openLink}Nánar.{closeLink}", + "metrics-share": "Deila mæligildum", + "metrics-skip": "Sleppa", + "metrics-title": "Deiling mæligilda", + "nav-about": "Um", + "nav-data-collection": "Gagnasöfnun", + "nav-feedback": "Ábending", + "nav-help": "Hjálp", + "nav-licenses": "Leyfi", + "nav-privacy": "Persónuvernd", + "nav-terms": "Skilmálar", + "no-data-limit": "Ekkert", + "notification-app-update": "Uppfærð útgáfa af Outline Manager var sótt. Hún verður sett upp þegar þú endurræsir forritið.", + "notification-feedback-thanks": "Takk fyrir að hjálpa okkur að bæta þjónustuna! Við elskum að heyra frá þér.", + "notification-key-added": "Lykli var bætt við", + "notification-key-removed": "Lykill var fjarlægður", + "notification-server-destroyed": "Þjónn var eyðilagður", + "notification-server-exists": "Þjóni hefur þegar verið bætt við", + "notification-server-removed": "Þjónn var fjarlægður", + "oauth-account-active": "DigitalOcean-reikningurinn þinn er nú virkur.", + "oauth-account-active-tag": "Reikningurinn er nú virkur! Hleður staðsetningum þjóns...", + "oauth-activate-account": "Virkjaðu DigitalOcean-reikninginn þinn.", + "oauth-billing": "Færðu inn greiðsluupplýsingarnar þínar á digitalocean.com og opnaðu forritið aftur þegar því er lokið.", + "oauth-billing-tag": "Sláðu inn greiðsluupplýsingar...", + "oauth-connect-description": "Outline auðveldar þér að búa til þjón og tengjast með reikningnum þínum.", + "oauth-connect-tag": "Bíður eftir að tengja reikninginn þinn...", + "oauth-connect-title": "Skráðu þig inn eða stofnaðu reikning á DigitalOcean.", + "oauth-sign-out": "Skrá út", + "oauth-verify": "Athugaðu hvort tölvupóstur frá DigitalOcean hafi borist þér og smelltu á tengilinn í póstinum til að staðfesta reikninginn.", + "oauth-verify-tag": "Staðfestu netfangið þitt...", + "okay": "Í lagi", + "per-key-data-limit-dialog-set-custom": "Stilla sérsniðin gagnamörk", + "per-key-data-limit-dialog-title": "Gagnamörk – {keyName}", + "region-best-value": "Besta tilboðið", + "region-description": "Héðan muntu upplifa internetið.", + "region-setup": "Setja upp Outline", + "region-title": "Veldu staðsetningu þjónsins.", + "remove": "Fjarlægja", + "retry": "Reyna aftur", + "save": "Vista", + "saved": "Vistað", + "saving": "Vistar...", + "server-access": "Þjónsaðgangur", + "server-access-key-new": "Bæta við nýjum lykli", + "server-access-key-rename": "Endurnefna", + "server-access-keys": "Aðgangslyklar", + "server-connections": "Tengingar", + "server-data-transfer": "Gagnaflutningur / síðustu 30 daga", + "server-data-used": "Notað magn / síðustu í 30 daga", + "server-destroy": "Eyðileggja þjón", + "server-help-access-key-description": "Deildu aðgangslyklum með vinum svo þeir geti tengst Outline-þjóninum þínum. Þeir geta notað sama aðgangslykil í öllum tækjunum sínum.", + "server-help-access-key-next": "Áfram", + "server-help-access-key-title": "Búðu til lykla og deildu aðgangi", + "server-help-connection-description": "Smelltu hér til að setja upp Outline-biðlaraforritið með persónulegum aðgangslykli að Outline-þjóninum þínum.", + "server-help-connection-ok": "Ég skil!", + "server-help-connection-title": "Þú ert ekki tengd(ur) enn!", + "server-keys": "Lyklar", + "server-my-access-key": "Aðgangslykillinn minn", + "server-name": "Outline-þjónn {serverLocation}", + "server-remove": "Fjarlægja þjón", + "server-settings": "Stillingar", + "server-unreachable": "Ekki næst í þjón", + "server-unreachable-description": "Vandamál kom upp við að tengjast þessum þjóni.", + "server-unreachable-managed-description": "Reyndu aftur eða fjarlægðu þjóninn úr forritinu.", + "server-unreachable-manual-description": "Reyndu aftur eða eyðileggðu þjóninn og sýndarhýsilinn.", + "server-usage": "Notkun (síðustu 30 daga)", + "servers-add": "Bæta við þjóni", + "servers-digitalocean": "DigitalOcean-þjónar", + "servers-gcp": "Google Cloud Platform-þjónar", + "servers-manual": "Þjónar", + "settings-access-key-port": "Gátt fyrir nýja aðgangslykla", + "settings-metrics-header": "Deila nafnlausum mæligildum", + "settings-server-api-url": "Vefslóð fyrir forritaskil stjórnunar", + "settings-server-cost": "Mánaðarlegur kostnaður", + "settings-server-creation": "Búið til", + "settings-server-hostname": "Hýsilheiti", + "settings-server-id": "Auðkenni þjóns", + "settings-server-info": "Upplýsingar um þjón", + "settings-server-location": "Staðsetning þjóns", + "settings-server-name": "Heiti", + "settings-server-rename": "Veldu nýtt heiti fyrir þjóninn. Athugaðu að þetta birtist ekki í tækjum þeirra notenda sem þú bauðst að tengjast þjóninum.", + "settings-server-version": "Útgáfa þjóns", + "settings-transfer-limit": "Gagnaflutningsmörk", + "setup-action": "Setja upp", + "setup-advanced": "Ítarlegt", + "setup-anywhere": "Settu upp Outline hvaðan sem er", + "setup-cancel": "Þú getur sagt upp hvenær sem er", + "setup-create": "Búa til þjón", + "setup-description": "Er enginn þjónn til staðar? Stofnaðu DigitalOcean-reikning.", + "setup-do-cost": "Aðeins 6 USD á mánuði", + "setup-do-create": "Búðu til nýjan þjón með DigitalOcean-reikningnum þínum til að fá 1 TB af gagnaflutningi fyrir 6 USD aukalega fyrir hverja 30 daga.", + "setup-do-data": "1 TB gagnaflutningsmörk", + "setup-do-description": "Þetta gæti tekið nokkrar mínútur. Þú getur eyðilagt þjóninn hvenær sem er.", + "setup-do-easiest": "Auðveldasta uppsetningin", + "setup-do-title": "Setur upp Outline.", + "setup-firewall-instructions": "Leiðbeiningar fyrir eldvegg", + "setup-gcp-create": "Búðu til nýjan þjón með Google-reikningnum þínum. Kostnaður er mismunandi eftir staðsetningu og notkun.", + "setup-gcp-easy": "Auðveld uppsetning", + "setup-gcp-free-tier": "Með {openLinkFreeTier}Free Tier{closeLink} kostar fyrsti þjónninn frá {openLinkIpPrice}3 USD á mánuði{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 daga gjaldfrjáls prufuáskrift{closeLink} fyrir nýja notendur", + "setup-gcp-promo": "Prófaðu nýja sjálfvirka ferlið til að búa til Outline-þjón fyrir Google Cloud", + "setup-recommended": "Tillögur", + "setup-simple-commands": "Einfaldar uppsetningarskipanir", + "setup-step-by-step": "Nákvæmar uppsetningarleiðbeiningar", + "setup-tested": "Prófað í VULTR, Linode og Liquid Web", + "setup-title": "Veldu skýjaþjónustu til að setja upp Outline.", + "share-description": "Afritaðu boðið og sendu það með samskiptaverkfæri sem þú treystir. {openLink}Þarftu aðstoð?{closeLink}", + "share-invite-access-key-copied": "Aðgangslykill var afritaður á klippiborð", + "share-invite-copied": "Boð var afritað á klippiborð", + "share-invite-copy": "Afrita boð", + "share-invite-copy-access-key": "Afrita aðgangslykil", + "share-invite-html": "Notaðu þjóninn til að fá öruggan aðgang að opna internetinu:

1) Sæktu og settu Outline-forritið upp í tækinu þínu:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Annar tengill fyrir Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Þú færð sendan aðgangslykil sem hefst á ss://. Þegar þú hefur móttekið aðgangslykilinn skaltu afrita hann.

3) Opnaðu Outline Client-forritið. Ef aðgangslykillinn greinist sjálfkrafa skaltu ýta á „Tengja (Connect)“ til að halda áfram. Ef aðgangslykillinn greinist ekki sjálfkrafa skaltu líma hann í reitinn og ýta síðan á „Tengja (Connect)“ til að halda áfram.

Nú er allt klárt og þú getur notað opna internetið! Til að ganga úr skugga um að tenging við þjóninn hafi tekist skaltu prófa að slá inn „what is my ip“ í Google-leit. IP-talan sem kemur upp á Google ætti að vera sú sama og IP-talan í Outline Client.

Nánar um Outline hér: https://getoutline.org/", + "share-invite-instructions": "Fylgdu leiðbeiningunum okkar um boð á GitHub:", + "share-invite-trouble": "Ertu í vandræðum með að opna boðstengilinn?", + "share-title": "Deila aðgangi", + "survey-data-limits-title": "Hjálpaðu okkur að skilja hvernig við getum bætt gagnamörk", + "survey-decline": "Hafna", + "survey-disclaimer": "Ef þú smellir á „Halda áfram (Continue)“ verður þér beint á stutta könnun í Google-eyðublöðum. Við mælum með að svara könnuninni á meðan þú ert tengd(ur) við Outline.", + "survey-go-to-survey": "Opna könnun", + "terms-of-service": "Ég hef lesið og skil {openLink}þjónustuskilmála Outline{closeLink}" +} diff --git a/server_manager/messages/it.json b/server_manager/messages/it.json new file mode 100644 index 0000000000..ca7c6286cc --- /dev/null +++ b/server_manager/messages/it.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline è un progetto open source creato da Jigsaw per fornire alle agenzie di stampa e ai giornalisti un modo più sicuro di accedere a Internet.

Outline si basa su Shadowsocks ed è un prodotto ancora in fase di sviluppo. Puoi contribuire a creare il codice su GitHub e seguirci su Reddit e Medium per sapere quando ci espanderemo su altre piattaforme e aggiungeremo nuove funzionalità.", + "about-version": "Versione {version}", + "aws-lightsail-firewall-0": "Vai alla schermata delle istanze {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Fai clic sull'istanza sulla quale vuoi ospitare Outline.", + "aws-lightsail-firewall-2": "Vai alla scheda \"Networking\" (Networking).", + "aws-lightsail-firewall-3": "Nella sezione \"Firewall\" (Firewall), fai clic su \"Aggiungi un altro\" (Add another).", + "aws-lightsail-firewall-4": "Imposta il valore \"Applicazione\" (Application) su \"Tutto TCP+UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Fai clic su \"Salva\" (Save).", + "cancel": "Annulla", + "close": "Chiudi", + "confirmation-server-destroy": "Gli utenti esistenti perderanno l'accesso. L'azione non può essere annullata.", + "confirmation-server-destroy-title": "Eliminare il server?", + "confirmation-server-remove": "Questa azione rimuove il server da Outline Manager, ma non blocca l'accesso proxy per gli utenti. Dovrai eliminare manualmente il server Outline dal computer host.", + "confirmation-server-remove-title": "Rimuovere il server?", + "data-limit": "Limite dati", + "data-limit-per-key": "Limite dati per chiave", + "data-limits": "Limiti dati", + "data-limits-description": "Imposta un limite di trasferimento dei dati di 30 giorni per le chiavi di accesso su questo server.", + "data-limits-dialog-text": "Vai alla scheda Impostazioni per impostare un limite di trasferimento dei dati per le chiavi di accesso su questo server.", + "data-limits-dialog-title": "Evita l'eccedenza di dati", + "data-limits-disclaimer": "Dato che al momento invii rapporti sulle metriche, sarà incluso l'uso della funzionalità dei limiti di dati. Per ulteriori dettagli, consulta le {openLink}norme relative alla raccolta dei dati{closeLink}.", + "data-limits-usage": "Dati utilizzati: {used} su {total}", + "destroy": "Elimina", + "digitalocean-disconnect-account": "Disconnetti account DigitalOcean", + "digitalocean-unreachable": "L'errore potrebbe essere dovuto a un firewall sulla rete o a problemi di connettività momentanei su digitalocean.com.", + "disabled": "Disattivata", + "disconnect": "Disconnetti", + "done": "Fine", + "enabled": "Attivata", + "error-connectivity": "Stiamo avendo problemi di connessione al tuo account DigitalOcean. Potrebbe essere un problema momentaneo di DigitalOcean o della tua connessione a Internet. Se riprovi ma il problema persiste, dovresti riuscire a risolverlo eseguendo di nuovo l'accesso a DigitalOcean.", + "error-connectivity-title": "Problema di connessione", + "error-do-account-info": "Recupero informazioni account DigitalOcean non riuscita", + "error-do-auth": "Autenticazione con DigitalOcean non riuscita", + "error-do-limit": "Il tuo account DigitalOcean ha raggiunto il limite di {num} droplet. Puoi richiedere un aumento all'indirizzo https://cloud.digitalocean.com/account/team/droplet_limit_increment", + "error-do-regions": "Impossibile recuperare l'elenco delle aree disponibili", + "error-do-warning": "Avviso di DigitalOcean: \"{message}\"", + "error-feedback": "Impossibile inviare il feedback. Riprova.", + "error-gcp-auth": "Autenticazione su Google Cloud Platform non riuscita", + "error-hostname-invalid": "Deve essere un nome host valido o un indirizzo IP.", + "error-key-add": "Impossibile aggiungere la chiave", + "error-key-remove": "Impossibile rimuovere la chiave", + "error-key-rename": "Impossibile rinominare la chiave", + "error-keys-get": "Impossibile caricare le chiavi", + "error-keys-port-bad-input": "La porta deve avere un numero intero compreso fra 1 e 65.535.", + "error-keys-port-in-use": "La porta è già in uso sul server.", + "error-licenses": "Impossibile caricare le licenze.", + "error-metrics": "Errore durante l'attivazione delle metriche", + "error-network": "Si è verificato un errore di rete.", + "error-not-saved": "Salvataggio non riuscito", + "error-remove-data-limit": "Impossibile disattivare il limite dati predefinito", + "error-remove-per-key-limit": "Impossibile rimuovere un limite dati da questa chiave di accesso", + "error-server-creation": "Si è verificato un errore durante la creazione del server Outline.", + "error-server-destroy": "Eliminazione server non riuscita", + "error-server-removed": "{serverName} non è più presente nel tuo account DigitalOcean.", + "error-server-rename": "Impossibile rinominare il server", + "error-server-unreachable": "Il server Outline è stato installato correttamente, ma non riusciamo a collegarci. Il problema è dovuto probabilmente alle regole del firewall del server che bloccano le connessioni in arrivo. Controllale e assicurati di consentire le connessioni TCP in arrivo sulle porte da 1024 a 65535.", + "error-server-unreachable-title": "Impossibile collegarsi al server Outline", + "error-servers-removed": "{serverNames} non è più presente nel tuo account DigitalOcean.", + "error-set-data-limit": "Impossibile impostare il limite dati predefinito", + "error-set-per-key-limit": "Impossibile impostare un limite dati per questa chiave di accesso", + "error-unexpected": "Si è verificato un errore imprevisto.", + "experimental": "Sperimentale", + "experiments": "Sperimentali", + "experiments-description": "Testa nuove funzionalità e inviaci un feedback prima del lancio.", + "experiments-disclaimer": "Le funzionalità sperimentali sono in fase di sviluppo e potrebbero subire modifiche o essere rimosse dall'app. Se al momento utilizzi rapporti sulle metriche, l'uso di funzionalità sperimentali verrà incluso. Per ulteriori dettagli, consulta le {openLink}norme relative alla raccolta dei dati{closeLink}.", + "experiments-feedback": "Hai qualche suggerimento? {openLink}Invia qui il tuo feedback.{closeLink}", + "feedback-cloud-provider": "Seleziona fornitore cloud", + "feedback-cloud-provider-error": "Seleziona un provider cloud.", + "feedback-connection": "Non riesco a connettermi al server", + "feedback-connection-others": "Altre persone non riescono a connettersi al mio server", + "feedback-disclaimer": "Tieni presente che il nostro team risponde ai feedback solo in inglese.", + "feedback-email": "Indirizzo email (facoltativo)", + "feedback-error": "Inserisci il tuo feedback.", + "feedback-explanation-install": "Si è verificato un errore durante il tentativo di installazione di Outline sul server. Se non hai trovato una soluzione, puoi inviarci il tuo feedback e il tuo indirizzo email (facoltativo) per permetterci di ricontattarti.", + "feedback-general": "Feedback generico", + "feedback-install": "Hai problemi con l'installazione di Outline?", + "feedback-label": "Il tuo feedback", + "feedback-management": "Ho problemi con la gestione del server", + "feedback-other": "Altro", + "feedback-privacy": "Il tuo feedback, l'indirizzo email (se fornito) e le informazioni aggiuntive a cui si fa riferimento nelle {openLink}norme sulla privacy{closeLink} saranno inviati al team di Outline.", + "feedback-submit": "Invia", + "feedback-suggestion": "Suggerimenti", + "feedback-title-generic": "Invia feedback", + "feedback-title-install": "Installazione server Outline non riuscita", + "gcp-billing-action": "Avanti", + "gcp-billing-body": "In attesa dell'{openLink}aggiunta di un account di fatturazione su Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Per procedere, devi aprire la pagina di fatturazione di Cloud Console{closeLink} e aggiungere un account.", + "gcp-billing-error": "Impossibile recuperare i dati di fatturazione", + "gcp-billing-error-zero": "Per poter procedere devi aggiungere un account di fatturazione.", + "gcp-click-create": "Fai clic su \"Crea\" (Create).", + "gcp-create-new-project": "{openLink}Crea un nuovo progetto Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Creare a una nuova istanza VM{closeLink}.", + "gcp-create-project": "Crea un progetto Google Cloud", + "gcp-create-server": "Creare il progetto Google Cloud", + "gcp-create-vm": "Creare un'istanza VM", + "gcp-disconnect-account": "Disconnetti l'account Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Aggiungi una nuova regola di firewall{closeLink} al tuo progetto Compute Engine.", + "gcp-firewall-create-1": "Digita \"Outline\" nel campo \"Nome\" (Name).", + "gcp-firewall-create-2": "Digita \"Outline\" nel campo \"Tag di destinazione\" (Target tags).", + "gcp-firewall-create-3": "Digita \"0.0.0.0/0\" nel campo \"Intervalli IP di origine\" (Source IP ranges).", + "gcp-firewall-create-4": "Seleziona \"Consenti tutto\" (Allow all) nella sezione \"Protocolli e porte\" (Protocols and ports).", + "gcp-name-your-project": "Dai un nome al tuo progetto nel campo \"Nome progetto\" (Project name).", + "gcp-project-setup-error": "Si è verificato un errore durante la configurazione del progetto Google Cloud", + "gcp-select-machine-type": "Seleziona \"f1-micro\" nella sezione \"Tipo di macchina\" (Machine type)", + "gcp-select-networking": "Fai clic su \"Gestione, sicurezza, dischi, networking, single-tenancy (Management, security, disks, networking, sole tenancy), quindi \"Networking\" (Networking)", + "gcp-select-region": "Nella sezione \"Regione\" (Region) seleziona una regione vicina a quella in cui si trovano gli utenti del server.", + "gcp-type-network-tag": "Digita \"outline\" nel campo \"Tag di rete\" (Network tags)", + "gcp-type-outline-server": "Digita \"outline-server\" nel campo \"Nome\" (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Contea di Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Francoforte", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Giacarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londra", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Virginia del Nord", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "San Paolo", + "geo-seoul": "Seul", + "geo-sg": "Singapore", + "geo-south-carolina": "Carolina del Sud", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsavia", + "geo-zurich": "Zurigo", + "key": "Chiave {keyId}", + "manual-server-assign-firewall": "Assegna regola firewall", + "manual-server-assign-group": "Assegna gruppo di sicurezza", + "manual-server-create-firewall": "Crea una regola del firewall", + "manual-server-create-group": "Crea un gruppo di sicurezza", + "manual-server-description": "Questi passaggi ti aiuteranno a installare Outline su un server Linux {cloudProvider}.", + "manual-server-firewall": "Configura il firewall", + "manual-server-install-paste": "Incolla qui l'output dell'installazione.", + "manual-server-install-run": "Accedi al server ed esegui questo comando.", + "manual-server-instructions": "Istruzioni", + "manual-server-show-me": "Mostrami dove", + "manual-server-title": "Segui le istruzioni qui sotto", + "metrics-description": "Condividi metriche anonime per contribuire a migliorare l'affidabilità e le prestazioni di Outline, per te e per le persone con cui condividi il tuo server. {openLink}Ulteriori informazioni.{closeLink}", + "metrics-share": "Condividi metriche", + "metrics-skip": "Salta", + "metrics-title": "Condivisione metriche", + "nav-about": "Informazioni", + "nav-data-collection": "Raccolta dei dati", + "nav-feedback": "Feedback", + "nav-help": "Guida", + "nav-licenses": "Licenze", + "nav-privacy": "Privacy", + "nav-terms": "Termini di servizio", + "no-data-limit": "Nessuno", + "notification-app-update": "È stata scaricata una versione aggiornata di Outline Manager. Verrà installata al riavvio dell'applicazione.", + "notification-feedback-thanks": "Grazie per averci aiutato a migliorare i nostri servizi. La tua opinione è importante per noi.", + "notification-key-added": "Chiave aggiunta", + "notification-key-removed": "Chiave rimossa", + "notification-server-destroyed": "Server eliminato", + "notification-server-exists": "Il server è già stato aggiunto", + "notification-server-removed": "Server rimosso", + "oauth-account-active": "Il tuo account DigitalOcean è stato attivato.", + "oauth-account-active-tag": "Account attivato. Caricamento località server…", + "oauth-activate-account": "Attiva il tuo account DigitalOcean.", + "oauth-billing": "Inserisci i tuoi dati di fatturazione per digitalocean.com e torna all'app quando hai fatto.", + "oauth-billing-tag": "Inserisci dati di fatturazione…", + "oauth-connect-description": "Con il tuo account, Outline semplifica la creazione di un server e la connessione.", + "oauth-connect-tag": "Attesa connessione account…", + "oauth-connect-title": "Accedi o crea un account con DigitalOcean.", + "oauth-sign-out": "Esci", + "oauth-verify": "Controlla se nella tua Posta in arrivo hai ricevuto un'email da DigitalOcean, quindi fai clic sul link per confermare l'account.", + "oauth-verify-tag": "Conferma il tuo indirizzo email…", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Imposta un limite dati personalizzato", + "per-key-data-limit-dialog-title": "Limite dati: {keyName}", + "region-best-value": "Massima convenienza", + "region-description": "Questa è la località da cui proverrà la tua esperienza Internet.", + "region-setup": "Configura Outline", + "region-title": "Seleziona la località del server.", + "remove": "Rimuovi", + "retry": "Riprova", + "save": "Salva", + "saved": "Salvataggio riuscito", + "saving": "Salvataggio…", + "server-access": "Accesso server", + "server-access-key-new": "Aggiungi nuova chiave", + "server-access-key-rename": "Rinomina", + "server-access-keys": "Chiavi di accesso", + "server-connections": "Connessioni", + "server-data-transfer": "Dati trasferiti/ultimi 30 giorni", + "server-data-used": "Quantità usata/ultimi 30 giorni", + "server-destroy": "Elimina server", + "server-help-access-key-description": "Condividi le chiavi di accesso con gli amici in modo che possano collegarsi al tuo server Outline. Potranno usare la stessa chiave di accesso su tutti i loro dispositivi.", + "server-help-access-key-next": "Avanti", + "server-help-access-key-title": "Crea chiavi, condividi l'accesso", + "server-help-connection-description": "Fai clic qui per installare l'app client Outline usando la tua chiave di accesso personale al server Outline.", + "server-help-connection-ok": "OK", + "server-help-connection-title": "La connessione non è ancora attiva.", + "server-keys": "Chiavi", + "server-my-access-key": "La mia chiave di accesso", + "server-name": "Server Outline {serverLocation}", + "server-remove": "Rimuovi server", + "server-settings": "Impostazioni", + "server-unreachable": "Server non raggiungibile", + "server-unreachable-description": "Problemi di collegamento al server.", + "server-unreachable-managed-description": "Riprova o rimuovi il server dall'applicazione.", + "server-unreachable-manual-description": "Riprova oppure elimina questo server e l'host virtuale.", + "server-usage": "Utilizzo (ultimi 30 giorni)", + "servers-add": "Aggiungi server", + "servers-digitalocean": "Server DigitalOcean", + "servers-gcp": "Server Google Cloud Platform", + "servers-manual": "Server", + "settings-access-key-port": "Porta per le nuove chiavi di accesso", + "settings-metrics-header": "Condividi metriche anonime", + "settings-server-api-url": "URL API di gestione", + "settings-server-cost": "Tariffa mensile", + "settings-server-creation": "Data creazione", + "settings-server-hostname": "Nome host", + "settings-server-id": "ID server", + "settings-server-info": "Informazioni server", + "settings-server-location": "Posizione server", + "settings-server-name": "Nome", + "settings-server-rename": "Imposta un nuovo nome per il server. Tieni presente che questo non interesserà i dispositivi degli utenti invitati a connettersi al server.", + "settings-server-version": "Versione server", + "settings-transfer-limit": "Quantità consentita trasferimento dati", + "setup-action": "Configura", + "setup-advanced": "Avanzate", + "setup-anywhere": "Configura Outline ovunque", + "setup-cancel": "Puoi annullare quando vuoi", + "setup-create": "Crea server", + "setup-description": "Non hai un server? Crea un account con DigitalOcean.", + "setup-do-cost": "Solo 6 $ al mese", + "setup-do-create": "Crea un nuovo server con il tuo account DigitalOcean al costo di 6 $/30 giorni per 1 TB di trasferimento dati.", + "setup-do-data": "Quantità di trasferimento dati consentita: 1 TB", + "setup-do-description": "Potrebbero essere necessari diversi minuti. Puoi eliminare il server in qualsiasi momento.", + "setup-do-easiest": "Procedura di configurazione più semplice", + "setup-do-title": "Configurazione di Outline.", + "setup-firewall-instructions": "Istruzioni Firewall", + "setup-gcp-create": "Crea un nuovo server con il tuo Account Google. I costi variano in base al luogo e all'utilizzo.", + "setup-gcp-easy": "Processo di configurazione semplice", + "setup-gcp-free-tier": "Con il programma {openLinkFreeTier}Livello gratuito{closeLink}, il tuo primo server inizia a {openLinkIpPrice}3 $ al mese{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}prova di 90 giorni{closeLink} per i nuovi utenti", + "setup-gcp-promo": "Prova il nuovo processo di creazione automatico del server Outline per Google Cloud", + "setup-recommended": "Consigliato", + "setup-simple-commands": "Semplici comandi di installazione", + "setup-step-by-step": "Guida di configurazione dettagliata", + "setup-tested": "Testato su VULTR, Linode e Liquid Web", + "setup-title": "Scegli un servizio cloud per configurare Outline.", + "share-description": "Copia l'invito e invialo da uno strumento di comunicazione attendibile. {openLink}Hai bisogno di aiuto?{closeLink}", + "share-invite-access-key-copied": "Chiave di accesso copiata negli appunti", + "share-invite-copied": "Invito copiato negli appunti", + "share-invite-copy": "Copia invito", + "share-invite-copy-access-key": "Copia chiave di accesso", + "share-invite-html": "Utilizza questo server per accedere in modo sicuro alle reti Internet aperte:

1) Scarica e installa l'app Outline per il tuo dispositivo:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Link alternativo Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Riceverai una chiave di accesso che inizia con ss://. Una volta ricevuta, copia la chiave di accesso.

3) Apri l'app client Outline. Se la chiave di accesso viene rilevata automaticamente, tocca \"Connetti\" e procedi. Se non viene rilevata automaticamente, incolla la chiave di accesso nel campo, quindi tocca \"Connetti\" e procedi.

È tutto pronto per utilizzare la rete Internet aperta. Per assicurarti di avere stabilito correttamente la connessione al server, prova a cercare \"what is my ip\" nella Ricerca Google. L'indirizzo IP mostrato su Google deve corrispondere all'indirizzo IP nel client Outline.

Scopri di più su Outline qui: https://getoutline.org/", + "share-invite-instructions": "Segui le istruzioni di invito su GitHub:", + "share-invite-trouble": "Non riesci ad accedere al link di invito?", + "share-title": "Condividi accesso", + "survey-data-limits-title": "Aiutaci a capire come migliorare i limiti dati", + "survey-decline": "Rifiuta", + "survey-disclaimer": "Facendo clic su Continua verrai indirizzato a un breve sondaggio relativo a Moduli Google. Consigliamo di fare il sondaggio mentre sei connesso a Outline.", + "survey-go-to-survey": "Vai al sondaggio", + "terms-of-service": "Ho letto e compreso i {openLink}Termini di servizio di Outline{closeLink}" +} diff --git a/server_manager/messages/ja.json b/server_manager/messages/ja.json new file mode 100644 index 0000000000..3c8f570359 --- /dev/null +++ b/server_manager/messages/ja.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline は、報道機関やジャーナリストに安全なインターネット アクセスの手段を提供するために、Jigsaw によって作成されたオープンソースのプロジェクトです。

Outline は Shadowsocks を利用しており、現在はまだ初期段階のサービスです。GitHub でコードを投稿できます。また、RedditMedium でフォローしていただくと、対象プラットフォームの拡大や新機能の追加などのお知らせをご覧いただけます。", + "about-version": "バージョン {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} インスタンスの画面に移動します。", + "aws-lightsail-firewall-1": "Outline をホストするインスタンスをクリックします。", + "aws-lightsail-firewall-2": "[ネットワーク(Networking)] タブに移動します。", + "aws-lightsail-firewall-3": "[ファイアウォール(Firewall)] で [追加(Add another)] をクリックします。", + "aws-lightsail-firewall-4": "[アプリケーション(Application)] の値を「All TCP+UDP」に設定します。", + "aws-lightsail-firewall-5": "[保存(Save)] をクリックします。", + "cancel": "キャンセル", + "close": "閉じる", + "confirmation-server-destroy": "既存のユーザーはアクセスできなくなります。この操作を元に戻すことはできません。", + "confirmation-server-destroy-title": "サーバーを削除しますか?", + "confirmation-server-remove": "この操作を実行すると、Outline マネージャーからサーバーが除外されますが、ユーザーへのプロキシ アクセスはブロックされません。ブロックするには、ホストマシンから Outline サーバーを手動で削除する必要があります。", + "confirmation-server-remove-title": "サーバーを除外しますか?", + "data-limit": "データの上限", + "data-limit-per-key": "キーあたりのデータの上限", + "data-limits": "データの上限", + "data-limits-description": "このサーバーのアクセスキーに対して、データ転送量の上限の追跡期間を 30 日に設定しました。", + "data-limits-dialog-text": "[設定] に移動して、このサーバーのアクセスキーに対するデータ転送量の上限を設定します。", + "data-limits-dialog-title": "過剰なデータ転送の回避", + "data-limits-disclaimer": "現在指標をレポートしているため、データ制限機能の使用が含まれることになります。詳しくは、{openLink}データ収集ポリシー{closeLink}をご覧ください。", + "data-limits-usage": "使用量: {used}/{total}", + "destroy": "削除", + "digitalocean-disconnect-account": "DigitalOcean アカウントの接続を解除する", + "digitalocean-unreachable": "このエラーは、ネットワーク上のファイアウォール、または digitalocean.com への一時的な接続の問題が原因で発生している可能性があります。", + "disabled": "無効", + "disconnect": "接続を切断", + "done": "完了", + "enabled": "有効", + "error-connectivity": "DigitalOcean アカウントへの接続に問題があります。DigitalOcean やインターネット接続で一時的な問題が発生している可能性があります。再試行しても接続できない場合は、DigitalOcean にもう一度ログインしてみてください。", + "error-connectivity-title": "接続の問題", + "error-do-account-info": "DigitalOcean アカウントの情報を取得できませんでした", + "error-do-auth": "DigitalOcean での認証に失敗しました", + "error-do-limit": "DigitalOcean アカウントが上限の {num} ドロップレットに達しました。上限の引き上げは https://cloud.digitalocean.com/account/team/droplet_limit_increase でリクエストできます", + "error-do-regions": "利用可能なリージョンのリストを取得できませんでした", + "error-do-warning": "DigitalOcean の警告: 「{message}」", + "error-feedback": "フィードバックを送信できませんでした。もう一度お試しください。", + "error-gcp-auth": "Google Cloud Platform を認証できませんでした", + "error-hostname-invalid": "IP アドレスまたは有効なホスト名を入力する必要があります。", + "error-key-add": "キーを追加できませんでした", + "error-key-remove": "キーを削除できませんでした", + "error-key-rename": "キーの名前を変更できませんでした", + "error-keys-get": "キーを読み込めませんでした", + "error-keys-port-bad-input": "ポートには 1~65,535 の整数を指定してください。", + "error-keys-port-in-use": "このポートはサーバーですでに使用されています。", + "error-licenses": "ライセンスを読み込めませんでした。", + "error-metrics": "指標を有効にする際にエラーが発生しました", + "error-network": "ネットワーク エラーが発生しました。", + "error-not-saved": "保存できませんでした", + "error-remove-data-limit": "デフォルトのデータの上限を無効にできませんでした", + "error-remove-per-key-limit": "このアクセスキーからデータの上限を削除できませんでした", + "error-server-creation": "Outline サーバーの作成時にエラーが発生しました。", + "error-server-destroy": "サーバーを削除できませんでした", + "error-server-removed": "現在、{serverName} はお使いの DigitalOcean アカウントに存在しません。", + "error-server-rename": "サーバーの名前を変更できませんでした", + "error-server-unreachable": "Outline サーバーは正常にインストールされましたが、サーバーに接続できません。この原因は多くの場合、サーバーのファイアウォール ルールで接続がブロックされていることです。ルールを確認し、ポート範囲 1024~65535 で TCP の着信接続が許可されていることを確かめてください。", + "error-server-unreachable-title": "Outline サーバーに接続できません", + "error-servers-removed": "現在、{serverNames} はお使いの DigitalOcean アカウントに存在しません。", + "error-set-data-limit": "デフォルトのデータの上限を設定できませんでした", + "error-set-per-key-limit": "このアクセスキーにデータの上限を設定できませんでした", + "error-unexpected": "予期しないエラーが発生しました。", + "experimental": "試験運用版", + "experiments": "試験運用機能", + "experiments-description": "新機能がリリースされる前にテストを行い、フィードバックをお送りください。", + "experiments-disclaimer": "試験運用機能は開発中であるため、変更されたり、アプリから削除されることがあります。現在、指標をレポートしている場合は、試験運用機能の使用が指標に含まれることになります。詳しくは、{openLink}データ収集ポリシー{closeLink}をご覧ください。", + "experiments-feedback": "ご意見やご提案がございましたら、{openLink}こちらからフィードバックをお送りください{closeLink}。", + "feedback-cloud-provider": "クラウド プロバイダを選択", + "feedback-cloud-provider-error": "クラウド プロバイダを選択してください。", + "feedback-connection": "サーバーに接続できない", + "feedback-connection-others": "他のユーザーがサーバーに接続できない", + "feedback-disclaimer": "フィードバックへの回答は英語のみとなります。あらかじめご了承ください。", + "feedback-email": "メールアドレス(省略可)", + "feedback-error": "フィードバックを入力してください。", + "feedback-explanation-install": "サーバーに Outline をインストールする際にエラーが発生しました。解決策が見つからない場合は、Google にフィードバックをお送りください。また、Google からご連絡を差し上げられるようにメールアドレス(任意)もご記入ください。", + "feedback-general": "一般的なフィードバック", + "feedback-install": "Outline のインストールで問題が発生した", + "feedback-label": "フィードバック", + "feedback-management": "サーバーの管理で問題が発生した", + "feedback-other": "その他", + "feedback-privacy": "フィードバック、メールアドレス(入力した場合)、{openLink}プライバシー ポリシー{closeLink}に記載されているその他の情報が、Outline チームに送信されます。", + "feedback-submit": "送信", + "feedback-suggestion": "提案", + "feedback-title-generic": "フィードバックの送信", + "feedback-title-install": "Outline サーバーをインストールできませんでした", + "gcp-billing-action": "次へ", + "gcp-billing-body": "{openLink}Google Cloud に請求先アカウントを追加{closeLink}してください", + "gcp-billing-description": "続行するには、{openLink}Cloud コンソールのお支払いとご請求ページを開いて{closeLink}アカウントを追加します。", + "gcp-billing-error": "お支払い情報を取得できません", + "gcp-billing-error-zero": "続行する前に請求先アカウントを追加する必要があります。", + "gcp-click-create": "[作成(Create)] をクリックします。", + "gcp-create-new-project": "{openLink}新しい Google Cloud プロジェクトを作成します{closeLink}。", + "gcp-create-new-vm": "{openLink}新しい VM インスタンスを作成します{closeLink}。", + "gcp-create-project": "Google Cloud プロジェクトを作成する", + "gcp-create-server": "Google Cloud プロジェクトを作成する", + "gcp-create-vm": "VM インスタンスを作成する", + "gcp-disconnect-account": "Google Cloud Platform アカウントへの接続が解除されました", + "gcp-firewall-create-0": "Compute Engine プロジェクトに{openLink}新しいファイアウォール ルールを追加{closeLink}します。", + "gcp-firewall-create-1": "[名前(Name)] 欄に「outline」と入力します。", + "gcp-firewall-create-2": "[ターゲットタグ(Target tags)] 欄に「outline」と入力します。", + "gcp-firewall-create-3": "[ソース IP の範囲(Source IP ranges)] 欄に「0.0.0.0/0」と入力します。", + "gcp-firewall-create-4": "[プロトコルとポート(Protocols and ports)] で [すべて許可(Allow all)] を選択します。", + "gcp-name-your-project": "[プロジェクト名(Project name)] にプロジェクトの名前を入力します。", + "gcp-project-setup-error": "Google Cloud プロジェクトのセットアップ中にエラーが発生しました", + "gcp-select-machine-type": "[マシンタイプ(Machine type)] で [f1-micro] を選択します", + "gcp-select-networking": "[管理、セキュリティ、ディスク、ネットワーク、単一テナント(Management, security, disks, networking, sole tenancy)]、[ネットワーク(Networking)] の順にクリックします。", + "gcp-select-region": "[リージョン(Region)] でユーザーに近いリージョンをサーバーの配置先として選択します。", + "gcp-type-network-tag": "[ネットワーク タグ(Network tags)] に「Outline」と入力します", + "gcp-type-outline-server": "[名前(Name)] に「outline-server」と入力します。", + "geo-amsterdam": "アムステルダム", + "geo-bangalore": "バンガロール", + "geo-changhua-county": "彰化県", + "geo-delhi": "デリー", + "geo-eemshaven": "エームスハーヴェン", + "geo-frankfurt": "フランクフルト", + "geo-hamina": "ハミナ", + "geo-hk": "香港", + "geo-iowa": "アイオワ", + "geo-jakarta": "ジャカルタ", + "geo-jurong-west": "ジュロン ウエスト", + "geo-las-vegas": "ラスベガス", + "geo-london": "ロンドン", + "geo-los-angeles": "ロサンゼルス", + "geo-melbourne": "メルボルン", + "geo-montreal": "モントリオール", + "geo-mumbai": "ムンバイ", + "geo-new-york-city": "ニューヨーク", + "geo-northern-virginia": "北バージニア", + "geo-oregon": "オレゴン", + "geo-osaka": "大阪", + "geo-salt-lake-city": "ソルトレイクシティ", + "geo-san-francisco": "サンフランシスコ", + "geo-sao-paulo": "サンパウロ", + "geo-seoul": "ソウル", + "geo-sg": "シンガポール", + "geo-south-carolina": "サウス カロライナ", + "geo-st-ghislain": "サンギスラン", + "geo-sydney": "シドニー", + "geo-tokyo": "東京", + "geo-toronto": "トロント", + "geo-warsaw": "ワルシャワ", + "geo-zurich": "チューリッヒ", + "key": "キー: {keyId}", + "manual-server-assign-firewall": "ファイアウォール ルールの割り当て", + "manual-server-assign-group": "セキュリティ グループの割り当て", + "manual-server-create-firewall": "ファイアウォール ルールの作成", + "manual-server-create-group": "セキュリティ グループの作成", + "manual-server-description": "この手順で {cloudProvider} の Linux サーバーに Outline をインストールできます。", + "manual-server-firewall": "ファイアウォールの設定", + "manual-server-install-paste": "インストール時の出力をここに貼り付けます。", + "manual-server-install-run": "サーバーにログインして、このコマンドを実行します。", + "manual-server-instructions": "手順", + "manual-server-show-me": "サーバーの場所を表示", + "manual-server-title": "次の手順を実行してください", + "metrics-description": "Outline の信頼性とパフォーマンスを改善するために、匿名化した指標を共有しましょう。あなた自身にも、サーバーを共有する他のユーザーにもメリットがあります。{openLink}詳細{closeLink}", + "metrics-share": "指標を共有", + "metrics-skip": "スキップ", + "metrics-title": "指標の共有", + "nav-about": "概要", + "nav-data-collection": "データ収集", + "nav-feedback": "フィードバック", + "nav-help": "ヘルプ", + "nav-licenses": "ライセンス", + "nav-privacy": "プライバシー", + "nav-terms": "利用規約", + "no-data-limit": "なし", + "notification-app-update": "最新バージョンの Outline マネージャーをダウンロードしました。アプリケーションを再起動するとインストールされます。", + "notification-feedback-thanks": "フィードバックをお送りいただきありがとうございます。Google のサービス向上にご協力いただき感謝いたします。", + "notification-key-added": "キーを追加しました", + "notification-key-removed": "キーを削除しました", + "notification-server-destroyed": "サーバーを削除しました", + "notification-server-exists": "サーバーはすでに追加されています", + "notification-server-removed": "サーバーを除外しました", + "oauth-account-active": "DigitalOcean アカウントが有効になりました。", + "oauth-account-active-tag": "アカウントが有効になりました。サーバーの場所を読み込んでいます...", + "oauth-activate-account": "DigitalOcean アカウントを有効にします。", + "oauth-billing": "digitalocean.com でお支払い情報を入力し、完了したらアプリに戻ります。", + "oauth-billing-tag": "お支払い情報を入力します...", + "oauth-connect-description": "アカウントを使用して Outline で簡単にサーバーを作成したり、サーバーに接続したりできます。", + "oauth-connect-tag": "アカウントへの接続を待機しています...", + "oauth-connect-title": "DigitalOcean にログインするか、アカウントを作成します。", + "oauth-sign-out": "ログアウト", + "oauth-verify": "受信トレイにある DigitalOcean からのメールを表示し、メール内のリンクをクリックしてアカウントを確認します。", + "oauth-verify-tag": "メールアドレスを確認してください...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "データの上限をカスタム設定する", + "per-key-data-limit-dialog-title": "データの上限 - {keyName}", + "region-best-value": "おすすめ", + "region-description": "インターネット環境を提供するサーバーの場所です。", + "region-setup": "Outline をセットアップ", + "region-title": "サーバーの場所を選択します。", + "remove": "削除", + "retry": "再試行", + "save": "保存", + "saved": "保存しました", + "saving": "保存しています...", + "server-access": "サーバーへのアクセス", + "server-access-key-new": "新しいキーを追加", + "server-access-key-rename": "名前を変更", + "server-access-keys": "アクセスキー", + "server-connections": "接続", + "server-data-transfer": "過去 30 日間のデータ転送量", + "server-data-used": "過去 30 日間の使用割り当て量", + "server-destroy": "サーバーを削除", + "server-help-access-key-description": "他のユーザーが Outline サーバーに接続できるよう、アクセスキーを共有します。すべてのデバイスで同じアクセスキーを使用できます。", + "server-help-access-key-next": "次へ", + "server-help-access-key-title": "キーの作成とアクセスの共有", + "server-help-connection-description": "ここをクリックして Outline クライアント アプリをインストールし、個人のアクセスキーを使用して Outline サーバーに接続します。", + "server-help-connection-ok": "OK", + "server-help-connection-title": "まだ接続していません", + "server-keys": "キー", + "server-my-access-key": "アクセスキー", + "server-name": "{serverLocation} の Outline サーバー", + "server-remove": "サーバーを除外", + "server-settings": "設定", + "server-unreachable": "サーバーに接続できません", + "server-unreachable-description": "このサーバーへの接続に問題があります。", + "server-unreachable-managed-description": "もう一度お試しいただくか、アプリケーションからこのサーバーを除外してください。", + "server-unreachable-manual-description": "もう一度お試しいただくか、このサーバーと仮想ホストを削除してください。", + "server-usage": "使用量(過去 30 日間)", + "servers-add": "サーバーを追加", + "servers-digitalocean": "DigitalOcean サーバー", + "servers-gcp": "Google Cloud Platform サーバー", + "servers-manual": "サーバー", + "settings-access-key-port": "新しいアクセスキー用のポート", + "settings-metrics-header": "匿名化された指標の共有", + "settings-server-api-url": "Management API の URL", + "settings-server-cost": "月額料金", + "settings-server-creation": "作成日", + "settings-server-hostname": "ホスト名", + "settings-server-id": "サーバー ID", + "settings-server-info": "サーバー情報", + "settings-server-location": "サーバーの場所", + "settings-server-name": "名前", + "settings-server-rename": "サーバーの新しい名前を設定します。サーバーへの接続の招待を受けたユーザーのデバイスには、新しい名前は反映されません。", + "settings-server-version": "サーバーのバージョン", + "settings-transfer-limit": "データ転送の許容量", + "setup-action": "セットアップ", + "setup-advanced": "詳細設定", + "setup-anywhere": "どこにでも Outline をセットアップ可能", + "setup-cancel": "いつでもキャンセルできます", + "setup-create": "サーバーを作成", + "setup-description": "サーバーがない場合は、DigitalOcean でアカウントを作成してください。", + "setup-do-cost": "月々わずか 6 米ドル", + "setup-do-create": "30 日につき 6 米ドルを追加すると、1 TB のデータ転送が可能な新しいサーバーを DigitalOcean アカウントに作成できます。", + "setup-do-data": "1 TB のデータ転送が可能", + "setup-do-description": "処理に数分かかることがあります。このサーバーはいつでも削除できます。", + "setup-do-easiest": "簡単な設定", + "setup-do-title": "Outline をセットアップしています。", + "setup-firewall-instructions": "ファイアウォールの設定手順", + "setup-gcp-create": "Google アカウントを使用して新しいサーバーを作成できます。料金は地域や使用状況に応じて異なります。", + "setup-gcp-easy": "セットアップは簡単です", + "setup-gcp-free-tier": "{openLinkFreeTier}無料枠{closeLink}では、1 台目のサーバーを {openLinkIpPrice}3 米ドル/月{closeLink} からご利用いただけます", + "setup-gcp-free-trial": "新規ユーザーは {openLinkFreeTrial}90 日間の無料トライアル{closeLink}をご利用いただけます", + "setup-gcp-promo": "Google Cloud 向けの新しい Outline サーバー自動作成プロセスをお試しください", + "setup-recommended": "推奨", + "setup-simple-commands": "シンプルなインストール コマンド", + "setup-step-by-step": "詳細な設定ガイド", + "setup-tested": "VULTR、Linode、Liquid Web でテスト済み", + "setup-title": "Outline をセットアップするクラウド サービスを選択してください。", + "share-description": "この招待状をコピーし、信頼できるコミュニケーション ツールを使用して送信してください。{openLink}サポートが必要な場合{closeLink}", + "share-invite-access-key-copied": "アクセスキーをクリップボードにコピーしました", + "share-invite-copied": "招待状をクリップボードにコピーしました", + "share-invite-copy": "招待状をコピー", + "share-invite-copy-access-key": "アクセスキーをコピー", + "share-invite-html": "このサーバーを使用してオープンなインターネットに安全にアクセスします。

1)お使いのデバイス用の Outline アプリをダウンロードしてインストールします。

- iOS: https://itunes.apple.com/jp/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/jp/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android の代替リンク: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2)「ss://」で始まるアクセスキーが届きます。アクセスキーを受け取ったら、コピーします。

3)Outline クライアント アプリを開きます。アクセスキーが自動検出されたら、[接続] をタップして次に進みます。アクセスキーが自動検出されない場合は、コピーした値をフィールドに貼り付け、[接続] をタップして続行します。

これで、オープンなインターネットに接続する準備が整いました。サーバーに接続したことを確認するには、Google 検索で「What is my ip」と検索してみてください。Google に表示される IP アドレスは、Outline クライアントの IP アドレスと一致する必要があります。

Outline について詳しくは、https://getoutline.org/ をご覧ください。", + "share-invite-instructions": "GitHub にある招待の手順を実施:", + "share-invite-trouble": "招待リンクにアクセスできませんか?", + "share-title": "アクセスの共有", + "survey-data-limits-title": "データの上限の改善方法に関するアンケートにご協力ください", + "survey-decline": "回答しない", + "survey-disclaimer": "[続行(Continue)] をクリックすると、Google フォームの簡単なアンケートが送信されます。Outline に接続した状態でアンケートにご協力くださいますようお願いいたします。", + "survey-go-to-survey": "アンケートに回答する", + "terms-of-service": "{openLink}Outline 利用規約{closeLink}を読み、内容を理解しました" +} diff --git a/server_manager/messages/ka.json b/server_manager/messages/ka.json new file mode 100644 index 0000000000..67c289ff60 --- /dev/null +++ b/server_manager/messages/ka.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline არის ღია კოდის პროექტი, რომელიც შექმნილია Jigsaw-ის მიერ ახალი ამბების ორგანიზაციებისა და ჟურნალისტებისთვის ინტერნეტზე წვდომის უსაფრთხო გზების უზრუნველსაყოფად.

Outline მუშაობს Shadowsocks-ზე და ჯერ კიდევ ადრეული ეტაპის პროდუქტია. შეგიძლიათ წვლილი შეიტანოთ კოდში GitHub-ზე და თვალი გვადევნოთ Reddit-ზე და Medium-ზე, რომ გაიგოთ, როდის გავაფართოვებთ მეტ პლატფორმაზე და დავამატებთ ახალ ფუნქციებს.", + "about-version": "ვერსია {version}", + "aws-lightsail-firewall-0": "გადადით {openLink}Amazon Lightsail{closeLink} ეგზემპლარების ეკრანზე.", + "aws-lightsail-firewall-1": "დააწკაპუნეთ ეგზემპლარზე, რომელზეც გსურთ Outline-ის ჰოსტინგი.", + "aws-lightsail-firewall-2": "გადადით „ქსელების“ ჩანართზე.", + "aws-lightsail-firewall-3": "სექციაში „ქსელის დაცვა“ დააწკაპუნეთ „სხვის დამატებაზე“.", + "aws-lightsail-firewall-4": "დააყენეთ „აპლიკაციის“ მნიშვნელობა „ყველა TCP+UDP“-ზე.", + "aws-lightsail-firewall-5": "დააწკაპუნეთ „შენახვაზე“.", + "cancel": "გაუქმება", + "close": "დახურვა", + "confirmation-server-destroy": "არსებული მომხმარებლები წვდომას დაკარგავენ. ამ ქმედებას ვერ გააუქმებთ.", + "confirmation-server-destroy-title": "გსურთ სერვერის განადგურება?", + "confirmation-server-remove": "ეს მოქმედება შლის თქვენს სერვერს Outline Manager-იდან, მაგრამ არ ბლოკავს პროქსი-სერვერის წვდომას მომხმარებლებისთვის. თქვენ მაინც მოგიწევთ ხელით წაშალოთ Outline-ის სერვერი თქვენი ჰოსტის აპარატიდან.", + "confirmation-server-remove-title": "გსურთ სერვერის წაშლა?", + "data-limit": "მონაცემთა ლიმიტი", + "data-limit-per-key": "მონაცემთა ლიმიტი თითო გასაღებისთვის", + "data-limits": "მონაცემთა ლიმიტები", + "data-limits-description": "ამ სერვერზე წვდომის გასაღებებისთვის დააყენეთ მონაცემთა გადაცემის 30-დღიანი საცდელი ვერსია.", + "data-limits-dialog-text": "გადადით პარამეტრების ჩანართზე, მონაცემთა გადაცემის ლიმიტი რომ დააყენოთ ამ სერვერზე წვდომის გასაღებებისთვის.", + "data-limits-dialog-title": "მოერიდეთ მონაცემთა გადაჭარბებას", + "data-limits-disclaimer": "ვინაიდან თქვენ ამჟამად მეტრიკის შესახებ მოგვახსენებთ, მონაცემთა ლიმიტების ფუნქციის გამოყენება ჩართული იქნება. დამატებითი ინფორმაციისთვის გთხოვთ, იხილოთ {openLink}მონაცემთა შეგროვების წესები{closeLink}.", + "data-limits-usage": "გამოყენებულია {used} / {total}-დან", + "destroy": "განადგურება", + "digitalocean-disconnect-account": "DigitalOcean ანგარიშთან კავშირის გაწყვეტა", + "digitalocean-unreachable": "ეს შეცდომა შეიძლება გამოწვეული იყოს თქვენს ქსელში არსებული ქსელის დაცვით ან digitalocean.com-თან დაკავშირების დროებითი პრობლემებით.", + "disabled": "გათიშული", + "disconnect": "კავშირის გაწყვეტა", + "done": "მზადაა", + "enabled": "ჩართული", + "error-connectivity": "თქვენს DigitalOcean ანგარიშთან დაკავშირების პრობლემა გვაქვს. ზოგჯერ ეს დროებითი პრობლემაა DigitalOcean-თან ან თქვენს ინტერნეტ-კავშირთან დაკავშირებით. თუ ხელახალი ცდა არ იმუშავებს, DigitalOcean-ში ხელახლა შესვლამ უნდა მოაგვაროს პრობლემა.", + "error-connectivity-title": "კავშირის პრობლემა", + "error-do-account-info": "DigitalOcean ანგარიშის ინფორმაციის მიღება ვერ მოხერხდა", + "error-do-auth": "DigitalOcean-ით ავტორიზაცია ვერ მოხერხდა", + "error-do-limit": "თქვენმა DigitalOcean ანგარიშმა მიაღწია {num} წვეთის ლიმიტს. გაზრდის მოთხოვნა შეგიძლიათ ბმულზე: https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "ხელმისაწვდომი რეგიონების სიის მიღება ვერ მოხერხდა", + "error-do-warning": "DigitalOcean-ის გაფრთხილება: „{message}“", + "error-feedback": "გამოხმაურების გაგზავნა ვერ მოხერხდა. გთხოვთ, ხელახლა სცადოთ.", + "error-gcp-auth": "Google Cloud Platform-ით ავტორიზაცია ვერ მოხერხდა", + "error-hostname-invalid": "უნდა იყოს IP მისამართი ან სწორი სერვერის სახელი.", + "error-key-add": "გასაღების დამატება ვერ მოხერხდა", + "error-key-remove": "გასაღების წაშლა ვერ მოხერხდა", + "error-key-rename": "გასაღებისთვის სახელის გადარქმევა ვერ მოხერხდა", + "error-keys-get": "გასაღებების ჩატვირთვა ვერ მოხერხდა", + "error-keys-port-bad-input": "პორტი უნდა იყოს მთელი რიცხვი 1-დან 65 535-მდე.", + "error-keys-port-in-use": "პორტი უკვე გამოიყენება სერვერზე.", + "error-licenses": "ლიცენზიების ჩატვირთვა ვერ მოხერხდა.", + "error-metrics": "მეტრიკის დაყენების შეცდომა ჩართულია", + "error-network": "ქსელის შეცდომა მოხდა.", + "error-not-saved": "შენახული არ არის", + "error-remove-data-limit": "მონაცემთა ნაგულისხმევი ლიმიტის გამორთვა ვერ მოხერხდა", + "error-remove-per-key-limit": "ამ წვდომის გასაღებიდან მონაცემთა ლიმიტის წაშლა ვერ მოხერხდა", + "error-server-creation": "თქვენი Outline-ის სერვერის შექმნისას შეცდომა მოხდა.", + "error-server-destroy": "სერვერის განადგურება ვერ მოხერხდა", + "error-server-removed": "{serverName} აღარ არის თქვენს DigitalOcean ანგარიშში.", + "error-server-rename": "სერვერისთვის სახელის გადარქმევა ვერ მოხერხდა", + "error-server-unreachable": "თქვენი Outline-ის სერვერი სწორად იყო დაინსტალირებული, მაგრამ ჩვენ ვერ ვუკავშირდებით მას. სავარაუდოდ, ეს იმიტომ ხდება, რომ თქვენი სერვერის ქსელის დაცვის წესები ბლოკავს შემომავალ კავშირებს. გთხოვთ, გადახედოთ მათ და დარწმუნდეთ, რომ შემომავალი TCP კავშირები დაშვებულია პორტებზე 1024-დან 65535-მდე.", + "error-server-unreachable-title": "თქვენს Outline-ის სერვერთან დაკავშირება ვერ ხერხდება", + "error-servers-removed": "{serverNames} აღარ არის თქვენს DigitalOcean ანგარიშში.", + "error-set-data-limit": "მონაცემთა ნაგულისხმევი ლიმიტის დაყენება ვერ მოხერხდა", + "error-set-per-key-limit": "ამ წვდომის გასაღებისთვის მონაცემთა ლიმიტის დაყენება ვერ მოხერხდა", + "error-unexpected": "მოულოდნელი შეცდომა მოხდა.", + "experimental": "ექსპერიმენტული", + "experiments": "ექსპერიმენტები", + "experiments-description": "გამოსცადეთ ახალი ფუნქციები და მოგვაწოდეთ გამოხმაურება მათ გამოშვებამდე.", + "experiments-disclaimer": "ექსპერიმენტები დამუშავების პროცესშია და შეიძლება შეიცვალოს ან წაიშალოს აპიდან. თუ ამჟამად მეტრიკის შესახებ მოგვახსენებთ, ექსპერიმენტული ფუნქციების გამოყენება ჩართული იქნება. დამატებითი ინფორმაციისთვის გთხოვთ, იხილოთ {openLink}მონაცემთა შეგროვების წესები{closeLink}.", + "experiments-feedback": "შემოთავაზებები გაქვთ? {openLink}გამოგვიგზავნეთ გამოხმაურება აქედან.{closeLink}", + "feedback-cloud-provider": "აირჩიეთ ღრუბლის პროვაიდერი", + "feedback-cloud-provider-error": "გთხოვთ, აირჩიოთ ღრუბლის პროვაიდერი.", + "feedback-connection": "ვერ ვუკავშირდები ჩემს სერვერს", + "feedback-connection-others": "სხვები ვერ უკავშირდებიან ჩემს სერვერს", + "feedback-disclaimer": "გთხოვთ, გაითვალისწინოთ, რომ ჩვენს გუნდს შეუძლია მხოლოდ ინგლისურად უპასუხოს გამოხმაურებებს.", + "feedback-email": "ელფოსტის მისამართი (არასავალდებულო)", + "feedback-error": "გთხოვთ, შეიყვანოთ გამოხმაურება.", + "feedback-explanation-install": "თქვენს სერვერზე Outline-ის დაყენების მცდელობისას შეცდომა მოხდა. თუ გამოსავალი ვერ იპოვნეთ, გთხოვთ, გამოგვიგზავნოთ გამოხმაურება და გვითხრათ თქვენი ელფოსტის მისამართი (არასავალდებულო), თქვენთან დაკავშირება რომ შევძლოთ.", + "feedback-general": "ზოგადი გამოხმაურება", + "feedback-install": "Outline-ის ინსტალაციასთან დაკავშირებული პრობლემა მაქვს", + "feedback-label": "თქვენი გამოხმაურება", + "feedback-management": "ჩემი სერვერის მართვის პრობლემა მაქვს", + "feedback-other": "სხვა", + "feedback-privacy": "თქვენი გამოხმაურება, ელფოსტის მისამართი (თუ მოწოდებულია) და დამატებითი ინფორმაცია, რომელიც მითითებულია {openLink}კონფიდენციალურობის დებულებაში{closeLink}, გაეგზავნება Outline-ის გუნდს.", + "feedback-submit": "გაგზავნა", + "feedback-suggestion": "შემოთავაზებები", + "feedback-title-generic": "გამოხმაურება", + "feedback-title-install": "Outline-ის სერვერის ინსტალაცია ვერ მოხერხდა", + "gcp-billing-action": "შემდეგი", + "gcp-billing-body": "გელოდებით, რომ {openLink}Google Cloud-ზე ბილინგის ანგარიში დაამატოთ{closeLink}", + "gcp-billing-description": "{openLink}გახსენით ღრუბლის კონსოლის ბილინგის გვერდი{closeLink} და დაამატეთ ანგარიში გასაგრძელებლად.", + "gcp-billing-error": "ბილინგის ინფორმაციის მოძიება ვერ ხერხდება", + "gcp-billing-error-zero": "გაგრძელებამდე ბილინგის ანგარიში უნდა დაამატოთ.", + "gcp-click-create": "დააწკაპუნეთ „შექმნაზე“", + "gcp-create-new-project": "{openLink}შექმენით ახალი Google Cloud პროექტი{closeLink}.", + "gcp-create-new-vm": "{openLink}შექმენით ახალი VM ეგზემპლარები{closeLink}.", + "gcp-create-project": "შექმენით Google Cloud-ის პროექტი", + "gcp-create-server": "შექმენით თქვენი Google Cloud პროექტი", + "gcp-create-vm": "შექმენით VM ეგზემპლარი", + "gcp-disconnect-account": "Google Cloud Platform-ის ანგარიშის დაკავშირება გაწყვიტეთ", + "gcp-firewall-create-0": "{openLink}დაამატეთ ქსელის დაცვის ახალი წესი{closeLink} თქვენს Compute Engine პროექტში.", + "gcp-firewall-create-1": "ჩაწერეთ „outline“ ველში „სახელი“.", + "gcp-firewall-create-2": "ჩაწერეთ „outline“ ველში „სამიზნე თეგები“.", + "gcp-firewall-create-3": "ჩაწერეთ „0.0.0.0/0“ ველში „წყაროს IP დიაპაზონები“.", + "gcp-firewall-create-4": "აირჩიეთ „ყველას დაშვება“ სექციაში „პროტოკოლები და პორტები“.", + "gcp-name-your-project": "თქვენი პროექტის სახელი მიუთითეთ „პროექტის სახელის“ ველში.", + "gcp-project-setup-error": "თქვენი Google Cloud პროექტის დაყენებისას შეცდომა მოხდა", + "gcp-select-machine-type": "აირჩიეთ „f1-micro“ სექციაში „მანქანის ტიპი“", + "gcp-select-networking": "დააწკაპუნეთ „მართვაზე, უსაფრთხოებაზე, დისკებზე, ქსელზე, ერთადერთ იჯარაზე“, შემდეგ „ქსელებზე“", + "gcp-select-region": "აირჩიეთ რეგიონი იმ ადგილთან ახლოს, სადაც იქნებიან სერვერის მომხმარებლები სექციაში „რეგიონი“.", + "gcp-type-network-tag": "ჩაწერეთ „outline“ ველში „ქსელის თეგები“.", + "gcp-type-outline-server": "ჩაწერეთ „outline-server“ ველში „სახელი“.", + "geo-amsterdam": "ამსტერდამი", + "geo-bangalore": "ბანგალორი", + "geo-changhua-county": "ჩანგხუას ოლქი", + "geo-delhi": "დელი", + "geo-eemshaven": "ეემშევენი", + "geo-frankfurt": "ფრანკფურტი", + "geo-hamina": "ჰამინა", + "geo-hk": "ჰონგ-კონგი", + "geo-iowa": "აიოვა", + "geo-jakarta": "ჯაკარტა", + "geo-jurong-west": "იურონგ ვესტი", + "geo-las-vegas": "ლას-ვეგასი", + "geo-london": "ლონდონი", + "geo-los-angeles": "ლოს-ანჯელესი", + "geo-melbourne": "მელბურნი", + "geo-montreal": "მონრეალი", + "geo-mumbai": "მუმბაი", + "geo-new-york-city": "ნიუ-იორკი", + "geo-northern-virginia": "ჩრდილოეთი ვირჯინია", + "geo-oregon": "ორეგონი", + "geo-osaka": "ოსაკა", + "geo-salt-lake-city": "სოლტ-ლეიკ-სიტი", + "geo-san-francisco": "სან-ფრანცისკო", + "geo-sao-paulo": "სან-პაულუ", + "geo-seoul": "სეული", + "geo-sg": "სინგაპური", + "geo-south-carolina": "სამხრეთი კაროლინა", + "geo-st-ghislain": "სენ-გილანი", + "geo-sydney": "სიდნეი", + "geo-tokyo": "ტოკიო", + "geo-toronto": "ტორონტო", + "geo-warsaw": "ვარშავა", + "geo-zurich": "ციურიხი", + "key": "გასაღები {keyId}", + "manual-server-assign-firewall": "დაადგინეთ ქსელის დაცვის წესი", + "manual-server-assign-group": "დანიშნეთ უსაფრთხოების ჯგუფი", + "manual-server-create-firewall": "შექმენით ქსელის დაცვის წესი", + "manual-server-create-group": "შექმენით უსაფრთხოების ჯგუფი", + "manual-server-description": "ეს ნაბიჯები დაგეხმარებათ, Outline დააინსტალიროთ {cloudProvider}-ის Linux სერვერზე.", + "manual-server-firewall": "დააკონფიგურირეთ თქვენი ქსელის დაცვა", + "manual-server-install-paste": "ჩასვით თქვენი ინსტალაციის შედეგი აქ.", + "manual-server-install-run": "შედით თქვენს სერვერზე და გაუშვით ეს ბრძანება.", + "manual-server-instructions": "ინსტრუქცია", + "manual-server-show-me": "მაჩვენე სად", + "manual-server-title": "მიჰყევით ქვემოთ მოცემულ ინსტრუქციას", + "metrics-description": "გააზიარეთ ანონიმური მეტრიკა, Outline-ის საიმედოობა და ეფექტურობა რომ გაუმჯობესდეს, თქვენთვის და მათთვის, ვისთანაც თქვენს სერვერს იზიარებთ. {openLink}შეიტყვეთ მეტი.{closeLink}", + "metrics-share": "მეტრიკის გაზიარება", + "metrics-skip": "გამოტოვება", + "metrics-title": "მეტრიკის გაზიარება", + "nav-about": "ინფორმაცია", + "nav-data-collection": "მონაცემთა შეგროვება", + "nav-feedback": "გამოხმაურება", + "nav-help": "დახმარება", + "nav-licenses": "ლიცენზიები", + "nav-privacy": "კონფიდენციალურობა", + "nav-terms": "პირობები", + "no-data-limit": "არცერთი", + "notification-app-update": "Outline Manager-ის განახლებული ვერსია ჩამოტვირთულია. ის დაინსტალირდება აპლიკაციის გადატვირთვისას.", + "notification-feedback-thanks": "გმადლობთ გაუმჯობესებაში დახმარებისთვის! გვიყვარს თქვენი აზრის მოსმენა.", + "notification-key-added": "გასაღები დამატებულია", + "notification-key-removed": "გასაღები წაშლილია", + "notification-server-destroyed": "სერვერი განადგურებულია", + "notification-server-exists": "სერვერი უკვე დამატებულია", + "notification-server-removed": "სერვერი ამოღებულია", + "oauth-account-active": "თქვენი DigitalOcean ანგარიში გააქტიურებულია.", + "oauth-account-active-tag": "ანგარიში გააქტიურებულია! იტვირთება სერვერების მდებარეობები...", + "oauth-activate-account": "გააქტიურეთ თქვენი DigitalOcean ანგარიში.", + "oauth-billing": "შეიყვანეთ თქვენი ბილინგის ინფორმაცია digitalocean.com-ზე და როგორც კი დაასრულებთ, დაბრუნდით აპში.", + "oauth-billing-tag": "შეიყვანეთ ბილინგის ინფორმაცია..", + "oauth-connect-description": "თქვენი ანგარიშით Outline აადვილებს სერვერის შექმნას და დაკავშირებას.", + "oauth-connect-tag": "თქვენი ანგარიშის დაკავშირების მოლოდინში...", + "oauth-connect-title": "შედით ან შექმენით ანგარიში DigitalOcean-ით.", + "oauth-sign-out": "სისტემიდან გასვლა", + "oauth-verify": "შეამოწმეთ თქვენი შემოსულები DigitalOcean-ის ელფოსტისთვის და დააწკაპუნეთ მასში მოცემულ ბმულზე თქვენი ანგარიშის დასადასტურებლად.", + "oauth-verify-tag": "დაადასტურეთ თქვენი ელფოსტა...", + "okay": "კარგი", + "per-key-data-limit-dialog-set-custom": "დააყენეთ მორგებული მონაცემების ლიმიტი", + "per-key-data-limit-dialog-title": "მონაცემთა ლიმიტი - {keyName}", + "region-best-value": "საუკეთესო ღირებულება", + "region-description": "ეს იქნება თქვენი ინტერნეტ-გამოცდილების წყარო.", + "region-setup": "Outline-ის დაყენება", + "region-title": "აირჩიეთ თქვენი სერვერის მდებარეობა.", + "remove": "წაშლა", + "retry": "ხელახლა ცდა", + "save": "შენახვა", + "saved": "შენახული", + "saving": "მიმდინარეობს შენახვა...", + "server-access": "სერვერზე წვდომა", + "server-access-key-new": "დაამატეთ ახალი გასაღები", + "server-access-key-rename": "გადარქმევა", + "server-access-keys": "წვდომის გასაღებები", + "server-connections": "კავშირები", + "server-data-transfer": "გადაცემული მონაცემები / ბოლო 30 დღე", + "server-data-used": "ნებადართული ოდენობიდან გამოყენებულია / ბოლო 30 დღე", + "server-destroy": "სერვერის განადგურება", + "server-help-access-key-description": "გაუზიარეთ წვდომის გასაღებები მეგობრებს, თქვენს Outline-ის სერვერს რომ დაუკავშირდნენ. მათ შეუძლიათ ერთი და იგივე წვდომის გასაღები გამოიყენონ ყველა მოწყობილობაზე.", + "server-help-access-key-next": "შემდეგი", + "server-help-access-key-title": "შექმენით გასაღებები, გააზიარეთ წვდომა", + "server-help-connection-description": "დააწკაპუნეთ აქ Outline-ის კლიენტის აპის დასაყენებლად, თქვენი Outline-ის სერვერის პირადი წვდომის გასაღების გამოყენებით.", + "server-help-connection-ok": "კარგი, გასაგებია!", + "server-help-connection-title": "თქვენ ჯერ არ ხართ დაკავშირებული!", + "server-keys": "გასაღებები", + "server-my-access-key": "ჩემი წვდომის გასაღები", + "server-name": "Outline-ის სერვერი {serverLocation}", + "server-remove": "სერვერის წაშლა", + "server-settings": "პარამეტრები", + "server-unreachable": "სერვერი მიუწვდომელია", + "server-unreachable-description": "ამ სერვერთან დაკავშირების პრობლემა გვაქვს.", + "server-unreachable-managed-description": "ხელახლა სცადეთ ან წაშალეთ ეს სერვერი აპლიკაციიდან.", + "server-unreachable-manual-description": "ხელახლა სცადეთ ან გაანადგურეთ ეს სერვერი და ვირტუალური ჰოსტი.", + "server-usage": "გამოყენება (ბოლო 30 დღე)", + "servers-add": "სერვერის დამატება", + "servers-digitalocean": "DigitalOcean სერვერები", + "servers-gcp": "Google Cloud Platform-ის სერვერები", + "servers-manual": "სერვერები", + "settings-access-key-port": "პორტი ახალი წვდომის გასაღებებისთვის", + "settings-metrics-header": "გააზიარეთ ანონიმური მეტრიკა", + "settings-server-api-url": "მართვის API-ს URL", + "settings-server-cost": "თვიური ღირებულება", + "settings-server-creation": "შექმნილია", + "settings-server-hostname": "სერვერის სახელი", + "settings-server-id": "სერვერის ID", + "settings-server-info": "სერვერის ინფორმაცია", + "settings-server-location": "სერვერის მდებარეობა", + "settings-server-name": "სახელი", + "settings-server-rename": "დააყენეთ ახალი სახელი თქვენი სერვერისთვის. გაითვალისწინეთ, რომ ეს არ აისახება იმ მომხმარებლების მოწყობილობებზე, რომლებიც თქვენ მოიწვიეთ მასთან დასაკავშირებლად.", + "settings-server-version": "სერვერის ვერსია", + "settings-transfer-limit": "მონაცემთა გადაცემის ნებადართული ოდენობა", + "setup-action": "დაყენება", + "setup-advanced": "გაფართოებული", + "setup-anywhere": "დააყენეთ Outline ნებისმიერ ადგილას", + "setup-cancel": "გააუქმეთ ნებისმიერ დროს", + "setup-create": "სერვერის შექმნა", + "setup-description": "სერვერი არ გაქვთ? შექმენით ანგარიში DigitalOcean-ით.", + "setup-do-cost": "თვეში მხოლოდ 6 აშშ დოლარი", + "setup-do-create": "შექმენით ახალი სერვერი თქვენი DigitalOcean ანგარიშით დამატებით 6 აშშ დოლარად/30 დღეში 1 ტბაიტი მონაცემების გადაცემისთვის.", + "setup-do-data": "1 ტბაიტი მონაცემთა გადაცემის ნებადართული ოდენობა", + "setup-do-description": "ამას შეიძლება რამდენიმე წუთი დასჭირდეს. ამ სერვერის განადგურება ნებისმიერ დროს შეგიძლიათ.", + "setup-do-easiest": "დაყენების უმარტივესი პროცესი", + "setup-do-title": "მიმდინარეობს Outline-ის დაყენება.", + "setup-firewall-instructions": "ქსელის დაცვის ინსტრუქცია", + "setup-gcp-create": "შექმენით ახალი სერვერი თქვენი Google ანგარიშით. ღირებულება განსხვავდება მდებარეობისა და გამოყენების მიხედვით.", + "setup-gcp-easy": "დაყენების მარტივი პროცესი", + "setup-gcp-free-tier": "{openLinkFreeTier}უფასო დონით{closeLink}, თქვენი პირველი სერვერი იწყება {openLinkIpPrice}3 აშშ დოლარიდან/თვეში{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90-დღიანი უფასო საცდელი ვერსია{closeLink} ახალი მომხმარებლებისთვის", + "setup-gcp-promo": "სცადეთ ახალი ავტომატური Outline-ის სერვერის შექმნის პროცესი Google Cloud-ისთვის", + "setup-recommended": "რეკომენდებული", + "setup-simple-commands": "მარტივი ინსტალაციის ბრძანებები", + "setup-step-by-step": "დაყენების სახელმძღვანელო ნაბიჯ-ნაბიჯ", + "setup-tested": "დატესტილია VULTR-ზე, Linode-სა და Liquid Web-ზე", + "setup-title": "აირჩიეთ ღრუბლოვანი სერვისი Outline-ის დასაყენებლად.", + "share-description": "დააკოპირეთ ეს მოსაწვევი და გაგზავნეთ საკომუნიკაციო ხელსაწყოდან, რომელსაც ენდობით. {openLink}დახმარება გჭირდებათ?{closeLink}", + "share-invite-access-key-copied": "წვდომის გასაღები დაკოპირებულია გაცვლის ბუფერში", + "share-invite-copied": "მოწვევა დაკოპირებულია გაცვლის ბუფერში", + "share-invite-copy": "მოსაწვევის კოპირება", + "share-invite-copy-access-key": "წვდომის გასაღების კოპირება", + "share-invite-html": "ღია ინტერნეტზე უსაფრთხო წვდომისთვის გამოიყენეთ ეს სერვერი:

1) ჩამოტვირთეთ და დააინსტალირეთ Outline აპი თქვენი მოწყობილობისთვის:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android-ის ალტერნატიული ბმული: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) თქვენ მიიღებთ წვდომის გასაღებს, რომელიც იწყება ss://-ით. მას შემდეგ რაც მიიღებთ, დააკოპირეთ ეს წვდომის გასაღები.

3) გახსენით Outline-ის კლიენტის აპი. თუ თქვენი წვდომის გასაღები ავტომატურად გამოვლინდა, შეეხეთ „დაკავშირებას“ და გააგრძელეთ. თუ თქვენი წვდომის გასაღები ავტომატურად არ არის გამოვლენილი, ჩასვით ის ველში, შემდეგ შეეხეთ „დაკავშირებას“ და გააგრძელეთ.

თქვენ მზად ხართ გამოიყენოთ ღია ინტერნეტი! იმაში დასარწმუნებლად, რომ წარმატებით დაუკავშირდით სერვერს, სცადეთ Google Search-ში მოძებნოთ „what is my ip“. Google-ში ნაჩვენები IP მისამართი უნდა ემთხვეოდეს Outline-ის კლიენტის IP მისამართს.

შეიტყვეთ მეტი Outline-ის შესახებ აქ: https://getoutline.org/", + "share-invite-instructions": "მიჰყევით ჩვენი მოსაწვევის ინსტრუქციას GitHub-ზე:", + "share-invite-trouble": "მოწვევის ბმულზე წვდომა არ გაქვთ?", + "share-title": "გააზიარეთ წვდომა", + "survey-data-limits-title": "დაგვეხმარეთ გავიგოთ, როგორ გავაუმჯობესოთ მონაცემთა ლიმიტები", + "survey-decline": "უარყოფა", + "survey-disclaimer": "გაგრძელებაზე დაწკაპუნებით თქვენ გამოგეგზავნებათ მოკლე გამოკითხვა Google Forms-ის შესახებ. ჩვენ გირჩევთ, მიიღოთ მონაწილეობა გამოკითხვაში Outline-ის შესახებ.", + "survey-go-to-survey": "გამოკითხვაზე გადასვლა", + "terms-of-service": "მე წავიკითხე და გავიგე {openLink}Outline-ის მომსახურების პირობები{closeLink}" +} diff --git a/server_manager/messages/kk.json b/server_manager/messages/kk.json new file mode 100644 index 0000000000..30d9d9f665 --- /dev/null +++ b/server_manager/messages/kk.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline – Jigsaw әзірлеген ашық кодты бағдарлама жобасы. Ол ақпараттық агенттіктер мен журналистердің интернетті қауіпсіз пайдалануына мүмкіндік береді.

Outline Shadowsocks технологиясын пайдаланады және ол әлі де әзірлеудің бастапқы кезеңінде. GitHub сайтында кодқа үлес қоса аласыз, сонымен қатар Reddit және Medium желілеріне жазылып, қосымша платформалар және жаңа функциялар қосылғаны туралы хабардар болыңыз.", + "about-version": "Нұсқасы: {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} экранына өтіңіз.", + "aws-lightsail-firewall-1": "Outline орналастырылатын нұсқаны басыңыз.", + "aws-lightsail-firewall-2": "\"Желі\" (Networking) қойындысына өтіңіз.", + "aws-lightsail-firewall-3": "\"Брандмауэр\" (Firewall) бөлімінде \"Басқасын қосу\" (Add another) түймесін басыңыз.", + "aws-lightsail-firewall-4": "Келесіге \"Қолданба\" (Application) мәнін орнатыңыз: \"Барлық TCP+UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "\"Сақтау\" (Save) түймесін басыңыз.", + "cancel": "Бас тарту", + "close": "Жабу", + "confirmation-server-destroy": "Бұрыннан бар пайдаланушылардың кіру рұқсаты жойылады. Бұл әрекетті кері қайтару мүмкін емес.", + "confirmation-server-destroy-title": "Серверді жою қажет пе?", + "confirmation-server-remove": "Серверіңіз Outline менеджерінен өшіріледі, бірақ пайдаланушылар прокси арқылы әлі де кіре алады. Outline серверін хостан әлі де қолмен жою қажет.", + "confirmation-server-remove-title": "Серверді өшіру қажет пе?", + "data-limit": "Дерек шегі", + "data-limit-per-key": "Әр кілтке трафик", + "data-limits": "Трафик шектері", + "data-limits-description": "Осы сервердегі рұқсат кілттеріне арналған трафик шегін соңғы 30 күндегі пайдалану көрсеткішіне қарай реттеңіз.", + "data-limits-dialog-text": "Осы серверде рұқсат кілттерінің деректерді тасымалдау шегін орнату үшін \"Параметрлер\" қойындысына өтіңіз.", + "data-limits-dialog-title": "Деректер көлемінің шектен аспауын қадағалаңыз", + "data-limits-disclaimer": "Көрсеткіштерді жазып жүргендіктен, деректер шегін пайдалану функциясы қамтылады. Қосымша ақпарат алу үшін {openLink}Деректерді жинау саясатын{closeLink} қараңыз.", + "data-limits-usage": "{used}/{total} пайдаланылды", + "destroy": "Жою", + "digitalocean-disconnect-account": "DigitalOcean аккаунтын ажырату", + "digitalocean-unreachable": "Бұл қате желідегі брандмауэр немесе digitalocean.com сайтына қосылу мүмкіндігінің уақытша қателері салдарынан болуы мүмкін.", + "disabled": "Өшірілді", + "disconnect": "Ажырату", + "done": "Дайын", + "enabled": "Қосулы", + "error-connectivity": "DigitalOcean аккаунтымен байланыс орнату мүмкін емес. Бұл кейде DigitalOcean провайдеріндегі уақытша ақаудан немесе сіздегі интернет байланысынан болады. Байланысты орнату әлі де мүмкін болмаса, DigitalOcean аккаунтына қайта кіріңіз.", + "error-connectivity-title": "Байланыс мәселесі", + "error-do-account-info": "DigitalOcean аккаунты туралы ақпаратты алу мүмкін емес.", + "error-do-auth": "DigitalOcean аккаунтына кіру мүмкін емес.", + "error-do-limit": "DigitalOcean аккаунтыңызда барлығы тек {num} сервер жасауға болады. https://cloud.digitalocean.com/account/team/droplet_limit_increase сілтемесінде сұрау қалдыру арқылы сервер санын көбейте аласыз.", + "error-do-regions": "Қолжетімді аймақтар тізімін алу мүмкін емес.", + "error-do-warning": "DigitalOcean хабарландыруы: \"{message}\"", + "error-feedback": "Пікір жіберу мүмкін емес. Әрекетті қайталап көріңіз.", + "error-gcp-auth": "Google Cloud Platform-мен аутентификациялау мүмкін емес.", + "error-hostname-invalid": "IP мекенжайы немесе жарамды хост атауы болуы қажет.", + "error-key-add": "Кілт қосу мүмкін емес.", + "error-key-remove": "Кілт өшірілмеді.", + "error-key-rename": "Кілт атауы өзгертілмеді.", + "error-keys-get": "Кілттерді жүктеу мүмкін емес.", + "error-keys-port-bad-input": "Порт 1 және 65 535 аралығындағы бүтін сан болуы керек.", + "error-keys-port-in-use": "Порт серверде бұрыннан пайдаланылуда.", + "error-licenses": "Лицензияларды жүктеу мүмкін емес.", + "error-metrics": "Көрсеткіштерді қосу барысында қате пайда болды.", + "error-network": "Желі қатесі пайда болды.", + "error-not-saved": "Сақталмады", + "error-remove-data-limit": "Әдепкі трафик шегін өшіру мүмкін емес.", + "error-remove-per-key-limit": "Осы рұқсат кілтінен трафик шегін өшіру мүмкін емес.", + "error-server-creation": "Outline серверін жасау кезінде қате пайда болды.", + "error-server-destroy": "Серверді жою мүмкін емес", + "error-server-removed": "\"{serverName}\" сервері DigitalOcean аккаунтыңызда бұдан былай болмайды.", + "error-server-rename": "Сервер атауын өзгерту мүмкін емес.", + "error-server-unreachable": "Outline сервері дұрыс орнатылған, бірақ онымен байланыс орнату мүмкін емес. Бұл көбіне сервердің брандмауэр ережелері кіріс байланыстарын бөгеп тұрғандықтан болуы мүмкін. Оларды тексеріп, 1024 және 65535 аралығындағы порттарда кіріс TCP байланыстарына рұқсат етілгеніне көз жеткізіңіз.", + "error-server-unreachable-title": "Outline серверімен байланыс орнату мүмкін емес", + "error-servers-removed": "{serverNames} бұдан былай DigitalOcean аккаунтында болмайды.", + "error-set-data-limit": "Әдепкі трафикті орнату мүмкін емес.", + "error-set-per-key-limit": "Осы рұқсат кілтіне трафик орнату мүмкін емес.", + "error-unexpected": "Күтпеген қате пайда болды.", + "experimental": "Эксперименттік", + "experiments": "Эксперименттер", + "experiments-description": "Жаңа функцияларды қолданысқа шыққанға дейін сынап көріңіз және бізге өз пікіріңізды айтыңыз.", + "experiments-disclaimer": "Эксперименттер әзірленуде және олар өзгеруі немесе қолданбадан өшірілуі мүмкін. Көрсеткіштерді жазып жүрсеңіз, эксперименттік функцияларды пайдалану қамтылады. Қосымша ақпарат алу үшін {openLink}Деректерді жинау саясатын{closeLink} қараңыз.", + "experiments-feedback": "Ұсыныстарыңыз бар ма? {openLink}Осы жерде пікір жазыңыз.{closeLink}", + "feedback-cloud-provider": "Бұлт провайдерін таңдаңыз", + "feedback-cloud-provider-error": "Бұлт провайдерін таңдаңыз.", + "feedback-connection": "Серверіммен байланыс орнату мүмкін емес", + "feedback-connection-others": "Басқа пайдаланушылар серверіммен байланыс орната алмайды", + "feedback-disclaimer": "Ұжымымыз тек ағылшын тіліндегі пікірлерге жауап бере алатынын ескеріңіз.", + "feedback-email": "Электрондық мекенжай (қосымша)", + "feedback-error": "Пікіріңізді енгізіңіз.", + "feedback-explanation-install": "Серверіңізге Outline-ды орнату кезінде қате пайда болды. Қатені өзіңіз түзете алмасаңыз, бізге пікір жібергеніңіз жөн. Сол пікірде сізбен байланысуға болатын электрондық мекенжайды көрсетіңіз (міндетті емес).", + "feedback-general": "Жалпы пікір", + "feedback-install": "Outline орнатылмады.", + "feedback-label": "Пікіріңіз", + "feedback-management": "Серверімді басқару кезінде қате пайда болды.", + "feedback-other": "Басқа", + "feedback-privacy": "Пікіріңіз, электрондық мекенжайыңыз (көрсетілген болса) және {openLink}Құпиялық саясатында{closeLink} аталған қосымша ақпарат Outline ұжымына жіберіледі.", + "feedback-submit": "Жіберу", + "feedback-suggestion": "Ұсыныстар", + "feedback-title-generic": "Пікір жіберу", + "feedback-title-install": "Outline сервері орнатылмады", + "gcp-billing-action": "Келесі", + "gcp-billing-body": "{openLink}Google Cloud-та төлем аккаунтын қосу{closeLink} күтіледі.", + "gcp-billing-description": "Жалғастыру үшін {openLink}Cloud Console-дің төлем бетін ашып{closeLink}, аккаунт қосыңыз.", + "gcp-billing-error": "Төлем деректемелерін алу мүмкін емес.", + "gcp-billing-error-zero": "Жалғастырмас бұрын, төлем аккаунтын қосуыңыз қажет.", + "gcp-click-create": "\"Жасау\" (Create) түймесін басыңыз.", + "gcp-create-new-project": "{openLink}Жаңа Google Cloud жобасын жасаңыз{closeLink}.", + "gcp-create-new-vm": "{openLink}Жаңа VM нұсқасын жасаңыз{closeLink}.", + "gcp-create-project": "Google Cloud жобасын жасау", + "gcp-create-server": "Google Cloud жобасын жасау", + "gcp-create-vm": "VM нұсқасын жасау", + "gcp-disconnect-account": "Google Cloud Platform аккаунтын ажырату", + "gcp-firewall-create-0": "Compute Engine жобасына {openLink}жаңа брандмауэр ережесін қосыңыз{closeLink}.", + "gcp-firewall-create-1": "\"Атауы\" (Name) өрісінде \"outline\" деп теріңіз.", + "gcp-firewall-create-2": "\"Мақсат тэгтері\" (Target tags) өрісінде \"outline\" деп теріңіз.", + "gcp-firewall-create-3": "\"Дереккөздің IP аралықтары\" (Source IP ranges) өрісінде \"0.0.0.0/0\" мәнін теріңіз.", + "gcp-firewall-create-4": "\"Протоколдар және порттар\" (Protocols and ports) тармағының астында \"Барлығына рұқсат ету\" (Allow all) опциясын таңдаңыз.", + "gcp-name-your-project": "\"Жоба атауы\" (Project name) өрісінде жоба атауын енгізіңіз.", + "gcp-project-setup-error": "Google Cloud жобасын реттеу кезінде қате шықты.", + "gcp-select-machine-type": "\"Жабдық түрі\" (Machine type) тармағының астындағы \"f1-micro\" опциясын таңдаңыз", + "gcp-select-networking": "\"Басқару, қауіпсіздік, дискілер, желі, дара клиент\" (Management, security, disks, networking, sole tenancy), кейін \"Желі\" (Networking) түймелерін басыңыз.", + "gcp-select-region": "Сервер пайдаланушыларына жақын болатын аймақты \"Аймақ\" (Region) тармағының астынан таңдаңыз.", + "gcp-type-network-tag": "\"Желі тэгтері\" (Network tags) өрісінде \"outline\" деп теріңіз.", + "gcp-type-outline-server": "\"Атауы\" (Name) өрісінде \"outline-server\" деп теріңіз.", + "geo-amsterdam": "Aмстердам", + "geo-bangalore": "Бангалор", + "geo-changhua-county": "Чжанхуа уезі", + "geo-delhi": "Дели", + "geo-eemshaven": "Эмсхавен", + "geo-frankfurt": "Франкфурт", + "geo-hamina": "Хамина", + "geo-hk": "Гонконг", + "geo-iowa": "Айова", + "geo-jakarta": "Джакарта", + "geo-jurong-west": "Джуронг Вест", + "geo-las-vegas": "Лас-Вегас", + "geo-london": "Лондон", + "geo-los-angeles": "Лос-Анжелес", + "geo-melbourne": "Мельбурн", + "geo-montreal": "Монреаль", + "geo-mumbai": "Мумбаи", + "geo-new-york-city": "Нью-Йорк", + "geo-northern-virginia": "Солтүстік Вирджиния", + "geo-oregon": "Орегон", + "geo-osaka": "Осака", + "geo-salt-lake-city": "Солт-Лейк-Сити", + "geo-san-francisco": "Сан-Франциско", + "geo-sao-paulo": "Сан-Паулу", + "geo-seoul": "Сеул", + "geo-sg": "Сингапур", + "geo-south-carolina": "Оңтүстік Каролина", + "geo-st-ghislain": "Сен-Гилен", + "geo-sydney": "Сидней", + "geo-tokyo": "Токио", + "geo-toronto": "Торонто", + "geo-warsaw": "Варшава", + "geo-zurich": "Цюрих", + "key": "Кілт {keyId}", + "manual-server-assign-firewall": "Брандмауэр ережесін тағайындаңыз.", + "manual-server-assign-group": "Қауіпсіздік тобын тағайындаңыз.", + "manual-server-create-firewall": "Брандмауэр ережесін жасау", + "manual-server-create-group": "Қауіпсіздік тобын құрыңыз.", + "manual-server-description": "Бұл қадамдар Outline-ды {cloudProvider} Linux серверіне орнатуға көмектеседі.", + "manual-server-firewall": "Брандмауэрді көнфигурациялау", + "manual-server-install-paste": "Осы жерге орнату скриптісінің шығыс деректерін қойыңыз.", + "manual-server-install-run": "Серверге кіріп, осы пәрменді орындаңыз.", + "manual-server-instructions": "Нұсқаулар", + "manual-server-show-me": "Орнын көрсету", + "manual-server-title": "Төмендегі нұсқауларды орындаңыз", + "metrics-description": "Outline сенімділігі мен өнімділігін жақсартуға көмектесу үшін өзіңізге және серверіңіз бөлісілген адамдарға анонимді көрсеткіштерді жіберіңіз. {openLink}Толығырақ.{closeLink}", + "metrics-share": "Көрсеткіштерді бөлісу", + "metrics-skip": "Өткізіп жіберу", + "metrics-title": "Көрсеткіштерді бөлісу", + "nav-about": "Ақпарат", + "nav-data-collection": "Деректерді жинау", + "nav-feedback": "Пікір жіберу", + "nav-help": "Анықтама", + "nav-licenses": "Лицензиялар", + "nav-privacy": "Құпиялық", + "nav-terms": "Шарттар", + "no-data-limit": "Жоқ", + "notification-app-update": "Outline менеджерінің жаңартылған нұсқасы жүктеп алынды. Аталған нұсқа қолданбаны қайта қосқан кезде орнатылады.", + "notification-feedback-thanks": "Жақсартуға көмектескеніңіз үшін рақмет! Біз үшін сіздің пікіріңіз маңызды.", + "notification-key-added": "Кілт қосылды", + "notification-key-removed": "Кілт өшірілді.", + "notification-server-destroyed": "Сервер жойылды", + "notification-server-exists": "Сервер қосылып қойған.", + "notification-server-removed": "Сервер өшірілді.", + "oauth-account-active": "DigitalOcean аккаунтыңыз белсендірілді.", + "oauth-account-active-tag": "Аккаунт белсендірілді! Сервер орындары жүктелуде...", + "oauth-activate-account": "DigitalOcean аккаунтын белсендіріңіз.", + "oauth-billing": "Төлем деректемелерін digitalocean.com сайтына енгізіп, дайын болғанда, қолданбаға оралыңыз.", + "oauth-billing-tag": "Төлем деректемелерін енгізіңіз...", + "oauth-connect-description": "Аккаунтыңыз арқылы Outline серверді жасауды және онымен байланыс орнатуды жеңілдетеді.", + "oauth-connect-tag": "Аккаунтпен байланыс орнатылуда...", + "oauth-connect-title": "DigitalOcean аккаунтына кіріңіз немесе оны жасаңыз.", + "oauth-sign-out": "Шығу", + "oauth-verify": "DigitalOcean провайдерінен келген электрондық хабарды ашып, аккаунтты растау үшін ондағы сілтемені басыңыз.", + "oauth-verify-tag": "Электрондық мекенжайды растаңыз...", + "okay": "Жарайды", + "per-key-data-limit-dialog-set-custom": "Арнаулы трафикті орнату", + "per-key-data-limit-dialog-title": "Дерек шегі – {keyName}", + "region-best-value": "Үздік мән", + "region-description": "Интернетке осы жерден қосыласыз.", + "region-setup": "Outline-ды реттеу", + "region-title": "Сервер орнын таңдаңыз.", + "remove": "Өшіру", + "retry": "Қайталау", + "save": "Сақтау", + "saved": "Сақталды", + "saving": "Сақталуда…", + "server-access": "Серверге кіру", + "server-access-key-new": "Жаңа кілт қосу", + "server-access-key-rename": "Атын өзгерту", + "server-access-keys": "Рұқсат кілттері", + "server-connections": "Байланыстар", + "server-data-transfer": "Тасымалданған деректер/соңғы 30 күн", + "server-data-used": "Пайдаланылған трафик/соңғы 30 күн", + "server-destroy": "Серверді жою", + "server-help-access-key-description": "Рұқсат кілттерін достарыңызбен бөліссеңіз, олар Outline серверімен байланыс орната алады. Олар барлық құрылғыларда бірдей рұқсат кілтін пайдалана алады.", + "server-help-access-key-next": "Келесі", + "server-help-access-key-title": "Кілттер жасау, рұқсатты бөлісу", + "server-help-connection-description": "Outline серверіне жеке рұқсат кілтін пайдалана отырып, Outline клиенттік қолданбасын орнату үшін осы жерді басыңыз.", + "server-help-connection-ok": "Жарайды, түсінікті!", + "server-help-connection-title": "Сервермен әлі байланыс орнатылмаған!", + "server-keys": "Кілттер", + "server-my-access-key": "Менің рұқсат кілтім", + "server-name": "Outline сервері {serverLocation}", + "server-remove": "Серверді өшіру", + "server-settings": "Параметрлер", + "server-unreachable": "Сервер қолжетімді емес", + "server-unreachable-description": "Осы сервермен байланыс орнату кезінде қате пайда болды.", + "server-unreachable-managed-description": "Әрекетті қайталап көріңіз немесе осы серверді қолданбадан өшіріңіз.", + "server-unreachable-manual-description": "Әрекетті қайталап көріңіз немесе осы сервер мен виртуалдық хосты жойыңыз.", + "server-usage": "Пайдаланылуы (соңғы 30 күн)", + "servers-add": "Сервер қосу", + "servers-digitalocean": "DigitalOcean серверлері", + "servers-gcp": "Google Cloud Platform серверлері", + "servers-manual": "Серверлер", + "settings-access-key-port": "Жаңа рұқсат кілттеріне арналған порт", + "settings-metrics-header": "Анонимді көрсеткіштерді бөлісу", + "settings-server-api-url": "Management API URL мекенжайы", + "settings-server-cost": "Бір айлық құны", + "settings-server-creation": "Жасалған күні", + "settings-server-hostname": "Хост атауы", + "settings-server-id": "Сервер идентификаторы", + "settings-server-info": "Сервер ақпараты", + "settings-server-location": "Сервер орны", + "settings-server-name": "Атауы", + "settings-server-rename": "Серверге жаңа атау беріңіз. Бұл байланыс орнатуға шақырылған пайдаланушылардың құрылғыларында көрсетілмейтінін ескеріңіз.", + "settings-server-version": "Сервер нұсқасы", + "settings-transfer-limit": "Деректерді тасымалдау рұқсаты", + "setup-action": "Орнату", + "setup-advanced": "Кеңейтілген", + "setup-anywhere": "Outline-ды кез келген жерде реттеңіз", + "setup-cancel": "Кез келген уақытта бас тартуға болады.", + "setup-create": "Сервер жасау", + "setup-description": "Сервер жоқ па? DigitalOcean арқылы аккаунт жасаңыз.", + "setup-do-cost": "Айына бар болғаны $6", + "setup-do-create": "1 ТБ трафик үшін 30 күнге тағы $6 төлеп, DigitalOcean аккаунтымен жаңа сервер жасаңыз.", + "setup-do-data": "Рұқсат етілген трафик көлемі: 1 ТБ.", + "setup-do-description": "Бұл бірнеше минут алуы мүмкін. Осы серверді кез келген уақытта жоя аласыз.", + "setup-do-easiest": "Ең оңай реттеу процесі", + "setup-do-title": "Outline реттелуде.", + "setup-firewall-instructions": "Брандмауэр бойынша нұсқаулар", + "setup-gcp-create": "Google аккаунтымен жаңа сервер жасаңыз. Құны орынға және пайдалануға байланысты өзгеше болады.", + "setup-gcp-easy": "Оңай реттеу процесі", + "setup-gcp-free-tier": "{openLinkFreeTier}Тегін жоспармен{closeLink} бірінші сервердің бастапқы бағасы: {openLinkIpPrice}3 АҚШ доллары/ай{closeLink}.", + "setup-gcp-free-trial": "Жаңа пайдаланушылар үшін {openLinkFreeTrial}90 күндік тегін сынақ нұсқасы{closeLink}", + "setup-gcp-promo": "Google Cloud үшін жаңа автоматты Outline серверін жасау процесін орындап көру", + "setup-recommended": "Ұсынылған", + "setup-simple-commands": "Қарапайым орнату пәрмендері", + "setup-step-by-step": "Қадамдық нұсқаулық", + "setup-tested": "VULTR, Linode және Liquid Web провайдерлерінде сыналды.", + "setup-title": "Outline-ды реттеу үшін бұлт қызметін таңдаңыз.", + "share-description": "Осы шақыруды көшіріп, өзіңіз сенетін байланыс құралынан жіберіңіз. {openLink}Көмек керек пе?{closeLink}", + "share-invite-access-key-copied": "Рұқсат кілті буферге көшірілді.", + "share-invite-copied": "Шақыру буферге көшірілді.", + "share-invite-copy": "Шақыруды көшіру", + "share-invite-copy-access-key": "Рұқсат кілтін көшіру", + "share-invite-html": "Ашық интернетті қауіпсіз пайдалану үшін мына серверді пайдаланыңыз:

1) Құрылғыңызға Outline қолданбасын жүктеп алыңыз және орнатыңыз.

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android-қа арналған балама сілтеме: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Сізге ss:// деп басталатын рұқсат кілті жіберіледі. Жіберілген рұқсат кілтін алғаннан кейін оны көшіріңіз.

3) Outline клиенті қолданбасын ашыңыз. Рұқсат кілтіңіз автоматты түрде анықталса, \"Қосу\" тармағын түртіп, әрі қарай жалғастырыңыз. Ал автоматты түрде анықталмаса, көшірілген рұқсат кілтін өріске қойыңыз да, \"Қосу\" тармағын түртіп, әрі қарай жалғастырыңыз.

Ашық интернетті пайдалануға дайынсыз. Серверге қосылғаныңызды тексеру үшін Google Search-те \"IP мекенжайым қандай\" деп іздеп көріңіз. Google-де көрсетілген IP мекенжайы Outline клиентіндегі IP мекенжайына сәйкес болуы керек.

https://getoutline.org/ сілтемесіне өтіп, Outline туралы толық ақпарат алыңыз.", + "share-invite-instructions": "GitHub-та берілген шақыру нұсқауларын орындаңыз:", + "share-invite-trouble": "Шақыру сілтемесіне кіру кезінде қиындық бар ма?", + "share-title": "Рұқсатты бөлісу", + "survey-data-limits-title": "Трафик шектерін жақсартуға көмектесіңіз", + "survey-decline": "Қабылдамау", + "survey-disclaimer": "Жалғастыру арқылы сіз Google Forms-да қысқаша сауалнама толтыратын бетке өтесіз. Outline-мен байланыс орнатылған кезде, сауалнаманы толтырғаныңыз жөн.", + "survey-go-to-survey": "Сауалнамаға өту", + "terms-of-service": "{openLink}Outline Қызмет көрсету шарттарын{closeLink} оқыдым және түсіндім." +} diff --git a/server_manager/messages/km.json b/server_manager/messages/km.json new file mode 100644 index 0000000000..d6d38f7e46 --- /dev/null +++ b/server_manager/messages/km.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline គឺជាគម្រោងកូដចំហមួយ ដែលបង្កើតឡើងដោយ Jigsaw ដើម្បីផ្ដល់​វិធីដែល​កាន់តែ​មានសុវត្ថិភាពដល់​ស្ថាប័នព័ត៌មាន និង​អ្នកកាសែត​ក្នុងការចូលប្រើ​អ៊ីនធឺណិត។

Outline ត្រូវបាន​ដំណើរការដោយ Shadowsocks និងស្ថិតក្នុងដំណាក់កាល​ដំបូងនៅឡើយ។ អ្នកអាច​រួមចំណែក​ដល់កូដនេះនៅលើ GitHub និងតាមដានយើងនៅលើ Reddit និង Medium ដើម្បីដឹងនៅពេល​យើង​ពង្រីកទៅ​ប្រព័ន្ធ​ច្រើនទៀត និងបញ្ចូល​មុខងារថ្មីៗ។", + "about-version": "ជំនាន់ {version}", + "aws-lightsail-firewall-0": "ទៅ​កាន់​អេក្រង់​ម៉ាស៊ីននិម្មិត​របស់ {openLink}Amazon Lightsail{closeLink}។", + "aws-lightsail-firewall-1": "ចុច​លើ​ម៉ាស៊ីននិម្មិត​ដែល​អ្នក​ចង់​បង្ហោះ Outline។", + "aws-lightsail-firewall-2": "ទៅ​កាន់​ផ្ទាំង 'ការភ្ជាប់​បណ្ដាញ (Networking)'។", + "aws-lightsail-firewall-3": "នៅ​ក្នុង​ផ្នែក 'ជញ្ជាំង​ភ្លើង (Firewall)' សូម​ចុច 'បញ្ចូល​មួយ​ទៀត (Add another)'។", + "aws-lightsail-firewall-4": "កំណត់​តម្លៃ 'កម្មវិធី (Application)' ទៅ​ជា 'TCP+UDP ទាំងអស់ (All TCP+UDP)'។", + "aws-lightsail-firewall-5": "ចុច 'រក្សា​ទុក (Save)'។", + "cancel": "បោះបង់", + "close": "បិទ", + "confirmation-server-destroy": "អ្នកប្រើដែលមានស្រាប់នឹងបាត់បង់ការចូលប្រើ។ សកម្មភាពនេះមិនអាចមិនធ្វើវិញបានទេ។", + "confirmation-server-destroy-title": "បំផ្លាញម៉ាស៊ីនមេ?", + "confirmation-server-remove": "សកម្មភាពនេះដកម៉ាស៊ីនមេរបស់អ្នកចេញពី អ្នកគ្រប់គ្រង Outline ប៉ុន្តែមិនរាំងខ្ទប់ការចូលប្រើប្រូកស៊ីទៅកាន់អ្នកប្រើប្រាស់ទេ។ អ្នកនៅតែត្រូវការលុបម៉ាស៊ីនមេដោយដៃចេញពីម៉ាស៊ីនបម្រើ។", + "confirmation-server-remove-title": "ដកម៉ាស៊ីនមេចេញ?", + "data-limit": "ដែន​កំណត់​ទិន្នន័យ", + "data-limit-per-key": "ដែនកំណត់​ទិន្នន័យ​សម្រាប់លេខ​កូដមួយ", + "data-limits": "ដែន​កំណត់​ទិន្នន័យ", + "data-limits-description": "ដាក់​ដែន​កំណត់​ក្នុង​ការផ្ទេរ​ទិន្នន័យ​ដែល​មាន​ការតាម​ដាន​រយៈ​ពេល 30 ថ្ងៃ​សម្រាប់​លេខ​កូដ​ចូល​ប្រើប្រាស់​​នៅ​លើ​ម៉ាស៊ីន​មេ​នេះ។", + "data-limits-dialog-text": "ចូល​ទៅ​កាន់​ផ្ទាំង​ការកំណត់ ដើម្បី​ដាក់​ដែន​កំណត់​ក្នុង​ការផ្ទេរ​ទិន្នន័យ​សម្រាប់លេខ​កូដ​ចូល​ប្រើប្រាស់​លើ​ម៉ាស៊ីន​មេ​នេះ។", + "data-limits-dialog-title": "ជៀសវាង​ការប្រើ​ទិន្នន័យ​លើស​កំណត់", + "data-limits-disclaimer": "ដោយសារ​អ្នក​កំពុង​រាយការណ៍​អំពី​មេទ្រិក​ក្នុង​ពេល​បច្ចុប្បន្ន ការប្រើប្រាស់​មុខងារ​ដែន​កំណត់​ទិន្នន័យ​នឹង​ត្រូវ​បាន​រួម​បញ្ចូល។ សូម​មើល​{openLink}គោលការណ៍​ប្រមូល​ទិន្នន័យ{closeLink} ដើម្បី​ទទួល​បាន​ព័ត៌មាន​លម្អិត​បន្ថែម។", + "data-limits-usage": "បាន​ប្រើ​អស់ {used} នៃ {total}", + "destroy": "បំផ្លាញ", + "digitalocean-disconnect-account": "ផ្តាច់គណនីពី DigitalOcean", + "digitalocean-unreachable": "កំហុសនេះអាចបណ្តាលមកពីជញ្ជាំងភ្លើងនៅលើបណ្តាញរបស់អ្នកឬបណ្តាញបញ្ហាបណ្តោះអាសន្នជាមួយនឹង digitalocean.com", + "disabled": "បាន​បិទ", + "disconnect": "ផ្តាច់", + "done": "រួចរាល់", + "enabled": "បាន​បើក", + "error-connectivity": "យើងកំពុងមានបញ្ហាក្នុងការភ្ជាប់ទៅគណនី DigitalOcean របស់អ្នក។ ករណីនេះជួនកាលជាបញ្ហាបណ្តោះអាសន្នមួយ ជាមួយ DigitalOcean រឺជាមួយការភ្ជាប់អ៉ីនធើណិតរបស់អ្នក។ ប្រសិនបើការព្យាយាមឡើងវិញមិនដំណើរការទេ ការចូលទៅក្នុងគណនី DigitalOcean ម្តងទៀត អាចដោះស្រាយបញ្ហានេះបាន។", + "error-connectivity-title": "បញ្ហាការតភ្ជាប់", + "error-do-account-info": "បានបរាជ័យក្នុងការទទួលបានព័ត៌មានអំពីគណនី DigitalOcean", + "error-do-auth": "ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវជាមួយ DigitalOcean បានបរាជ័យ", + "error-do-limit": "គណនី DigitalOcean របស់អ្នកបានឈានដល់ចំនួនកំណត់ {num} Droplet ហើយ។ អ្នកអាចស្នើសុំចំនួនបន្ថែមបាន​តាមរយៈ៖ https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "បានបរាជ័យក្នុងការយកបញ្ជីឈ្មោះប្រទេសដែលមាន", + "error-do-warning": "សារព្រមាន DigitalOcean៖ \"{message}\"", + "error-feedback": "បានបរាជ័យក្នុងការបញ្ជូនមតិអ្នកប្រើ។ សូម​ព្យាយាម​ម្តង​ទៀត។", + "error-gcp-auth": "ការផ្ទៀងផ្ទាត់​ជាមួយ Google Cloud Platform មិន​បានសម្រេច​ទេ", + "error-hostname-invalid": "ត្រូវ​តែ​ជា​អាសយដ្ឋាន IP ឬ​ឈ្មោះ​ម៉ាស៊ីន​ត្រឹមត្រូវ។", + "error-key-add": "បរាជ័យក្នុងការបញ្ជូលកូនសោ", + "error-key-remove": "បរាជ័យក្នុងការដកចេញនូវកូនសោ", + "error-key-rename": "បរាជ័យក្នុងការប្តូរឈ្មោះកូនសោ", + "error-keys-get": "បរាជ័យក្នុងផ្ទុកកូនសោ", + "error-keys-port-bad-input": "ច្រក​ត្រូវ​តែ​ជា​ចំនួន​គត់​ចន្លោះ​ពី 1 ដល់ 65,535។", + "error-keys-port-in-use": "ច្រកនេះ​កំពុង​ត្រូវ​បាន​ប្រើ​នៅ​លើ​ម៉ាស៊ីន​មេ​ស្រាប់​ហើយ។", + "error-licenses": "បរាជ័យក្នុងការផ្ទុកអាជ្ញាបណ្ណ", + "error-metrics": "កំហុសក្នុងការកំណត់ប្រព័ន្ធម៉ែត្រ", + "error-network": "បញ្ហា​បណ្ដាញ​មួយ​បាន​កើត​ឡើង។", + "error-not-saved": "មិន​បាន​រក្សា​ទុក​ទេ", + "error-remove-data-limit": "មិន​អាច​បិទ​ដែន​កំណត់​ទិន្នន័យ​លំនាំ​ដើម​បាន​ទេ", + "error-remove-per-key-limit": "មិន​អាច​ដក​ដែន​កំណត់​ទិន្នន័យ​ចេញ​ពីលេខ​កូដ​ចូល​ប្រើប្រាស់​នេះ​បាន​ទេ", + "error-server-creation": "មានបញ្ហាក្នុងការបង្កើតម៉ាស៊ីនមេ Outline របស់អ្នក។", + "error-server-destroy": "បរាជ័យក្នុងការបំផ្លាញម៉ាស៊ីនមេ", + "error-server-removed": "{serverName} មិនមាននៅក្នុងគណនី DigitalOcean របស់អ្នកទៀតទេ។", + "error-server-rename": "បរាជ័យក្នុងការប្ដូរឈ្មោះម៉ាស៊ីនមេ", + "error-server-unreachable": "ម៉ាស៊ីនមេ Outline របស់អ្នកត្រូវបានតំឡើងយ៉ាងត្រឹមត្រូវ ប៉ុន្តែយើងមិនអាចភ្ជាប់វាបានទេ។ ភាគច្រើននៃករណីនេះគឺដោយសារតែបទបញ្ជារបស់ម៉ាស៊ីនមេជញ្ជាំងភ្លើងរបស់អ្នកកំពុងរារាំងការតភ្ជាប់ចូល។ សូមពិនិត្យពួកវាឡើងវិញហើយត្រូវប្រាកដថាអនុញ្ញាតឱ្យមានការតភ្ជាប់ TCP ចូលនៅលើច្រកចាប់ពី 1024 ដល់ 65535 ។", + "error-server-unreachable-title": "មិនអាចតភ្ជាប់ទៅម៉ាស៊ីនមេ Outline របស់អ្នក", + "error-servers-removed": "{serverNames} លែងមានប្រើប្រាស់ក្នុង គណនី Digital Ocean.", + "error-set-data-limit": "មិន​អាច​ដាក់​ដែន​កំណត់​លំនាំ​ដើម​បាន​ទេ", + "error-set-per-key-limit": "មិន​អាច​ដាក់​ដែន​កំណត់​ទិន្នន័យ​សម្រាប់​លេខ​កូដ​ចូល​ប្រើប្រាស់នេះ​បាន​ទេ", + "error-unexpected": "បញ្ហា​ដែល​មិន​បាន​រំពឹង​ទុក​មួយ​បាន​កើត​ឡើង​។", + "experimental": "ពិសោធន៍", + "experiments": "ការពិសោធ", + "experiments-description": "សាកល្បង​ប្រើ​មុខងារ​ថ្មី និង​ផ្ដល់​មតិកែ​លម្អ​ដល់​យើង មុន​ពេល​មុខងារ​ទាំង​នេះ​ត្រូវ​បាន​ចេញ​ផ្សាយ។", + "experiments-disclaimer": "ការពិសោធ​កំពុង​ត្រូវ​បាន​ធ្វើ​ឡើង និង​អាច​ផ្លាស់ប្ដូរ​ឬ​ត្រូវ​បាន​ដក​ចេញ​ពី​កម្មវិធី។ ប្រសិន​បើ​អ្នក​កំពុង​រាយការណ៍​អំពី​មេទ្រិក​ក្នុង​ពេល​បច្ចុប្បន្ន ការប្រើប្រាស់​មុខងារ​ពិសោធន៍​នឹង​ត្រូវ​បាន​រួម​បញ្ចូល។ សូម​មើល​{openLink}គោលការណ៍​ប្រមូល​ទិន្នន័យ{closeLink} ដើម្បី​ទទួល​បាន​ព័ត៌មាន​លម្អិត​បន្ថែម។", + "experiments-feedback": "មាន​យោបល់​មែន​ទេ? {openLink}សូម​ដាក់​បញ្ជូន​មតិ​កែ​លម្អ​ត្រង់​នេះ។{closeLink}", + "feedback-cloud-provider": "ជ្រើសរើសវេាកម្ម ពពក របស់អ្នក", + "feedback-cloud-provider-error": "សូមជ្រើសរើសយកសេវាកម្ម ពពក មួយ", + "feedback-connection": "មិនអាចភ្ជាប់ទៅម៉ាស៊ីនមេរបស់ខ្ញុំទេ", + "feedback-connection-others": "អ្នកផ្សេងមិនអាចភ្ជាប់មកម៉ាស៊ីនមេរបស់ខ្ញុំទេ", + "feedback-disclaimer": "សូមកត់សម្គាល់ថា ក្រុមការងាររបស់យើងអាចឆ្លើយតបមតិកែលម្អបានតែជាភាសាអង់គ្លេសប៉ុណ្ណោះ។", + "feedback-email": "អាសយដ្ឋានអ៊ីមែល (មិនតម្រូវ)", + "feedback-error": "សូមសរសេរមតិរបស់អ្នក", + "feedback-explanation-install": "កំហុសមួយបានកើតឡើងនៅពេលដែលព្យាយាមដំឡើង Outline លើម៉ាស៊ីនមេរបស់អ្នក។ ប្រសិនបើអ្នកមិនអាចដោះស្រាយបញ្ហាបានទេ សូមពិចារណាបញ្ជូនមតិយោបល់មកយើង ហើយប្រាប់អាសយដ្ឋានអ៉ីម៉ែលរបស់អ្នក (ជាជម្រើស) ដូច្នេះយើងអាចឆ្លើយតបទៅអ្នកវិញ។", + "feedback-general": "មតិទូទៅ", + "feedback-install": "មានបញ្ហាក្នុងការដំឡើង Outline", + "feedback-label": "មតិកែលម្អរបស់អ្នក", + "feedback-management": "មានបញ្ហាក្នុងការគ្រប់គ្រងម៉ាស៊ីនមេរបស់ខ្ញុំ", + "feedback-other": "ផ្សេងៗ", + "feedback-privacy": "មតិរបស់អ្នក អាសយដ្ឋានអ៉ីម៉ែល (បើអ្នកបានផ្តល់ឲ្យ) និងព័ត៌មានបន្ថែមសំដៅទៅលើ {openLink}គោលនយោបាយឯកជនភាព{closeLink} ដែលនឹងត្រូវបានគេផ្ញើទៅកាន់ក្រុមការងាររបស់ Outline។", + "feedback-submit": "ដាក់បញ្ជូន", + "feedback-suggestion": "ការផ្តល់យោបល់", + "feedback-title-generic": "ផ្ញើមតិ", + "feedback-title-install": "ការតឡើងម៉ាស៊ីនមេរបស់ Outline បរាជ័យ", + "gcp-billing-action": "បន្ទាប់", + "gcp-billing-body": "កំពុង​រង់ចាំ​អ្នក​{openLink}បញ្ចូល​គណនី​ទូទាត់​វិក្កយបត្រ​នៅ​លើ Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}បើក​ទំព័រ​ទូទាត់​វិក្កយបត្រ​របស់ Cloud Console{closeLink} រួច​បញ្ចូល​គណនី ដើម្បី​បន្ត។", + "gcp-billing-error": "មិន​អាច​ទាញយក​ព័ត៌មាន​ទូទាត់​វិក្កយបត្រ​បាន​ទេ", + "gcp-billing-error-zero": "អ្នក​ត្រូវ​តែ​បញ្ចូល​គណនី​ទូទាត់​វិក្កយបត្រ មុន​នឹង​បន្ត។", + "gcp-click-create": "ចុច 'បង្កើត'", + "gcp-create-new-project": "{openLink}បង្កើត​គម្រោង Google Cloud ថ្មី{closeLink}។", + "gcp-create-new-vm": "{openLink}បង្កើត​ម៉ាស៊ីននិម្មិត VM ថ្មី{closeLink}។", + "gcp-create-project": "បង្កើត​គម្រោង Google Cloud", + "gcp-create-server": "បង្កើត​គម្រោង Google Cloud របស់​អ្នក", + "gcp-create-vm": "បង្កើត​ម៉ាស៊ីននិម្មិត VM", + "gcp-disconnect-account": "ផ្ដាច់​គណនី Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}បញ្ជូលបទបញ្ជាថ្មីមួយរបស់ជញ្ជាំងភ្លើង{closeLink} ក្នុងគម្រោង Compute Engine ។", + "gcp-firewall-create-1": "សរសេរ 'outline' ក្នុងវាល 'ឈ្មោះ'", + "gcp-firewall-create-2": "សរសេរ 'outline' ក្នុងវាល 'ស្លាកគោលដៅ'", + "gcp-firewall-create-3": "សរសេរ '0.0.0.0/0' ក្នុង 'ជូួរប្រភព IP'", + "gcp-firewall-create-4": "ជ្រើស 'អនុញ្ញាតទាំងអស់' ក្រោម 'ពិធីការ និងច្រក'។", + "gcp-name-your-project": "ដាក់​ឈ្មោះ​គម្រោង​របស់​អ្នក​នៅ​ក្នុង​កន្លែង​បញ្ចូល 'ឈ្មោះ​គម្រោង (Project name)'។", + "gcp-project-setup-error": "បញ្ហា​មួយ​បាន​កើតឡើង ពេល​រៀបចំ​គម្រោង Google Cloud របស់​អ្នក", + "gcp-select-machine-type": "ជ្រើសរើស 'f1-micro' នៅ​ក្រោម 'ប្រភេទ​ម៉ាស៊ីន (Machine type)'", + "gcp-select-networking": "ចុច 'ការគ្រប់គ្រង សុវត្ថិភាព ថាស ការភ្ជាប់​បណ្ដាញ ការចូលប្រើផ្ដាច់មុខ (Management, security, disks, networking, sole tenancy)' រួច 'ការភ្ជាប់​បណ្ដាញ (Networking)'", + "gcp-select-region": "ជ្រើសរើស​តំបន់​នៅ​ជិត​កន្លែង​ដែល​អ្នក​ប្រើប្រាស់​ម៉ាស៊ីន​មេ​នឹង​ស្ថិត​នៅ នៅ​ក្រោម 'តំបន់ (Region)'។", + "gcp-type-network-tag": "វាយ​បញ្ចូល 'outline' ក្នុង​កន្លែង​បញ្ចូល 'ស្លាក​បណ្តាញ (Network tags)'", + "gcp-type-outline-server": "វាយ​បញ្ចូល 'outline-server' នៅ​ក្នុង​កន្លែង​បញ្ចូល 'ឈ្មោះ (Name)'។", + "geo-amsterdam": "ទីក្រុងអាំស្ទែដាំ", + "geo-bangalore": "ទីក្រុងបឹងកាឡូ", + "geo-changhua-county": "ស្រុក​ឆាងហួ", + "geo-delhi": "ដែលី", + "geo-eemshaven": "អ៊ីម្សហេវិន", + "geo-frankfurt": "ទីក្រុងហ្វ្រែងហ្វើត", + "geo-hamina": "ហាមីណា", + "geo-hk": "ហុងកុង", + "geo-iowa": "អាយអូវ៉ា", + "geo-jakarta": "ហ្សាការតា", + "geo-jurong-west": "ជូរ៉ុង​ខាង​លិច", + "geo-las-vegas": "ឡាស់វេហ្គាស", + "geo-london": "ទីក្រុងឡុងដ៍", + "geo-los-angeles": "ឡូសអាន់ជឺឡេស", + "geo-melbourne": "ម៉ែលប៊ើន", + "geo-montreal": "ម៉ុងត្រេអាល", + "geo-mumbai": "ម៉ុមបៃ", + "geo-new-york-city": "ទីក្រុងញូវយ៉ក", + "geo-northern-virginia": "វឺជីនៀ​ខាង​ជើង", + "geo-oregon": "អូរេហ្គុន", + "geo-osaka": "អូសាកា", + "geo-salt-lake-city": "ទីក្រុង​សាល់ឡេក", + "geo-san-francisco": "ទីក្រុងសេន​ហ្វ្រេ​ន​ស៊ី​ស្កូ", + "geo-sao-paulo": "សៅប៉ូឡូ", + "geo-seoul": "សេអ៊ូល", + "geo-sg": "សិង្ហបុរី", + "geo-south-carolina": "ខារ៉ូឡាណា​ខាង​ត្បូង", + "geo-st-ghislain": "សេនហ្គីសលែន", + "geo-sydney": "ស៊ីដនី", + "geo-tokyo": "តូក្យូ", + "geo-toronto": "ទីក្រុងតូរ៉ុនតូ", + "geo-warsaw": "វ៉ាសូវី", + "geo-zurich": "ហ្ស៊ូរិច", + "key": "លេខ​កូដ {keyId}", + "manual-server-assign-firewall": "កំណត់បទបញ្ជាជញ្ជាំងភ្លើង", + "manual-server-assign-group": "កំណត់ក្រុមសន្តិសុខ", + "manual-server-create-firewall": "បង្កើតបទបញ្ជាមួយរបស់ជញ្ជាំងភ្លើង", + "manual-server-create-group": "បង្កើតក្រុមសន្តិសុខមួយ", + "manual-server-description": "ជំហ៊ានទាំងនេះនឹងជួយអ្នកក្នុងការតឡើង Outline លើ{cloudProvider} ម៉ាស៊ីនមេ Linux", + "manual-server-firewall": "កំណត់រចនាសម្ព័ន្ធជញ្ជាំងភ្លើងរបស់អ្នក", + "manual-server-install-paste": "បិទភ្ជាប់លទ្ធផលដំឡើងរបស់អ្នកនៅទីនេះ។", + "manual-server-install-run": "ចូលទៅក្នុងម៉ាស៊ីនមេរបស់អ្នក ហើយរត់ពាក្យបញ្ជានេះ។", + "manual-server-instructions": "សេចក្តីណែនាំ", + "manual-server-show-me": "បង្ហាញកន្លែងខ្ញុំ", + "manual-server-title": "អនុវត្តតាមការណែនាំដូចខាងក្រោម", + "metrics-description": "ចែករំលែករង្វាស់អនាមិកដើម្បីជួយបង្កើនភាពជឿជាក់និងការអនុវត្តនៃ Outline សម្រាប់អ្នក និងសម្រាប់អ្នកណាដែលអ្នកចែករំលែកម៉ាស៊ីនមេរបស់អ្នកជាមួយគ្នា។ {openLink}មើលបន្ថែម។{closeLink}", + "metrics-share": "ចែករំលែកប្រព័ន្ធម៉ែត្រ", + "metrics-skip": "រំលង", + "metrics-title": "ការចែករំលែកប្រព័ន្ធម៉ែត្រ", + "nav-about": "អំពី", + "nav-data-collection": "ការ​ប្រមូល​ទិន្នន័យ", + "nav-feedback": "មតិអ្នកប្រើ", + "nav-help": "ជំនួយ", + "nav-licenses": "អាជ្ញាប័ណ្ណ", + "nav-privacy": "ឯកជនភាព", + "nav-terms": "លក្ខខណ្ឌ", + "no-data-limit": "គ្មាន", + "notification-app-update": "កំណែនៃកម្មវិធី Outline Manager ត្រូវបានធ្វើបច្ចុប្បន្នភាពហើយត្រូវបានទាញយករួចរាល់។ វានឹងត្រូវបានដំឡើងនៅពេលដែលអ្នកចាប់ផ្តើមកម្មវិធីឡើងវិញ។", + "notification-feedback-thanks": "សូមអរគុណដែលជួយកែលម្អ! យើងសប្បាយចិត្តដែលទទួលបានមតិយោល់ពីអ្នក។", + "notification-key-added": "បានបញ្ចូលកូនសោ", + "notification-key-removed": "កូនសោត្រូវដកចេញ", + "notification-server-destroyed": "ម៉ាស៊ីមេត្រូវបានបំផ្លាញ", + "notification-server-exists": "ម៉ាស៊ីនមេត្រូវបានបញ្ចូលរួចរាល់", + "notification-server-removed": "ម៉ាស៊ីនមេត្រូវបានដកចេញ", + "oauth-account-active": "គណនី DigitalOcean របស់អ្នកត្រូវបានដំណើរការ", + "oauth-account-active-tag": "គណនីដំណើរការ! កំពុងផ្ទុកទីតាំងម៉ាស៊ីនមេ...", + "oauth-activate-account": "ដាក់ឲ្យដំណើរការគណនី DigitalOcean របស់អ្នក។", + "oauth-billing": "បញ្ចូលព័ត៌មានការបង់ប្រាក់របស់អ្នកនៅលើ digitalocean.com ហើយត្រលប់ទៅកម្មវិធីវិញនៅពេលដែលអ្នកបានបញ្ចប់។", + "oauth-billing-tag": "បញ្ចូលព័ត៌មានការបង់ប្រាក់", + "oauth-connect-description": "Outline ធ្វើឲ្យងាយស្រួលដើម្បីបង្កើតម៉ាស៊ីនមេមួយ និងភ្ជាប់វា តាមរយៈគណនីរបស់អ្នក។", + "oauth-connect-tag": "រង់ចាំភ្ជាប់ទៅកាន់គណនីរបស់អ្នក...", + "oauth-connect-title": "ចុចចូល ឬបង្កើតគណនីមួយជាមួយនឹង DigitalOcean.com", + "oauth-sign-out": "ចាកចេញ", + "oauth-verify": "សូមពិនិត្យមើលប្រអប់សំបុត្ររបស់អ្នកសម្រាប់អ៉ីម៉ែលមួយពី DigitalOcean ហើយចុចតំណភ្ជាប់លើវាដើម្បីបញ្ជាក់ពីគណនីរបស់អ្នក។", + "oauth-verify-tag": "បញ្ជាក់អ៉ីមែលរបស់អ្នក...", + "okay": "យល់ព្រម", + "per-key-data-limit-dialog-set-custom": "ដាក់​ដែន​កំណត់​ទិន្នន័យ​តាម​បំណង", + "per-key-data-limit-dialog-title": "ដែន​កំណត់​ទិន្នន័យ - {keyName}", + "region-best-value": "តម្លៃ​ល្អ​បំផុត", + "region-description": "នេះគឺជាបទពិសោធន៍អ៉ីនធើណិតរបស់អ្នក។", + "region-setup": "តឡើង Outline", + "region-title": "ជ្រើសទីតាំងរបស់ម៉ាស៊ីនមេរបស់អ្នក។", + "remove": "ដកចេញ", + "retry": "ព្យាយាមម្តងទៀត", + "save": "រក្សា​ទុក", + "saved": "បាន​រក្សាទុក", + "saving": "កំពុង​រក្សា​ទុក...", + "server-access": "ចូលប្រើម៉ាស៊ីនមេ", + "server-access-key-new": "បញ្ចូលកូនសោថ្មី", + "server-access-key-rename": "ប្ដូរឈ្មោះ", + "server-access-keys": "ប្រើកូនសោ", + "server-connections": "ការតភ្ជាប់", + "server-data-transfer": "ទិន្នន័យ​ដែល​បាន​ផ្ទេរ / 30 ថ្ងៃ​ចុង​ក្រោយ", + "server-data-used": "បាន​ប្រើ​បរិមាណ​ដែល​អនុញ្ញាត / 30 ថ្ងៃ​ចុង​ក្រោយ", + "server-destroy": "បផ្លាញម៉ាស៊ីនមេ", + "server-help-access-key-description": "ចែករំលែកកូនសោចូលប្រើជាមួយមិត្តភក្ដិ ដូច្នេះពួកគេអាចភ្ជាប់ទៅ Outline របស់អ្នក។ ពួកគេអាចប្រើកូនសោចូលប្រើដូចគ្នានៅលើឧបករណ៍របស់ពួកគេទាំងអស់។", + "server-help-access-key-next": "បន្ទាប់", + "server-help-access-key-title": "បង្កើតកូនសោ ហើយចែកការប្រើប្រាស់", + "server-help-connection-description": "ចុចទីនេះដើម្បីតំឡើងកម្មវិធីបម្រើ Outline ដោយប្រើកូនសោចូលផ្ទាល់ខ្លួនរបស់អ្នកទៅម៉ាស៊ីនបម្រើមេ Outline របស់អ្នក។", + "server-help-connection-ok": "អូខេ យល់ហើយ!", + "server-help-connection-title": "អ្នកមិនទាន់បានភ្ជាប់នៅឡើយទេ!", + "server-keys": "កូនសោ", + "server-my-access-key": "កូនសោចូលប្រើរបស់ខ្ញុំ", + "server-name": "ម៉ាស៊ីនមេរបស់ Outline {serverLocation}", + "server-remove": "ដកម៉ាស៊ីនមេចេញ", + "server-settings": "ការកំណត់", + "server-unreachable": "មិនអាចតភ្ជាប់ទៅម៉ាស៊ីនមេបាន", + "server-unreachable-description": "យើងកំពុងមានបញ្ហាក្នុងការភ្ជាប់ទៅម៉ាស៊ីនមេនេះ។", + "server-unreachable-managed-description": "ព្យាយាមម្តងទៀត ឬយកម៉ាស៊ីនមេនេះចេញពីកម្មវិធី។", + "server-unreachable-manual-description": "ព្យាយាមម្តងទៀត ឬបំផ្លាញម៉ាស៊ីនមេនេះ និងម៉ាស៊ីននិម្មិត។", + "server-usage": "ការប្រើប្រាស់ (30 ថ្ងៃ​ចុង​ក្រោយ)", + "servers-add": "បន្ថែមម៉ាស៊ីនមេ", + "servers-digitalocean": "ម៉ាស៊ីនមេរបស់ DigitalOcean", + "servers-gcp": "ម៉ាស៊ីន​មេ Google Cloud Platform", + "servers-manual": "ម៉ាស៊ីនមេ", + "settings-access-key-port": "ច្រកសម្រាប់កូនសោចូលប្រើ", + "settings-metrics-header": "ចែកចាយ រង្វាស់ម៉ែត្រអនាមិក", + "settings-server-api-url": "គ្រប់គ្រង API URL", + "settings-server-cost": "ចំណាយប្រចាំខែ", + "settings-server-creation": "បានបង្កើត", + "settings-server-hostname": "ឈ្មោះម៉ាស៊ីន", + "settings-server-id": "អត្តសញ្ញាណម៉ាស៊ីនមេ", + "settings-server-info": "ព័ត៌មានរបស់ម៉ាស៊ីនមេ", + "settings-server-location": "ទីតាំងរបស់ម៉ាស៊ីមេ", + "settings-server-name": "ឈ្មោះ", + "settings-server-rename": "កំណត់ឈ្មោះថ្មីសម្រាប់ម៉ាស៊ីនមេរបស់អ្នក។ ចំណាំថាវានឹងមិនត្រូវបានបង្ហាញលើឧបករណ៍របស់អ្នកប្រើដែលអ្នកបានដាក់ឱ្យភ្ជាប់ទៅវានោះទេ។", + "settings-server-version": "កំណែ​ម៉ាស៊ីន​មេ", + "settings-transfer-limit": "ទិន្នន័យផ្ទេរដែលអនុញ្ញាត", + "setup-action": "តំឡើង", + "setup-advanced": "កម្រិតខ្ពស់", + "setup-anywhere": "តំឡើង Outline គ្រប់ទីកន្លែង", + "setup-cancel": "បោះបង់​បាន​គ្រប់​ពេល", + "setup-create": "បង្កើតម៉ាស៊ីនមេ", + "setup-description": "មិនមានម៉ាស៊ីនមេ? បង្កើតគណនីជាមួយ ជាមួយនឹង DigitalOcean ។", + "setup-do-cost": "ត្រឹមតែ US$6 ក្នុងមួយខែ​ប៉ុណ្ណោះ", + "setup-do-create": "បង្កើតម៉ាស៊ីនមេថ្មីដោយប្រើគណនី DigitalOcean របស់អ្នកក្នុងតម្លៃ​បន្ថែម US$6/30 ថ្ងៃសម្រាប់ការផ្ទេរទិន្នន័យទំហំ 1 TB។", + "setup-do-data": "អនុញ្ញាត 1 TB ទិន្នន័យផ្ទេរ", + "setup-do-description": "សកម្មភាព​នេះ​អាច​ចំណាយ​ពេល​បន្ដិច។ អ្នក​អាច​លុប​ម៉ាស៊ីន​មេ​នេះ​បាន​គ្រប់​ពេល។", + "setup-do-easiest": "ដំណើរការរៀបចំងាយស្រួលបំផុត", + "setup-do-title": "ការតំឡើង Outline", + "setup-firewall-instructions": "សេចក្តីណែនាំអំពីជញ្ជាំងភ្លើង", + "setup-gcp-create": "បង្កើត​ម៉ាស៊ីន​មេ​ថ្មី​ដោយ​ប្រើ​គណនី Google របស់​អ្នក។ តម្លៃ​ខុសៗ​គ្នា​តាម​ទីតាំង និង​ការប្រើប្រាស់។", + "setup-gcp-easy": "ដំណើរការ​ដំឡើង​ងាយស្រួល", + "setup-gcp-free-tier": "ជាមួយ​{openLinkFreeTier}កម្រិត​ឥត​គិត​ថ្លៃ{closeLink} ម៉ាស៊ីន​មេ​ដំបូង​របស់​អ្នក​ចាប់ផ្ដើម​ពី​តម្លៃ {openLinkIpPrice}US$3/ខែ{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}ការសាកល្បង​ឥត​គិត​ថ្លៃ​រយៈ​ពេល 90 ថ្ងៃ{closeLink}​សម្រាប់​អ្នក​ប្រើប្រាស់​ថ្មី", + "setup-gcp-promo": "សាកល្បង​ប្រើ​ដំណើរការ​បង្កើត​ម៉ាស៊ីន​មេ Outline ស្វ័យប្រវត្តិ​ថ្មី​សម្រាប់ Google Cloud", + "setup-recommended": "ត្រូវបានណែនាំ", + "setup-simple-commands": "ពាក្យបញ្ជាដំឡើងសាមញ្ញ", + "setup-step-by-step": "សេចក្តីណែនាំរៀបចំតំឡើងមួយជំហានម្តង ៗ", + "setup-tested": "បានសាកល្បងលើ VULTR, Linode, និង Liquid Web", + "setup-title": "ជ្រើសរើសសេវាកម្មពពកមួយដើម្បីតំឡើង Outlinel។", + "share-description": "ចម្លងការអញ្ជើញនេះហើយផ្ញើវាពីឧបករណ៍ទំនាក់ទំនងដែលអ្នកទុកចិត្ត។ {openLink}ត្រូវការជំនួយ?{closeLink}", + "share-invite-access-key-copied": "បានចម្លងសោចូលប្រើប្រាស់ដាក់ក្នុងឃ្លីបបត", + "share-invite-copied": "បានចម្លងការអញ្ជើញដាក់ក្នុងឃ្លីបបត", + "share-invite-copy": "ចម្លងការអញ្ជើញ", + "share-invite-copy-access-key": "ចម្លងសោចូលប្រើប្រាស់", + "share-invite-html": "ប្រើប្រាស់ម៉ាស៊ីនមេនេះដើម្បីចូលប្រើប្រាស់អ៊ីនធឺណិតចំហដោយសុវត្ថិភាព៖

1) ទាញយក និងដំឡើងកម្មវិធី Outline សម្រាប់ឧបករណ៍របស់អ្នក៖

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- តំណជម្រើសសម្រាប់ Android ៖ https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) អ្នកនឹងទទួលបានសោចូលប្រើប្រាស់ដែលចាប់ផ្ដើមដោយ ss://។ នៅពេលអ្នកទទួលបានសោចូលប្រើប្រាស់ ចូរចម្លងសោចូលប្រើប្រាស់នេះ។

3) បើកកម្មវិធីអតិថិជន Outline ។ ប្រសិនបើសោចូលប្រើប្រាស់មិនត្រូវបានចាប់សញ្ញាបានដោយស្វ័យប្រវត្តិទេ ចុច \"ភ្ជាប់\" ហើយបន្ត។ ប្រសិនបើសោចូលប្រើប្រាស់របស់អ្នកមិនត្រូវបានចាប់សញ្ញាបានដោយស្វ័យប្រវត្តិទេ ពេលនោះ ចូរដាក់វាចូលក្នុងកន្លែងបញ្ចូល បន្ទាប់មកចុច \"ភ្ជាប់\" ហើយបន្ត។

អ្នករួចរាល់ក្នុងការប្រើប្រាស់អ៊ីនធឺណិតចំហ! ដើម្បីធ្វើឲ្យប្រាកដថាអ្នកបានភ្ជាប់ទៅម៉ាស៊ីនមេដោយជោគជ័យ ចូរសាកល្បងស្វែងរកមើល \"តើ ip របស់ខ្ញុំជាអ្វី\" នៅលើការស្វែងរកនៅលើ Google ។ អាយដ្ឋន IP ដែលបង្ហាញនៅក្នុង Google គួរតែត្រូវគ្នាជាមួយអាសយដ្ឋាន IP នៅក្នុងកម្មវិធីភ្ញៀវសម្រាប់ Outline ។

ស្វែងយល់បន្ថែមអំពី Outline នៅទីនេះ៖ https://getoutline.org/", + "share-invite-instructions": "អនុវត្តតាមការណែនាំការអញ្ជើញរបស់យើងនៅលើ GitHub:", + "share-invite-trouble": "មានបញ្ហាក្នុងការចូលប្រើតំណអញ្ជើញ?", + "share-title": "ចែករំលែកការចូល", + "survey-data-limits-title": "ជួយ​ឱ្យ​យើង​យល់​អំពី​របៀប​កែ​លម្អ​ដែន​កំណត់​ទិន្នន័យ", + "survey-decline": "ច្រានចោល", + "survey-disclaimer": "តាម​រយៈការចុច \"បន្ត\" អ្នក​នឹង​ទទួល​បាន​ការស្ទង់​មតិ​ខ្លី​មួយ​នៅ​លើ Google ទម្រង់​បែបបទ។ យើង​សូម​ណែនាំ​ឱ្យ​ចូលរួម​ការស្ទង់​មតិ​នេះ ពេល​ភ្ជាប់​ទៅ​នឹង Outline។", + "survey-go-to-survey": "ទៅ​កាន់​ការស្ទង់​មតិ", + "terms-of-service": "ខ្ញុំបានអានហើយយល់ពី {openLink}លក្ខខណ្ឌប្រើប្រាស់របស់Outline{closeLink}" +} diff --git a/server_manager/messages/ko.json b/server_manager/messages/ko.json new file mode 100644 index 0000000000..07e7143832 --- /dev/null +++ b/server_manager/messages/ko.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline은 언론 기관과 언론인이 더욱 안전하게 인터넷에 액세스할 수 있도록 돕기 위해 Jigsaw에서 개발한 오픈소스 프로젝트입니다.

Outline은 Shadowsocks을(를) 기반으로 작동하며 아직 초기 단계에 있는 제품입니다. GitHub에서 코드 작성에 참여할 수 있습니다. 또한 RedditMedium에서 Outline을 팔로우하여 더욱 다양한 플랫폼으로 서비스가 확장되거나 새로운 기능이 추가될 때 소식을 받아 보세요.", + "about-version": "버전 {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} 인스턴스 화면으로 이동합니다.", + "aws-lightsail-firewall-1": "Outline을 호스팅할 인스턴스를 클릭합니다.", + "aws-lightsail-firewall-2": "'네트워킹(Networking)' 탭으로 이동합니다.", + "aws-lightsail-firewall-3": "'방화벽(Firewall)' 섹션에서 '다른 방화벽 추가(Add another)'를 클릭합니다.", + "aws-lightsail-firewall-4": "'애플리케이션(Application)' 값을 'All TCP+UDP'로 설정합니다.", + "aws-lightsail-firewall-5": "'저장(Save)'을 클릭합니다.", + "cancel": "취소", + "close": "닫기", + "confirmation-server-destroy": "기존 사용자가 액세스할 수 없게 됩니다. 이 작업은 실행취소할 수 없습니다.", + "confirmation-server-destroy-title": "서버를 삭제하시겠습니까?", + "confirmation-server-remove": "이 작업을 하게 되면 Outline Manager에서 서버가 제거되지만, 사용자에 대한 프록시 액세스는 차단되지 않습니다. 호스트 머신에서 Outline 서버를 수동으로 삭제해야 합니다.", + "confirmation-server-remove-title": "서버를 삭제하시겠습니까?", + "data-limit": "데이터 한도", + "data-limit-per-key": "키당 데이터 한도", + "data-limits": "데이터 제한", + "data-limits-description": "이 서버의 액세스 키에 30일 누적 데이터 전송 제한을 설정합니다.", + "data-limits-dialog-text": "설정 탭으로 이동하여 이 서버의 액세스 키에 데이터 전송 제한을 설정하세요.", + "data-limits-dialog-title": "데이터 초과 사용 방지", + "data-limits-disclaimer": "현재 측정항목을 보고하는 중이므로 데이터 한도 기능 사용이 포함됩니다. {openLink}데이터 수집 정책{closeLink}에서 자세한 내용을 확인하세요.", + "data-limits-usage": "{total} 중 {used} 사용됨", + "destroy": "삭제", + "digitalocean-disconnect-account": "DigitalOcean 계정 연결 해제", + "digitalocean-unreachable": "이 오류는 네트워크의 방화벽 또는 digitalocean.com의 일시적인 연결 문제로 인해 발생할 수 있습니다.", + "disabled": "사용 중지됨", + "disconnect": "연결 해제", + "done": "완료", + "enabled": "사용 설정됨", + "error-connectivity": "DigitalOcean 계정에 연결하는 중에 문제가 발생했습니다. DigitalOcean 또는 인터넷 연결과 관련하여 일시적으로 발생하는 문제일 수 있습니다. 다시 시도해도 문제가 해결되지 않는 경우 DigitalOcean에 다시 로그인하면 문제가 해결됩니다.", + "error-connectivity-title": "연결 문제", + "error-do-account-info": "DigitalOcean 계정 정보를 가져올 수 없음", + "error-do-auth": "DigitalOcean을 통해 인증할 수 없음", + "error-do-limit": "DigitalOcean 계정이 Droplet {num}개 한도에 도달했습니다. 다음 페이지에서 상향 조정을 요청할 수 있습니다. https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "사용 가능한 지역 목록을 가져올 수 없음", + "error-do-warning": "DigitalOcean 경고: \"{message}\"", + "error-feedback": "의견을 제출할 수 없습니다. 다시 시도하세요.", + "error-gcp-auth": "Google Cloud Platform으로 인증 실패", + "error-hostname-invalid": "IP 주소 또는 유효한 호스트 이름이어야 합니다.", + "error-key-add": "키를 추가할 수 없음", + "error-key-remove": "키를 삭제할 수 없음", + "error-key-rename": "키 이름을 변경할 수 없음", + "error-keys-get": "키를 로드할 수 없음", + "error-keys-port-bad-input": "포트는 정수 1부터 65,535 사이여야 합니다.", + "error-keys-port-in-use": "이미 서버에서 사용 중인 포트입니다.", + "error-licenses": "라이선스를 로드할 수 없습니다.", + "error-metrics": "측정항목 사용 설정 중 오류", + "error-network": "네트워크 오류가 발생했습니다.", + "error-not-saved": "저장되지 않음", + "error-remove-data-limit": "기본 데이터 한도를 사용 중지할 수 없습니다.", + "error-remove-per-key-limit": "이 액세스 키의 데이터 한도를 삭제할 수 없습니다.", + "error-server-creation": "Outline 서버를 만드는 중에 오류가 발생했습니다.", + "error-server-destroy": "서버를 삭제할 수 없음", + "error-server-removed": "{serverName} 서버가 더 이상 내 DigitalOcean 계정에 표시되지 않습니다.", + "error-server-rename": "서버 이름을 변경할 수 없음", + "error-server-unreachable": "Outline 서버가 정상적으로 설치되었지만 서버에 연결할 수 없습니다. 서버의 방화벽 규칙이 수신 연결을 차단하는 것이 주된 원인입니다. 규칙을 검토하여 1024~65535 범위의 포트에서 수신 TCP 연결을 허용하도록 하세요.", + "error-server-unreachable-title": "Outline 서버에 연결할 수 없음", + "error-servers-removed": "{serverNames} 서버가 더 이상 내 DigitalOcean 계정에 표시되지 않습니다.", + "error-set-data-limit": "기본 데이터 한도를 설정할 수 없습니다.", + "error-set-per-key-limit": "이 액세스 키에 데이터 한도를 설정할 수 없습니다.", + "error-unexpected": "예기치 않은 오류가 발생했습니다.", + "experimental": "실험용", + "experiments": "실험", + "experiments-description": "새로운 기능을 출시 전에 테스트하고 의견을 제공합니다.", + "experiments-disclaimer": "실험은 개발 중인 기능으로 변경되거나 앱에서 삭제될 수 있습니다. 현재 측정항목을 보고하고 있다면 실험 기능 사용도 보고에 포함됩니다. {openLink}데이터 수집 정책{closeLink}에서 자세한 내용을 확인하세요.", + "experiments-feedback": "제안하고 싶으신 내용이 있나요? {openLink}여기에서 의견을 보내 주세요.{closeLink}", + "feedback-cloud-provider": "클라우드 제공업체 선택", + "feedback-cloud-provider-error": "클라우드 제공업체를 선택하세요.", + "feedback-connection": "내 서버에 연결할 수 없음", + "feedback-connection-others": "다른 사용자가 내 서버에 연결할 수 없음", + "feedback-disclaimer": "지원팀에서는 의견에 대해 영어로 답변합니다.", + "feedback-email": "이메일 주소(선택사항)", + "feedback-error": "의견을 입력하세요.", + "feedback-explanation-install": "서버에 Outline을 설치하는 중에 오류가 발생했습니다. 해결 방법을 찾을 수 없는 경우 의견을 보내주시고 다시 연락을 드릴 수 있도록 이메일 주소를 알려주세요(선택사항).", + "feedback-general": "일반 의견", + "feedback-install": "Outline을 설치하는 중에 문제가 발생함", + "feedback-label": "내 의견", + "feedback-management": "서버를 관리하는 중에 문제가 발생함", + "feedback-other": "기타", + "feedback-privacy": "의견, 이메일 주소(입력하는 경우) 및 {openLink}개인정보처리방침{closeLink}에 입력된 추가 정보가 Outline팀에 전송됩니다.", + "feedback-submit": "제출", + "feedback-suggestion": "제안 사항", + "feedback-title-generic": "의견 보내기", + "feedback-title-install": "Outline 서버를 설치할 수 없음", + "gcp-billing-action": "다음", + "gcp-billing-body": "{openLink}Google Cloud에 결제 계정을 추가{closeLink}하길 기다리고 있습니다.", + "gcp-billing-description": "진행하려면 {openLink}Cloud Console 결제 페이지를 열고{closeLink} 계정을 추가합니다.", + "gcp-billing-error": "결제 정보를 가져올 수 없습니다.", + "gcp-billing-error-zero": "진행하기 전에 결제 계정을 추가해야 합니다.", + "gcp-click-create": "'만들기(Create)'를 클릭하세요.", + "gcp-create-new-project": "{openLink}새 Google Cloud 프로젝트를 만듭니다{closeLink}.", + "gcp-create-new-vm": "{openLink}새 VM 인스턴스를 만듭니다{closeLink}.", + "gcp-create-project": "Google Cloud 프로젝트 만들기", + "gcp-create-server": "Google Cloud 프로젝트 만들기", + "gcp-create-vm": "VM 인스턴스 만들기", + "gcp-disconnect-account": "Google Cloud Platform 계정 연결 해제", + "gcp-firewall-create-0": "Compute Engine 프로젝트에 {openLink}새 방화벽 규칙을 추가{closeLink}하세요.", + "gcp-firewall-create-1": "'이름(Name)' 입력란에 'outline'을 입력하세요.", + "gcp-firewall-create-2": "'타겟 태그(Target tags)' 입력란에 'outline'을 입력하세요.", + "gcp-firewall-create-3": "'소스 IP 범위(Source IP ranges)' 입력란에 '0.0.0.0/0'을 입력하세요.", + "gcp-firewall-create-4": "'프로토콜 및 포트(Protocols and ports)'에서 '모두 허용(Allow all)'을 선택하세요.", + "gcp-name-your-project": "'프로젝트 이름(Project name)' 입력란에 프로젝트 이름을 입력합니다.", + "gcp-project-setup-error": "Google Cloud 프로젝트 설정 중에 오류가 발생했습니다.", + "gcp-select-machine-type": "'머신 유형(Machine type)'에서 'f1-micro'를 선택합니다.", + "gcp-select-networking": "'관리, 보안, 디스크, 네트워킹, 단독 임대(Management, security, disks, networking, sole tenancy)'와 '네트워킹(Networking)'을 차례로 클릭합니다.", + "gcp-select-region": "'지역(Region)'에서 서버 사용자의 거주 지역과 가까운 곳을 선택합니다.", + "gcp-type-network-tag": "'네트워크 태그(Network tags)' 입력란에 'outline'을 입력합니다.", + "gcp-type-outline-server": "'이름(Name)' 입력란에 'outline-server’를 입력합니다.", + "geo-amsterdam": "암스테르담", + "geo-bangalore": "방갈로르", + "geo-changhua-county": "장화 현", + "geo-delhi": "델리", + "geo-eemshaven": "엠스하벤", + "geo-frankfurt": "프랑크푸르트", + "geo-hamina": "하미나", + "geo-hk": "홍콩", + "geo-iowa": "아이오와", + "geo-jakarta": "자카르타", + "geo-jurong-west": "주롱 웨스트", + "geo-las-vegas": "라스베이거스", + "geo-london": "런던", + "geo-los-angeles": "로스앤젤레스", + "geo-melbourne": "멜버른", + "geo-montreal": "몬트리올", + "geo-mumbai": "뭄바이", + "geo-new-york-city": "뉴욕", + "geo-northern-virginia": "노던 버지니아", + "geo-oregon": "오리건", + "geo-osaka": "오사카", + "geo-salt-lake-city": "솔트레이크시티", + "geo-san-francisco": "샌프란시스코", + "geo-sao-paulo": "상파울루", + "geo-seoul": "서울", + "geo-sg": "싱가포르", + "geo-south-carolina": "사우스캐롤라이나", + "geo-st-ghislain": "셍기슬랑", + "geo-sydney": "시드니", + "geo-tokyo": "도쿄", + "geo-toronto": "토론토", + "geo-warsaw": "바르샤바", + "geo-zurich": "취리히", + "key": "키 {keyId}", + "manual-server-assign-firewall": "방화벽 규칙 할당", + "manual-server-assign-group": "보안 그룹 할당", + "manual-server-create-firewall": "방화벽 규칙 만들기", + "manual-server-create-group": "보안 그룹 만들기", + "manual-server-description": "이 단계에 따라 {cloudProvider} Linux 서버에 Outline을 설치할 수 있습니다.", + "manual-server-firewall": "방화벽 구성", + "manual-server-install-paste": "여기에 설치 출력을 붙여넣으세요.", + "manual-server-install-run": "서버에 로그인하고 이 명령어를 실행하세요.", + "manual-server-instructions": "안내", + "manual-server-show-me": "위치 표시", + "manual-server-title": "아래 안내를 따르세요", + "metrics-description": "나와 서버를 공유하는 사용자를 위해 Outline의 안정성과 성과를 개선할 수 있도록 익명처리된 측정항목을 공유하세요. {openLink}자세히 알아보기{closeLink}", + "metrics-share": "측정항목 공유", + "metrics-skip": "건너뛰기", + "metrics-title": "측정항목 공유", + "nav-about": "정보", + "nav-data-collection": "데이터 수집", + "nav-feedback": "의견", + "nav-help": "도움말", + "nav-licenses": "라이선스", + "nav-privacy": "개인정보처리방침", + "nav-terms": "약관", + "no-data-limit": "없음", + "notification-app-update": "Outline Manager의 업데이트 버전이 다운로드되었습니다. 애플리케이션을 다시 시작하면 설치됩니다.", + "notification-feedback-thanks": "제품을 개선하는 데 도움을 주셔서 감사합니다. Outline에서는 여러분의 의견을 소중하게 활용합니다.", + "notification-key-added": "키 추가됨", + "notification-key-removed": "키 삭제됨", + "notification-server-destroyed": "서버 삭제됨", + "notification-server-exists": "서버가 이미 추가됨", + "notification-server-removed": "서버 삭제됨", + "oauth-account-active": "DigitalOcean 계정이 활성화되었습니다.", + "oauth-account-active-tag": "계정이 활성화되었습니다. 서버 위치 로드 중...", + "oauth-activate-account": "DigitalOcean 계정을 활성화하세요.", + "oauth-billing": "digitalocean.com에서 결제 정보를 입력하고 완료되면 앱으로 돌아오세요.", + "oauth-billing-tag": "결제 정보를 입력하세요...", + "oauth-connect-description": "계정이 있으면 Outline에서 간편하게 서버를 만들고 연결할 수 있습니다.", + "oauth-connect-tag": "계정 연결을 기다리는 중...", + "oauth-connect-title": "로그인하거나 DigitalOcean 계정을 만드세요.", + "oauth-sign-out": "로그아웃", + "oauth-verify": "DigitalOcean에서 보낸 이메일을 받은편지함에서 확인하고, 이메일의 링크를 클릭하여 계정을 확인하세요.", + "oauth-verify-tag": "이메일을 확인하세요...", + "okay": "확인", + "per-key-data-limit-dialog-set-custom": "맞춤 데이터 한도 설정", + "per-key-data-limit-dialog-title": "데이터 한도 - {keyName}", + "region-best-value": "최적의 가성비", + "region-description": "인터넷 환경을 가져올 위치입니다.", + "region-setup": "Outline 설정", + "region-title": "서버 위치를 선택하세요.", + "remove": "삭제", + "retry": "다시 시도", + "save": "저장", + "saved": "저장됨", + "saving": "저장 중...", + "server-access": "서버 액세스", + "server-access-key-new": "새 키 추가", + "server-access-key-rename": "이름 변경", + "server-access-keys": "액세스 키", + "server-connections": "연결", + "server-data-transfer": "전송된 데이터/지난 30일", + "server-data-used": "사용한 용량/지난 30일", + "server-destroy": "서버 삭제", + "server-help-access-key-description": "친구들이 내 Outline 서버에 연결할 수 있도록 액세스 키를 공유하세요. 친구들은 모든 기기에서 동일한 액세스 키를 사용할 수 있습니다.", + "server-help-access-key-next": "다음", + "server-help-access-key-title": "키 생성, 액세스 공유", + "server-help-connection-description": "여기를 클릭하여 Outline 클라이언트 앱을 설치하세요. 개인 액세스 키를 사용하여 Outline 서버에 연결하게 됩니다.", + "server-help-connection-ok": "확인", + "server-help-connection-title": "아직 연결되지 않았습니다.", + "server-keys": "키", + "server-my-access-key": "내 액세스 키", + "server-name": "Outline 서버 {serverLocation}", + "server-remove": "서버 삭제", + "server-settings": "설정", + "server-unreachable": "서버에 연결할 수 없음", + "server-unreachable-description": "이 서버에 연결하는 중에 문제가 발생했습니다.", + "server-unreachable-managed-description": "다시 시도하거나 애플리케이션에서 이 서버를 삭제하세요.", + "server-unreachable-manual-description": "다시 시도하거나 이 서버와 가상 호스트를 삭제하세요.", + "server-usage": "사용량(지난 30일)", + "servers-add": "서버 추가", + "servers-digitalocean": "DigitalOcean 서버", + "servers-gcp": "Google Cloud Platform 서버", + "servers-manual": "서버", + "settings-access-key-port": "새 액세스 키 포트", + "settings-metrics-header": "익명처리된 측정항목 공유", + "settings-server-api-url": "관리 API URL", + "settings-server-cost": "월간 비용", + "settings-server-creation": "생성 날짜", + "settings-server-hostname": "호스트 이름", + "settings-server-id": "서버 ID", + "settings-server-info": "서버 정보", + "settings-server-location": "서버 위치", + "settings-server-name": "이름", + "settings-server-rename": "서버의 새 이름을 설정하세요. 새 이름은 서버에 연결하도록 초대한 사용자의 기기에는 반영되지 않습니다.", + "settings-server-version": "서버 버전", + "settings-transfer-limit": "데이터 전송 용량", + "setup-action": "설정", + "setup-advanced": "고급", + "setup-anywhere": "어디서든 Outline 설정", + "setup-cancel": "언제든지 취소할 수 있습니다.", + "setup-create": "서버 만들기", + "setup-description": "서버가 없으신가요? DigitalOcean으로 계정을 만드세요.", + "setup-do-cost": "미화 6달러/월", + "setup-do-create": "DigitalOcean 계정으로 새 서버를 만드세요. 30일에 미화 6달러의 추가 요금으로 1TB의 데이터 전송 용량을 이용할 수 있습니다.", + "setup-do-data": "1TB 데이터 전송 용량", + "setup-do-description": "몇 분 정도 걸릴 수 있습니다. 언제든지 이 서버를 삭제할 수 있습니다", + "setup-do-easiest": "가장 쉬운 설정 프로세스", + "setup-do-title": "Outline 설정 중입니다.", + "setup-firewall-instructions": "방화벽 안내", + "setup-gcp-create": "Google 계정으로 새 서버를 만듭니다. 지역과 사용량에 따라 비용이 다릅니다.", + "setup-gcp-easy": "쉬운 설정 프로세스", + "setup-gcp-free-tier": "{openLinkFreeTier}무료 등급{closeLink}에 가입하면 첫 서버를 {openLinkIpPrice}월 3달러(USD){closeLink}에 사용할 수 있습니다.", + "setup-gcp-free-trial": "신규 사용자를 위한 {openLinkFreeTrial}90일 무료 체험{closeLink}", + "setup-gcp-promo": "Google Cloud의 새로운 자동 Outline 서버 생성 프로세스 사용해 보기", + "setup-recommended": "권장", + "setup-simple-commands": "단순한 설치 명령어", + "setup-step-by-step": "단계별 설정 가이드", + "setup-tested": "VULTR, Linode 및 Liquid Web에서 테스트함", + "setup-title": "Outline을 설정할 클라우드 서비스를 선택하세요.", + "share-description": "신뢰하는 커뮤니케이션 도구에서 이 초대를 복사하여 전송하세요. {openLink}도움이 필요하신가요?{closeLink}", + "share-invite-access-key-copied": "클립보드에 액세스 키 복사됨", + "share-invite-copied": "클립보드에 초대 복사됨", + "share-invite-copy": "초대 복사", + "share-invite-copy-access-key": "액세스 키 복사", + "share-invite-html": "이 서버를 사용하여 다음과 같이 공개 인터넷에 안전하게 액세스하세요.

1) 기기에 맞는 Outline 앱을 다운로드하고 설치합니다.

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline -releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android 대체 링크: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) ss://로 시작하는 액세스 키를 받게 됩니다. 액세스 키를 받으면 이 액세스 키를 복사합니다.

3) Outline 클라이언트 앱을 엽니다. 액세스 키가 자동 감지되면 '연결'을 탭하고 계속합니다. 액세스 키가 자동 감지되지 않으면 입력란에 키를 붙여넣은 다음 '연결'을 탭하여 계속합니다.

공개 인터넷을 사용할 준비가 되었습니다. 서버에 제대로 연결되었는지 확인하려면 Google 검색에 '내 IP 주소'를 검색해 보세요. Google에 표시되는 IP 주소는 Outline 클라이언트의 IP 주소와 일치해야 합니다.

다음 페이지에서 Outline에 관해 자세히 알아보세요. https://getoutline.org/", + "share-invite-instructions": "GitHub의 초대 안내를 따르세요.", + "share-invite-trouble": "초대 링크에 액세스하는 데 문제가 있나요?", + "share-title": "액세스 공유", + "survey-data-limits-title": "데이터 한도를 개선하는 데 참여해 주세요", + "survey-decline": "거부", + "survey-disclaimer": "계속을 클릭하면 Google Forms를 통해 간단한 설문조사에 참여하게 됩니다. Outline에 연결된 상태에서 설문조사를 진행하는 것이 좋습니다.", + "survey-go-to-survey": "설문조사로 이동", + "terms-of-service": "{openLink}Outline 서비스 약관{closeLink}을 읽고 숙지했습니다." +} diff --git a/server_manager/messages/lo.json b/server_manager/messages/lo.json new file mode 100644 index 0000000000..ab95abdd04 --- /dev/null +++ b/server_manager/messages/lo.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline ແມ່ນໂຄງການໂອເພນຊອດທີ່ Jigsaw ສ້າງຂຶ້ນເພື່ອໃຫ້ສຳນັກຂ່າວ ແລະ ນັກຂ່າວເຂົ້າເຖິງອິນເຕີເນັດໄດ້ຢ່າງປອດໄພ.

Outline ຂັບເຄື່ອນໂດຍ Shadowsocks ແລະ ຍັງເປັນຜະລິດຕະພັນທີ່ພັດທະນາໃນໄລຍະເລີ່ມຕົ້ນ. ທ່ານສາມາດປະກອບສ່ວນໃນການຂຽນໂຄດໄດ້ຢູ່ GitHub ແລະ ຕິດຕາມພວກເຮົາໄດ້ຢູ່ທີ່ Reddit ແລະ Medium ເພື່ອຮັບຂໍ້ມູນເມື່ອພວກເຮົາຂະຫຍາຍບໍລິການໄປຫາແພລດຟອມອື່ນໆ ແລະ ເພີ່ມຄຸນສົມບັດໃໝ່ໆ.", + "about-version": "ເວີຊັນ {version}", + "aws-lightsail-firewall-0": "ນຳທາງໄປຫາໜ້າຈໍອິນສະແຕນ {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "ຄລິກອິນສະແຕນທີ່ທ່ານຕ້ອງການໂຮສ Outline.", + "aws-lightsail-firewall-2": "ນຳທາງໄປຫາແຖບ 'ການສ້າງເຄືອຂ່າຍ'.", + "aws-lightsail-firewall-3": "ໃນພາກສ່ວນ 'Firewall', ໃຫ້ຄລິກ 'ເພີ່ມອີກລາຍການ'.", + "aws-lightsail-firewall-4": "ກຳນົດຄ່າ 'ແອັບພລິເຄຊັນ' ເປັນ 'All TCP+UDP'.", + "aws-lightsail-firewall-5": "ຄລິກ 'ບັນທຶກ'.", + "cancel": "ຍົກເລີກ", + "close": "ປິດ", + "confirmation-server-destroy": "ຜູ້ໃຊ້ທີ່ມີຢູ່ຈະສູນເສຍສິດເຂົ້າເຖິງ. ຄຳສັ່ງນີ້ບໍ່ສາມາດຍົກເລີກໄດ້.", + "confirmation-server-destroy-title": "ລຶບເຊີບເວີບໍ?", + "confirmation-server-remove": "ການດຳເນີນການນີ້ຈະລຶບເຊີບເວີຂອງທ່ານອອກຈາກຕົວຈັດການ Outline, ແຕ່ຈະບໍ່ບລັອກສິດເຂົ້າເຖິງພຣັອກຊີຂອງຜູ້ໃຊ້. ທ່ານຈະຍັງຄົງຕ້ອງລຶບເຊີບເວີ Outline ອອກຈາກເຄື່ອງໂຮສຂອງທ່ານດ້ວຍຕົນເອງຢູ່.", + "confirmation-server-remove-title": "ລຶບເຊີບເວີອອກບໍ?", + "data-limit": "ຂີດຈຳກັດຂອງຂໍ້ມູນ", + "data-limit-per-key": "ຂີດຈຳກັດຂອງຂໍ້ມູນຕໍ່ຄີ", + "data-limits": "ຂີດຈຳກັດຂອງຂໍ້ມູນ", + "data-limits-description": "ກຳນົດຂີດຈຳກັດການໂອນຂໍ້ມູນຕໍ່ທ້າຍເປັນ 30 ມື້ສຳລັບກະແຈການເຂົ້າເຖິງຢູ່ເຊີບເວີນີ້.", + "data-limits-dialog-text": "ເຂົ້າໄປແຖບການຕັ້ງຄ່າເພື່ອກຳນົດຂີດຈຳກັດການໂອນຂໍ້ມູນສຳລັບກະແຈການເຂົ້າເຖິງຢູ່ເຊີບເວີນີ້.", + "data-limits-dialog-title": "ຫຼີກເວັ້ນຂໍ້ມູນທີ່ເກົ່າເກີນໄປ", + "data-limits-disclaimer": "ລະບົບຈະໃຊ້ຄຸນສົມບັດຂີດຈຳກັດຂອງຂໍ້ມູນເນື່ອງຈາກທ່ານກຳລັງລາຍງານການວັດແທກຢູ່ໃນຕອນນີ້. ກະລຸນາເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໃນ {openLink}ນະໂຍບາຍການຮວບຮວມຂໍ້ມູນ{closeLink}.", + "data-limits-usage": "ໃຊ້ໄປແລ້ວ {used} ຈາກທັງໝົດ {total}", + "destroy": "ລຶບ", + "digitalocean-disconnect-account": "ຕັດການເຊື່ອມຕໍ່ບັນຊີ DigitalOcean", + "digitalocean-unreachable": "ຂໍ້ຜິດພາດນີ້ອາດເກີດຈາກ firewall ຢູ່ເຄືອຂ່າຍຂອງທ່ານ ຫຼື ບັນຫາຊົ່ວຄາວໃນການເຊື່ອມຕໍ່ກັບ digitalocean.com.", + "disabled": "ປິດການນຳໃຊ້ແລ້ວ", + "disconnect": "ຕັດການເຊື່ອມຕໍ່", + "done": "ແລ້ວໆ", + "enabled": "ເປີດການນຳໃຊ້ແລ້ວ", + "error-connectivity": "ພວກເຮົາມີບັນຫາໃນການເຊື່ອມຕໍ່ກັບບັນຊີ DigitalOcean ຂອງທ່ານ. ບາງຄັ້ງບັນຫານີ້ອາດເປັນບັນຫາຊົ່ວຄາວກ່ຽວກັບ DigitalOcean ຫຼື ກ່ຽວກັບການເຊື່ອມຕໍ່ອິນເຕີເນັດຂອງທ່ານ. ຫາກລອງໃໝ່ແລ້ວບໍ່ໄດ້ຜົນ, ການເຂົ້າສູ່ລະບົບ DigitalOcean ອີກຄັ້ງອາດຊ່ວຍແກ້ໄຂບັນຫາດັ່ງກ່າວໄດ້.", + "error-connectivity-title": "ບັນຫາການເຊື່ອມຕໍ່", + "error-do-account-info": "ດຶງຂໍ້ມູນບັນຊີ DigitalOcean ບໍ່ສຳເລັດ", + "error-do-auth": "ການພິສູດຢືນຢັນກັບ DigitalOcean ບໍ່ສຳເລັດ", + "error-do-limit": "ບັນຊີ DigitalOcean ຂອງທ່ານຮອດຂີດຈຳກັດທີ່ {num} ແລ້ວ. ທ່ານສາມາດຮ້ອງຂໍໃຫ້ເພີ່ມໄດ້ຢູ່ທີ່ https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "ສະແດງລາຍຊື່ຂອງພາກພື້ນທີ່ພ້ອມໃຫ້ບໍລິການບໍ່ສຳເລັດ", + "error-do-warning": "ຄຳເຕືອນ DigitalOcean: \"{message}\"", + "error-feedback": "ສົ່ງຄຳຕິຊົມບໍ່ສຳເລັດ. ກະລຸນາລອງໃໝ່.", + "error-gcp-auth": "ການພິສູດຢືນຢັນກັບແພລດຟອມ Google Cloud ບໍ່ສຳເລັດ", + "error-hostname-invalid": "ຕ້ອງເປັນທີ່ຢູ່ IP ຫຼື ຊື່ໂຮສທີ່ຖືກຕ້ອງ.", + "error-key-add": "ເພີ່ມຄີບໍ່ສຳເລັດ", + "error-key-remove": "ລຶບຄີອອກບໍ່ສຳເລັດ", + "error-key-rename": "ປ່ຽນຊື່ຄີບໍ່ສຳເລັດ", + "error-keys-get": "ບໍ່ສາມາດໂຫຼດຄີໄດ້", + "error-keys-port-bad-input": "ຜອດຕ້ອງເປັນຈຳນວນເຕັມຢູ່ລະຫວ່າງ 1 ຫາ 65,535.", + "error-keys-port-in-use": "ມີການນຳໃຊ້ຜອດດັ່ງກ່າວໃນເຊີບເວີຢູ່ແລ້ວ.", + "error-licenses": "ບໍ່ສາມາດໂຫຼດໃບອະນຸຍາດໄດ້.", + "error-metrics": "ເກີດຂໍ້ຜິດພາດໃນການຕັ້ງຄ່າເປີດການນຳໃຊ້ການວັດແທກ", + "error-network": "ເກີດຂໍ້ຜິດພາດກັບເຄືອຂ່າຍ.", + "error-not-saved": "ບໍ່ໄດ້ບັນທຶກໄວ້", + "error-remove-data-limit": "ບໍ່ສາມາດປິດການນຳໃຊ້ຂີດຈຳກັດຂອງຂໍ້ມູນຕາມຄ່າເລີ່ມຕົ້ນໄດ້", + "error-remove-per-key-limit": "ບໍ່ສາມາດລຶບຂີດຈຳກັດຂອງຂໍ້ມູນອອກຈາກກະແຈການເຂົ້າເຖິງນີ້ໄດ້", + "error-server-creation": "ເກີດຂໍ້ຜິດພາດຂຶ້ນກັບການສ້າງເຊີບເວີ Outline ຂອງທ່ານ.", + "error-server-destroy": "ລຶບເຊີບເວີບໍ່ສຳເລັດ", + "error-server-removed": "{serverName} ບໍ່ຢູ່ໃນບັນຊີ DigitalOcean ຂອງທ່ານແລ້ວ.", + "error-server-rename": "ປ່ຽນຊື່ເຊີບເວີບໍ່ສຳເລັດ", + "error-server-unreachable": "ເຊີບເວີ Outline ຂອງທ່ານຖືກຕິດຕັ້ງຢ່າງຖືກຕ້ອງແລ້ວ, ແຕ່ພວກເຮົາບໍ່ສາມາດເຊື່ອມຕໍ່ເຊີບເວີໄດ້. ສ່ວນໃຫຍ່ສິ່ງເປັນຍ້ອນກົດ firewall ຂອງເຊີບເວີຂອງທ່ານບລັອກການເຊື່ອມຕໍ່ຂາເຂົ້າ. ກະລຸນາກວດສອບກົດດັ່ງກ່າວ ແລະ ກວດເບິ່ງໃຫ້ແນ່ໃຈວ່າມັນອະນຸຍາດໃຫ້ມີການເຊື່ອມຕໍ່ TCP ຂາເຂົ້າຢູ່ຜອດທີ 1024 ຫາ 65535.", + "error-server-unreachable-title": "ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບເຊີບເວີ Outline ຂອງທ່ານໄດ້", + "error-servers-removed": "{serverNames} ບໍ່ຢູ່ໃນບັນຊີ DigitalOcean ຂອງທ່ານອີກແລ້ວ.", + "error-set-data-limit": "ບໍ່ສາມາດກຳນົດຂີດຈຳກັດຂອງຂໍ້ມູນຕາມຄ່າເລີ່ມຕົ້ນໄດ້", + "error-set-per-key-limit": "ບໍ່ສາມາດກຳນົດຂີດຈຳກັດຂອງຂໍ້ມູນສຳລັບກະແຈການເຂົ້າເຖິງໄດ້", + "error-unexpected": "ເກີດຂໍ້ຜິດພາດທີ່ບໍ່ຄາດຄິດຂຶ້ນ.", + "experimental": "ທົດລອງ", + "experiments": "ການທົດລອງ", + "experiments-description": "ທົດສອບຄຸນສົມບັດໃໝ່ ແລະ ສົ່ງຄຳຕິຊົມໃຫ້ພວກເຮົາກ່ອນເຜີຍແຜ່.", + "experiments-disclaimer": "ການທົດລອງຢູ່ໃນໄລຍະພັດທະນາ ແລະ ອາດມີການປ່ຽນແປງ ຫຼື ຖືກລຶບອອກຈາກແອັບໄດ້. ຫາກທ່ານກຳລັງລາຍງານການວັດແທກໃນປັດຈຸບັນ, ການໃຊ້ຄຸນສົມບັດທົດລອງຈະຮວມຢູ່ໃນລາຍງານນຳ. ກະລຸນາເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໃນ {openLink}ນະໂຍບາຍການຮວບຮວມຂໍ້ມູນ{closeLink}.", + "experiments-feedback": "ມີຄຳແນະນຳບໍ? {openLink}ກະລຸນາສົ່ງຄຳຕິຊົມຢູ່ບ່ອນນີ້.{closeLink}", + "feedback-cloud-provider": "ເລືອກຜູ້ໃຫ້ບໍລິການຄລາວ", + "feedback-cloud-provider-error": "ກະລຸນາເລືອກຜູ້ໃຫ້ບໍລິການຄລາວ.", + "feedback-connection": "ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບເຊີບເວີຂອງຂ້ອຍໄດ້", + "feedback-connection-others": "ຄົນອື່ນບໍ່ສາມາດເຊື່ອມຕໍ່ກັບເຊີບເວີຂອງຂ້ອຍໄດ້", + "feedback-disclaimer": "ກະລຸນາຮັບຊາບວ່າທີມງານຂອງພວກເຮົາຈະຕອບກັບຄຳຕິຊົມທີ່ເປັນພາສາອັງກິດເທົ່ານັ້ນ.", + "feedback-email": "ທີ່ຢູ່ອີເມວ (ບໍ່ບັງຄັບ)", + "feedback-error": "ກະລຸນາໃສ່ຄຳຕິຊົມ.", + "feedback-explanation-install": "ເກີດຂໍ້ຜິດພາດຂຶ້ນໃນຂະນະທີ່ພະຍາຍາມຕິດຕັ້ງ Outline ຢູ່ເຊີບເວີຂອງທ່ານ. ຫາກທ່ານຍັງບໍ່ສາມາດຫາວິທີແກ້ໄຂໄດ້, ໃຫ້ພິຈາລະນາສົ່ງຄຳຕິຊົມຫາພວກເຮົາ ແລະ ແຈ້ງທີ່ຢູ່ອີເມວຂອງທ່ານໃຫ້ພວກເຮົາຮູ້ (ບໍ່ບັງຄັບ) ເພື່ອໃຫ້ພວກເຮົາສາມາດຕິດຕໍ່ກັບຫາທ່ານໄດ້.", + "feedback-general": "ຄຳຕິຊົມທົ່ວໄປ", + "feedback-install": "ມີບັນຫາໃນການຕິດຕັ້ງ Outline", + "feedback-label": "ຄຳຕິຊົມຂອງທ່ານ", + "feedback-management": "ມີບັນຫາໃນການຈັດການເຊີບເວີຂອງຂ້ອຍ", + "feedback-other": "ອື່ນໆ", + "feedback-privacy": "ລະບົບຈະສົ່ງຄຳຕິຊົມ, ທີ່ຢູ່ອີເມວ (ຫາກລະບຸໄວ້) ແລະ ຂໍ້ມູນເພີ່ມເຕີມຂອງທ່ານທີ່ອ້າງອີງໃນ {openLink}ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ{closeLink} ໄປໃຫ້ທີມງານ Outline.", + "feedback-submit": "ສົ່ງ", + "feedback-suggestion": "ການແນະນຳ", + "feedback-title-generic": "ສົ່ງຄຳຕິຊົມ", + "feedback-title-install": "ການຕິດຕັ້ງເຊີບເວີ Outline ບໍ່ສຳເລັດ", + "gcp-billing-action": "ຕໍ່ໄປ", + "gcp-billing-body": "ກຳລັງລໍຖ້າໃຫ້ທ່ານ {openLink}ເພີ່ມບັນຊີສຳລັບການຮຽກເກັບເງິນຢູ່ Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}ເປີດໜ້າຮຽກເກັບເງິນຂອງ Cloud Console{closeLink} ແລ້ວເພີ່ມບັນຊີເພື່ອດຳເນີນການຕໍ່.", + "gcp-billing-error": "ບໍ່ສາມາດດຶງຂໍ້ມູນສຳລັບການຮຽກເກັບເງິນໄດ້", + "gcp-billing-error-zero": "ທ່ານຕ້ອງເພີ່ມບັນຊີການຮຽກເກັບເງິນກ່ອນດຳເນີນການຕໍ່.", + "gcp-click-create": "ຄລິກ 'ສ້າງ'.", + "gcp-create-new-project": "{openLink}ສ້າງໂຄງການ Google Cloud ໃໝ່{closeLink}.", + "gcp-create-new-vm": "{openLink}ສ້າງອິນສະແຕນ VM ໃໝ່{closeLink}.", + "gcp-create-project": "ສ້າງໂຄງການ Google Cloud", + "gcp-create-server": "ສ້າງໂຄງການ Google Cloud ຂອງທ່ານ", + "gcp-create-vm": "ສ້າງອິນສະແຕນ VM", + "gcp-disconnect-account": "ຕັດການເຊື່ອມຕໍ່ບັນຊີຂອງແພລດຟອມ Google Cloud", + "gcp-firewall-create-0": "{openLink}ເພີ່ມກົດ firewall ໃໝ່{closeLink} ໃສ່ໂຄງການ Compute Engine ຂອງທ່ານ.", + "gcp-firewall-create-1": "ພິມ 'outline' ໃນຊ່ອງຂໍ້ມູນ 'ຊື່'.", + "gcp-firewall-create-2": "ພິມ 'outline' ໃນຊ່ອງຂໍ້ມູນ 'ແທັກເປົ້າໝາຍ'.", + "gcp-firewall-create-3": "ພິມ '0.0.0.0/0' ໃນຊ່ອງຂໍ້ມູນ 'ໄລຍະ IP ຕົ້ນທາງ'.", + "gcp-firewall-create-4": "ເລືອກ 'ອະນຸຍາດທັງໝົດ' ຢູ່ກ້ອງ 'ໂປຣໂຕຄໍ ແລະ ຜອດ'.", + "gcp-name-your-project": "ຕັ້ງຊື່ໂຄງການຂອງທ່ານໃນຊ່ອງຂໍ້ມູນ 'ຊື່ໂຄງການ'.", + "gcp-project-setup-error": "ເກີດຂໍ້ຜິດພາດຂຶ້ນໃນຂະນະທີ່ຕັ້ງຄ່າໂຄງການ Google Cloud ຂອງທ່ານ", + "gcp-select-machine-type": "ເລືອກ 'f1-micro' ຢູ່ກ້ອງ 'ປະເພດເຄື່ອງ'", + "gcp-select-networking": "ຄລິກ 'ການຈັດການ, ການຮັກສາຄວາມປອດໄພ, ດິສ, ການສ້າງເຄືອຂ່າຍ, ກຸ່ມຜູ້ໃຊ້ກຸ່ມດຽວ', ຈາກນັ້ນຄລິກ 'ການສ້າງເຄືອຂ່າຍ'", + "gcp-select-region": "ຢູ່ກ້ອງ 'ພາກພື້ນ' ໃຫ້ເລືອກພາກພື້ນທີ່ໃກ້ກັບຕຳແໜ່ງທີ່ຜູ້ໃຊ້ຂອງເຊີບເວີຈະຢູ່.", + "gcp-type-network-tag": "ພິມ 'outline' ໃນຊ່ອງຂໍ້ມູນ 'ແທັກເຄືອຂ່າຍ'", + "gcp-type-outline-server": "ພິມ 'outline-server' ໃນຊ່ອງຂໍ້ມູນ 'ຊື່'.", + "geo-amsterdam": "ອາມສະເຕີດາມ", + "geo-bangalore": "ບັງກະລໍ", + "geo-changhua-county": "ເຂດປົກຄອງຊາງຮົວ", + "geo-delhi": "ເດລີ", + "geo-eemshaven": "ເອມສ໌ຮາເວນ", + "geo-frankfurt": "ແຟຣງເຟິດ", + "geo-hamina": "ຮາມິນາ", + "geo-hk": "ຮ່ອງກົງ", + "geo-iowa": "ໄອໂອວາ", + "geo-jakarta": "ຈາກາຕາ", + "geo-jurong-west": "ຈູຣົງເວສທ໌", + "geo-las-vegas": "ລາສ ເວກັສ", + "geo-london": "ລອນດອນ", + "geo-los-angeles": "ລອສ ແອນເຈລີສ", + "geo-melbourne": "ເມວເບີນ", + "geo-montreal": "ມອນເທຣລ", + "geo-mumbai": "ມຸມໄບ", + "geo-new-york-city": "ນິວຢອກ", + "geo-northern-virginia": "ເວີຈິເນຍຕອນເໜືອ", + "geo-oregon": "ໂອເຣກອນ", + "geo-osaka": "ໂອຊາກາ", + "geo-salt-lake-city": "ນະຄອນຊໍເຫຼກ", + "geo-san-francisco": "ຊານຟຣານຊິສໂກ", + "geo-sao-paulo": "ເຊົາ ເປົາໂລ", + "geo-seoul": "ໂຊ", + "geo-sg": "ສິງກະໂປ", + "geo-south-carolina": "ຄາໂຣໄລນາຕອນໃຕ້", + "geo-st-ghislain": "ເຊນ ກິສເລນ", + "geo-sydney": "ຊິດນີ", + "geo-tokyo": "ໂຕກຽວ", + "geo-toronto": "ໂຕຣອນໂຕ", + "geo-warsaw": "ວໍຊໍ", + "geo-zurich": "ຊູຣິກ", + "key": "ຄີ {keyId}", + "manual-server-assign-firewall": "ກຳນົດກົດ firewall", + "manual-server-assign-group": "ມອບໝາຍກຸ່ມຮັກສາຄວາມປອດໄພ", + "manual-server-create-firewall": "ສ້າງກົດ firewall", + "manual-server-create-group": "ສ້າງກຸ່ມຮັກສາຄວາມປອດໄພ", + "manual-server-description": "ຂັ້ນຕອນເຫຼົ່ານີ້ຈະຊ່ວຍໃຫ້ທ່ານຕິດຕັ້ງ Outline ຢູ່ເຊີບເວີ Linux ຂອງ {cloudProvider}.", + "manual-server-firewall": "ຕັ້ງຄ່າ firewall ຂອງທ່ານ", + "manual-server-install-paste": "ວາງເອົ້າພຸດການຕິດຕັ້ງຂອງທ່ານຢູ່ບ່ອນນີ້.", + "manual-server-install-run": "ເຂົ້າສູ່ລະບົບເຊີບເວີຂອງທ່ານແລ້ວເອີ້ນໃຊ້ຄຳສັ່ງນີ້.", + "manual-server-instructions": "ຄຳແນະນຳ", + "manual-server-show-me": "ສະແດງຕຳແໜ່ງໃຫ້ຂ້ອຍ", + "manual-server-title": "ກະລຸນາເຮັດຕາມຄຳແນະນຳຂ້າງລຸ່ມນີ້", + "metrics-description": "ແບ່ງປັນການວັດແທກແບບບໍ່ລະບຸຕົວຕົນເພື່ອຊ່ວຍປັບປຸງຄວາມໜ້າເຊື່ອຖື ແລະ ປະສິດທິພາບຂອງ Outline ສຳລັບທ່ານ ແລະ ຄົນທີ່ທ່ານແບ່ງປັນເຊີບເວີຂອງທ່ານນຳ. {openLink}ສຶກສາເພີ່ມເຕີມ.{closeLink}", + "metrics-share": "ແບ່ງປັນການວັດແທກ", + "metrics-skip": "ຂ້າມ", + "metrics-title": "ການແບ່ງປັນການວັດແທກ", + "nav-about": "ກ່ຽວກັບ", + "nav-data-collection": "ການຮວບຮວມຂໍ້ມູນ", + "nav-feedback": "ຄຳຕິຊົມ", + "nav-help": "ຊ່ວຍເຫຼືອ", + "nav-licenses": "ໃບອະນຸຍາດ", + "nav-privacy": "ຄວາມເປັນສ່ວນຕົວ", + "nav-terms": "ຂໍ້ກຳນົດ", + "no-data-limit": "ບໍ່ມີ", + "notification-app-update": "ດາວໂຫຼດຕົວຈັດການ Outline ເວີຊັນອັບເດດແລ້ວ. ມັນຈະຖືກຕິດຕັ້ງເມື່ອທ່ານຣີສະຕາດແອັບພລິເຄຊັນ.", + "notification-feedback-thanks": "ຂໍຂອບໃຈທີ່ຊ່ວຍພວກເຮົາປັບປຸງ! ພວກເຮົາຍິນດີຮັບຟັງຄຳເຫັນຈາກທ່ານ.", + "notification-key-added": "ເພີ່ມຄີແລ້ວ", + "notification-key-removed": "ລຶບຄີອອກແລ້ວ", + "notification-server-destroyed": "ລຶບເຊີບເວີແລ້ວ", + "notification-server-exists": "ມີເຊີບເວີນີ້ຢູ່ແລ້ວ", + "notification-server-removed": "ລຶບເຊີບເວີອອກແລ້ວ", + "oauth-account-active": "ເປີດນຳໃຊ້ບັນຊີ DigitalOcean ຂອງທ່ານແລ້ວ.", + "oauth-account-active-tag": "ເປີດໃຊ້ບັນຊີແລ້ວ! ກຳລັງໂຫຼດຕຳແໜ່ງເຊີບເວີ...", + "oauth-activate-account": "ເປີດນຳໃຊ້ບັນຊີ DigitalOcean ຂອງທ່ານ.", + "oauth-billing": "ລະບຸຂໍ້ມູນໃບບິນຂອງທ່ານຢູ່ໃນ digitalocean.com ແລ້ວກັບຄືນໄປຫາແອັບເມື່ອທ່ານດຳເນີນການສຳເລັດແລ້ວ.", + "oauth-billing-tag": "ລະບຸຂໍ້ມູນໃບບິນ...", + "oauth-connect-description": "ດ້ວຍບັນຊີຂອງທ່ານ, Outline ເຮັດໃຫ້ການສ້າງເຊີບເວີ ແລະ ເຊື່ອມຕໍ່ເປັນສິ່ງທີ່ງ່າຍ.", + "oauth-connect-tag": "ກຳລັງລໍຖ້າເຊື່ອມຕໍ່ບັນຊີຂອງທ່ານ...", + "oauth-connect-title": "ເຂົ້າສູ່ລະບົບ ຫຼື ສ້າງບັນຊີກັບ DigitalOcean.", + "oauth-sign-out": "ອອກຈາກລະບົບ", + "oauth-verify": "ກະລຸນາກວດສອບກ່ອງອີເມວຂອງທ່ານເພື່ອຫາອີເມວຈາກ DigitalOcean, ແລ້ວຄລິກລິ້ງໃນອີເມວເພື່ອຢືນຢັນບັນຊີຂອງທ່ານ.", + "oauth-verify-tag": "ຢືນຢັນອີເມວຂອງທ່ານ...", + "okay": "ຕົກລົງ", + "per-key-data-limit-dialog-set-custom": "ກຳນົດຂີດຈຳກັດຂອງຂໍ້ມູນແບບກຳນົດເອງ", + "per-key-data-limit-dialog-title": "ຂີດຈຳກັດຂອງຂໍ້ມູນ - {keyName}", + "region-best-value": "ກຸ້ມຄ່າທີ່ສຸດ", + "region-description": "ນີ້ແມ່ນຕົ້ນທາງສຳລັບປະສົບການນຳໃຊ້ອິນເຕີເນັດຂອງທ່ານ.", + "region-setup": "ຕິດຕັ້ງ Outline", + "region-title": "ເລືອກຕຳແໜ່ງເຊີບເວີຂອງທ່ານ.", + "remove": "ລຶບອອກ", + "retry": "ລອງໃໝ່", + "save": "ບັນທຶກ", + "saved": "ບັນທຶກແລ້ວ", + "saving": "ກຳລັງບັນທຶກ...", + "server-access": "ສິດເຂົ້າເຖິງເຊີບເວີ", + "server-access-key-new": "ເພີ່ມຄີໃໝ່", + "server-access-key-rename": "ປ່ຽນຊື່", + "server-access-keys": "ກະແຈການເຂົ້າເຖິງ", + "server-connections": "ການເຊື່ອມຕໍ່", + "server-data-transfer": "ໂອນຂໍ້ມູນແລ້ວ / 30 ມື້ທີ່ຜ່ານມາ", + "server-data-used": "ປະລິມານທີ່ໃຊ້ໄປ / 30 ມື້ທີ່ຜ່ານມາ", + "server-destroy": "ລຶບເຊີບເວີ", + "server-help-access-key-description": "ແບ່ງປັນກະແຈການເຂົ້າເຖິງກັບໝູ່ເພື່ອນ, ເພື່ອໃຫ້ພວກເຂົາສາມາດເຊື່ອມຕໍ່ກັບເຊີບເວີ Outline ຂອງທ່ານໄດ້. ພວກເຂົາສາມາດໃຊ້ກະແຈການເຂົ້າເຖິງດຽວກັນນີ້ກັບອຸປະກອນທຸກອັນຂອງຕົນເອງໄດ້.", + "server-help-access-key-next": "ຕໍ່ໄປ", + "server-help-access-key-title": "ສ້າງຄີ, ແບ່ງປັນສິດເຂົ້າເຖິງ", + "server-help-connection-description": "ຄລິກບ່ອນນີ້ເພື່ອຕິດຕັ້ງແອັບລູກຂ່າຍ Outline, ໂດຍໃຊ້ກະແຈການເຂົ້າເຖິງເຊີບເວີ Outline ສ່ວນຕົວຂອງທ່ານ.", + "server-help-connection-ok": "ຕົກລົງ, ເຂົ້າໃຈແລ້ວ!", + "server-help-connection-title": "ທ່ານຍັງບໍ່ໄດ້ເຊື່ອມຕໍ່ເທື່ອ!", + "server-keys": "ຄີ", + "server-my-access-key": "ກະແຈການເຂົ້າເຖິງຂອງຂ້ອຍ", + "server-name": "ເຊີບເວີ Outline {serverLocation}", + "server-remove": "ລຶບເຊີບເວີອອກ", + "server-settings": "ການຕັ້ງຄ່າ", + "server-unreachable": "ຕິດຕໍ່ຫາເຊີບເວີບໍ່ໄດ້", + "server-unreachable-description": "ພວກເຮົາມີບັນຫາໃນການເຊື່ອມຕໍ່ກັບເຊີບເວີນີ້.", + "server-unreachable-managed-description": "ລອງໃໝ່ ຫຼື ລຶບເຊີບເວີນີ້ອອກຈາກແອັບພລິເຄຊັນ.", + "server-unreachable-manual-description": "ລອງໃໝ່ ຫຼື ລຶບເຊີບເວີນີ້ ແລະ ໂຮສສະເໝືອນ.", + "server-usage": "ການນຳໃຊ້ (30 ມື້ທີ່ຜ່ານມາ)", + "servers-add": "ເພີ່ມເຊີບເວີ", + "servers-digitalocean": "ເຊີບເວີ DigitalOcean", + "servers-gcp": "ເຊີບເວີຂອງແພລດຟອມ Google Cloud", + "servers-manual": "ເຊີບເວີ", + "settings-access-key-port": "ຜອດສຳລັບກະແຈການເຂົ້າເຖິງໃໝ່", + "settings-metrics-header": "ແບ່ງປັນການວັດແທກແບບບໍ່ລະບຸຕົວຕົນ", + "settings-server-api-url": "URL ຂອງ API ການຈັດການ", + "settings-server-cost": "ຄ່າໃຊ້ຈ່າຍລາຍເດືອນ", + "settings-server-creation": "ວັນທີທີ່ສ້າງ", + "settings-server-hostname": "ຊື່ໂຮສ", + "settings-server-id": "ID ເຊີບເວີ", + "settings-server-info": "ຂໍ້ມູນເຊີບເວີ", + "settings-server-location": "ຕຳແໜ່ງເຊີບເວີ", + "settings-server-name": "ຊື່", + "settings-server-rename": "ຕັ້ງຊື່ໃໝ່ໃຫ້ເຊີບເວີຂອງທ່ານ. ກະລຸນາຮັບຊາບວ່າຊື່ນີ້ຈະບໍ່ສະແດງຢູ່ອຸປະກອນຂອງຜູ້ໃຊ້ທີ່ທ່ານເຊີນໃຫ້ເຊື່ອມຕໍ່ກັບເຊີບເວີ.", + "settings-server-version": "ເວີຊັນຂອງເຊີບເວີ", + "settings-transfer-limit": "ປະລິມານການໂອນຂໍ້ມູນທີ່ໃຊ້ໄດ້", + "setup-action": "ຕິດຕັ້ງ", + "setup-advanced": "ຂັ້ນສູງ", + "setup-anywhere": "ຕິດຕັ້ງ Outline ໄດ້ທຸກບ່ອນ", + "setup-cancel": "ຍົກເລີກໄດ້ທຸກເວລາ", + "setup-create": "ສ້າງເຊີບເວີ", + "setup-description": "ບໍ່ມີເຊີບເວີບໍ? ກະລຸນາສ້າງບັນຊີກັບ DigitalOcean.", + "setup-do-cost": "ພຽງເດືອນລະ US$6", + "setup-do-create": "ສ້າງເຊີບເວີໃໝ່ດ້ວຍບັນຊີ DigitalOcean ຂອງທ່ານໂດຍມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມ US$6/30 ມື້ສຳລັບການໂອນຂໍ້ມູນ 1 TB.", + "setup-do-data": "ປະລິມານການໂອນຂໍ້ມູນທີ່ໃຊ້ໄດ້ 1 TB", + "setup-do-description": "ການດຳເນີນການນີ້ອາດໃຊ້ເວລາຫຼາຍນາທີ. ທ່ານສາມາດລຶບເຊີບເວີນີ້ໄດ້ທຸກເວລາ.", + "setup-do-easiest": "ຂະບວນການຕິດຕັ້ງແບບງ່າຍທີ່ສຸດ", + "setup-do-title": "ກຳລັງຕິດຕັ້ງ Outline.", + "setup-firewall-instructions": "ຄຳແນະນຳໃນການຕັ້ງຄ່າ firewall", + "setup-gcp-create": "ສ້າງເຊີບເວີໃໝ່ດ້ວຍບັນຊີ Google ຂອງທ່ານ. ຄ່າໃຊ້ຈ່າຍຈະແຕກຕ່າງກັນໄປຕາມສະຖານທີ່ ແລະ ການນຳໃຊ້.", + "setup-gcp-easy": "ຂະບວນການຕິດຕັ້ງແບບງ່າຍ", + "setup-gcp-free-tier": "ດ້ວຍ {openLinkFreeTier}ລະດັບຟຣີ{closeLink}, ເຊີບເວີທຳອິດຂອງທ່ານຈະເລີ່ມຕົ້ນທີ່ລາຄາ {openLinkIpPrice}US$3/ເດືອນ{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}ລອງໃຊ້ຟຣີ 90 ມື້{closeLink} ສຳລັບຜູ້ໃຊ້ໃໝ່", + "setup-gcp-promo": "ລອງຂະບວນການສ້າງເຊີບເວີ Outline ໂດຍອັດຕະໂນມັດແບບໃໝ່ສຳລັບ Google Cloud", + "setup-recommended": "ແນະນຳ", + "setup-simple-commands": "ຄຳສັ່ງຕິດຕັ້ງແບບພື້ນຖານ", + "setup-step-by-step": "ຄຳແນະນຳໃນການຕິດຕັ້ງແບບເທື່ອລະຂັ້ນຕອນ", + "setup-tested": "ຜ່ານການທົດສອບໃນ VULTR, Linode ແລະ Liquid Web ແລ້ວ", + "setup-title": "ເລືອກບໍລິການຄລາວທີ່ຈະຕິດຕັ້ງ Outline.", + "share-description": "ສຳເນົາຄຳເຊີນນີ້ແລ້ວສົ່ງຜ່ານເຄື່ອງມືສື່ສານທີ່ທ່ານເຊື່ອຖື. {openLink}ຕ້ອງການຄວາມຊ່ວຍເຫຼືອບໍ?{closeLink}", + "share-invite-access-key-copied": "ສຳເນົາກະແຈການເຂົ້າເຖິງໃສ່ຄລິບບອດແລ້ວ", + "share-invite-copied": "ສຳເນົາຄຳເຊີນໃສ່ຄລິບບອດແລ້ວ", + "share-invite-copy": "ສຳເນົາຄຳເຊີນ", + "share-invite-copy-access-key": "ສຳເນົາກະແຈການເຂົ້າເຖິງ", + "share-invite-html": "ໃຊ້ເຊີບເວີນີ້ເພື່ອເຂົ້າເຖິງອິນເຕີເນັດໄດ້ຢ່າງອິດສະຫຼະ ແລະ ປອດໄພ:

1) ດາວໂຫຼດ ແລະ ຕິດຕັ້ງແອັບ Outline ສຳລັບອຸປະກອນຂອງທ່ານ:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- ລິ້ງທາງເລືອກຂອງ Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) ທ່ານຈະໄດ້ຮັບກະແຈການເຂົ້າເຖິງທີ່ຂຶ້ນຕົ້ນດ້ວຍ ss://. ເມື່ອທ່ານໄດ້ຮັບແລ້ວ, ໃຫ້ສຳເນົາກະແຈການເຂົ້າເຖິງນີ້.

3) ເປີດແອັບລູກຂ່າຍ Outline. ຫາກລະບົບກວດພົບກະແຈການເຂົ້າເຖິງຂອງທ່ານໂດຍອັດຕະໂນມັດ, ໃຫ້ແຕະ \"ເຊື່ອມຕໍ່\" ແລ້ວດຳເນີນການຕໍ່. ຫາກລະບົບບໍ່ພົບກະແຈການເຂົ້າເຖິງຂອງທ່ານໂດຍອັດຕະໂນມັດ, ໃຫ້ວາງກະແຈດັ່ງກ່າວໃສ່ໃນຊ່ອງຂໍ້ມູນ, ຈາກນັ້ນແຕະ \"ເຊື່ອມຕໍ່\" ແລ້ວດຳເນີນການຕໍ່.

ທ່ານພ້ອມທີ່ຈະໃຊ້ອິນເຕີເນັດໄດ້ຢ່າງອິດສະຫຼະແລ້ວ! ເພື່ອກວດສອບໃຫ້ແນ່ໃຈວ່າທ່ານເຊື່ອມຕໍ່ກັບເຊີບເວີສຳເລັດແລ້ວ, ໃຫ້ລອງຊອກຫາ \"IP ຂອງຂ້ອຍແມ່ນຫຍັງ\" ຢູ່ Google ຊອກຫາ. ທີ່ຢູ່ IP ທີ່ສະແດງໃນ Google ຄວນກົງກັບທີ່ຢູ່ IP ໃນລູກຂ່າຍ Outline.

ສຶກສາເພີ່ມເຕີມກ່ຽວກັບ Outline ໄດ້ຢູ່ບ່ອນນີ້: https://getoutline.org/", + "share-invite-instructions": "ກະລຸນາເຮັດຕາມຄຳແນະນຳກ່ຽວກັບຄຳເຊີນຂອງພວກເຮົາຢູ່ GitHub:", + "share-invite-trouble": "ມີບັນຫາໃນການເຂົ້າເຖິງລິ້ງຄຳເຊີນບໍ?", + "share-title": "ແບ່ງປັນສິດເຂົ້າເຖິງ", + "survey-data-limits-title": "ຊ່ວຍໃຫ້ພວກເຮົາເຂົ້າໃຈກ່ຽວກັບວິທີເພີ່ມຂີດຈຳກັດຂອງຂໍ້ມູນ", + "survey-decline": "ປະຕິເສດ", + "survey-disclaimer": "ໂດຍການຄລິກສືບຕໍ່ ລະບົບຈະພາທ່ານໄປຫາແບບສຳຫຼວດສັ້ນໆຢູ່ Google Forms. ພວກເຮົາຂໍແນະນຳໃຫ້ເຮັດແບບສຳຫຼວດໃນຂະນະທີ່ເຊື່ອມຕໍ່ກັບ Outline.", + "survey-go-to-survey": "ເຂົ້າໄປເຮັດແບບສຳຫຼວດ", + "terms-of-service": "ຂ້ອຍໄດ້ອ່ານ ແລະ ເຂົ້າໃຈ {openLink}ຂໍ້ກຳນົດບໍລິການຂອງ Outline{closeLink} ແລ້ວ" +} diff --git a/server_manager/messages/lt.json b/server_manager/messages/lt.json new file mode 100644 index 0000000000..d8ab97f6e1 --- /dev/null +++ b/server_manager/messages/lt.json @@ -0,0 +1,275 @@ +{ + "about-outline": "„Outline“ yra atvirojo šaltinio projektas, kurį sukūrė „Jigsaw“, kad naujienų organizacijos ir žurnalistai galėtų saugiau pasiekti internetą.

„Outline“ teikiama naudojant „Shadowsocks“ ir ji vis dar yra ankstyvosios stadijos produktas. Jūs galite bendradarbiauti kurdami kodą sistemoje „GitHub“ ir stebėti mus sistemose „Reddit“ bei „Medium“, kad galėtumėte sužinoti, kada bus palaikoma daugiau platformų ir pridėta naujų funkcijų.", + "about-version": "{version} versija", + "aws-lightsail-firewall-0": "Eikite į {openLink}„Amazon Lightsail“{closeLink} atvejų ekraną.", + "aws-lightsail-firewall-1": "Spustelėkite atvejį, kur norite priglobti „Outline“.", + "aws-lightsail-firewall-2": "Eikite į skirtuką „Tinklas“ (Networking).", + "aws-lightsail-firewall-3": "Skiltyje „Užkarda“ (Firewall) spustelėkite „Pridėti kitą“ (Add another).", + "aws-lightsail-firewall-4": "Nustatykite „Programos“ (Application) vertę į „Visi TCP ir UDP prievadai“ (All TCP+UDP).", + "aws-lightsail-firewall-5": "Spustelėkite „Išsaugoti“ (Save).", + "cancel": "Atšaukti", + "close": "Uždaryti", + "confirmation-server-destroy": "Esami naudotojai nebeturės prieigos. Šio veiksmo negalima anuliuoti.", + "confirmation-server-destroy-title": "Naikinti serverį?", + "confirmation-server-remove": "Atlikus šį veiksmą serveris pašalinamas iš „Outline Manager“, bet naudotojai vis tiek gali prisijungti per tarpinį serverį. Vis tiek turėsite neautomatiškai ištrinti šį „Outline“ serverį iš prieglobos įrenginio.", + "confirmation-server-remove-title": "Pašalinti serverį?", + "data-limit": "Duomenų apribojimas", + "data-limit-per-key": "Kiekvieno rakto duomenų apribojimas", + "data-limits": "Duomenų apribojimai", + "data-limits-description": "Nustatykite prieigos raktų pastarųjų 30 d. duomenų apribojimą šiame serveryje.", + "data-limits-dialog-text": "Eikite į skirtuką „Nustatymai“, kad nustatytumėte prieigos raktų duomenų perkėlimo apribojimą šiame serveryje.", + "data-limits-dialog-title": "Neviršykite duomenų apribojimų", + "data-limits-disclaimer": "Kadangi šiuo metu teikiate metrikų ataskaitas, bus įtraukta duomenų naudojimo apribojimų funkcija. Peržiūrėkite {openLink}duomenų rinkimo politiką{closeLink}, jei reikia daugiau išsamios informacijos.", + "data-limits-usage": "Naudojama: {used} iš {total}", + "destroy": "Naikinti", + "digitalocean-disconnect-account": "„DigitalOcean“ paskyros atjungimas", + "digitalocean-unreachable": "Ši klaida galėjo įvykti dėl tinklo užkardos arba laikinų ryšio su digitalocean.com problemų.", + "disabled": "Išjungta", + "disconnect": "Atsijungti", + "done": "Atlikta", + "enabled": "Įgalinta", + "error-connectivity": "Jungiantis prie „DigitalOcean“ paskyros kilo problemų. Kartais tai būna laikina su „DigitalOcean“ arba interneto ryšiu susijusi problema. Jei pabandžius iš naujo problema išlieka, dar kartą prisijungus prie „DigitalOcean“ problemą turėtų pavykti išspręsti.", + "error-connectivity-title": "Ryšio problema", + "error-do-account-info": "Nepavyko gauti „DigitalOcean“ paskyros informacijos", + "error-do-auth": "Nepavyko nustatyti tapatybės naudojant „DigitalOcean“", + "error-do-limit": "„DigitalOcean“ paskyroje pasiektas {num} „Droplet“ įrengin. apribojimas. Galite pateikti padidinimo užklausą adresu https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Nepavyko gauti pasiekiamų regionų sąrašo", + "error-do-warning": "„DigitalOcean“ perspėjimas: „{message}“", + "error-feedback": "Nepavyko pateikti atsiliepimo. Bandykite dar kartą.", + "error-gcp-auth": "Nepavyko nustatyti tapatybės naudojant „Google Cloud Platform“", + "error-hostname-invalid": "Tai turi būti IP adresas arba tinkamas prieglobos serverio pavadinimas.", + "error-key-add": "Nepavyko pridėti rakto", + "error-key-remove": "Nepavyko pašalinti rakto", + "error-key-rename": "Nepavyko pervardyti rakto", + "error-keys-get": "Nepavyko įkelti raktų", + "error-keys-port-bad-input": "Prievadas turi būti nurodytas kaip sveikasis skaičius nuo 1 iki 65 535.", + "error-keys-port-in-use": "Prievadas jau naudojamas serveryje.", + "error-licenses": "Nepavyko įkelti licencijų.", + "error-metrics": "Įgalinant arba išjungiant metriką įvyko klaida", + "error-network": "Įvyko tinklo klaida.", + "error-not-saved": "Neišsaugota", + "error-remove-data-limit": "Nepavyko išjungti numatytojo duomenų apribojimo", + "error-remove-per-key-limit": "Nepavyko pašalinti šio prieigos rakto duomenų apribojimo", + "error-server-creation": "Kuriant „Outline“ serverį įvyko klaida.", + "error-server-destroy": "Nepavyko sunaikinti serverio", + "error-server-removed": "Šių serverių nebėra „DigitalOcean“ paskyroje: {serverName}.", + "error-server-rename": "Nepavyko pervardyti serverio", + "error-server-unreachable": "„Outline“ serveris buvo įdiegtas tinkamai, tačiau mums nepavyksta prie jo prisijungti. Greičiausiai taip yra todėl, kad serverio užkardos taisyklės blokuoja gaunamus ryšius. Peržiūrėkite taisykles ir leiskite gaunamus TCP ryšius prievaduose, kurių diapazonas yra nuo 1024 iki 65535.", + "error-server-unreachable-title": "Nepavyko prisijungti prie „Outline“ serverio", + "error-servers-removed": "Šių serverių nebėra „DigitalOcean“ paskyroje: {serverNames}.", + "error-set-data-limit": "Nepavyko nustatyti numatytojo duomenų apribojimo", + "error-set-per-key-limit": "Nepavyko nustatyti šio prieigos rakto duomenų apribojimo", + "error-unexpected": "Įvyko netikėta klaida.", + "experimental": "Eksperimentinė", + "experiments": "Eksperimentai", + "experiments-description": "Išbandykite naujas funkcijas ir pateikite atsiliepimų prieš jas išleidžiant.", + "experiments-disclaimer": "Eksperimentai yra kuriami ir gali pasikeisti arba būtų pašalinti iš programos. Jei šiuo metu teikiate metrikų ataskaitas, eksperimentinės funkcijos į jas bus įtrauktos. Peržiūrėkite {openLink}duomenų rinkimo politiką{closeLink}, jei reikia daugiau išsamios informacijos.", + "experiments-feedback": "Turite pasiūlymų? {openLink}Pateikite atsiliepimų čia.{closeLink}", + "feedback-cloud-provider": "Pasirinkite debesies paslaugų teikėją", + "feedback-cloud-provider-error": "Pasirinkite debesies paslaugų teikėją.", + "feedback-connection": "Nepavyko prisijungti prie serverio", + "feedback-connection-others": "Kiti negali prisijungti prie mano serverio", + "feedback-disclaimer": "Atminkite, kad komanda gali atsakyti į atsiliepimus tik anglų k.", + "feedback-email": "El. pašto adresas (nebūtinas)", + "feedback-error": "Įveskite atsiliepimą.", + "feedback-explanation-install": "Serveryje bandant įdiegti „Outline“ įvyko klaida. Jei nepavyko sugalvoti, kaip ją ištaisyti, galite atsiųsti mums atsiliepimą ir nurodyti savo el. pašto adresą (pasirenkama), kad galėtume su jumis susisiekti.", + "feedback-general": "Bendrieji atsiliepimai", + "feedback-install": "Diegiant „Outline“ kilo problema", + "feedback-label": "Jūsų atsiliepimas", + "feedback-management": "Kyla problemų tvarkant serverį", + "feedback-other": "Kitas", + "feedback-privacy": "Jūsų atsiliepimas, el. pašto adresas (jei nurodėte) ir papildoma informacija, nurodyta {openLink}privatumo politikoje{closeLink}, bus išsiųsti „Outline“ komandai.", + "feedback-submit": "Pateikti", + "feedback-suggestion": "Siūlymai", + "feedback-title-generic": "Atsiliepimo siuntimas", + "feedback-title-install": "Nepavyko įdiegti „Outline“ serverio", + "gcp-billing-action": "Kitas", + "gcp-billing-body": "Laukiama, kol {openLink}pridėsite atsiskaitomąją paskyrą sistemoje „Google Cloud“{closeLink}", + "gcp-billing-description": "{openLink}Atidarykite „Cloud Console“ atsiskaitymo puslapį{closeLink} ir pridėkite paskyrą, kad galėtumėte tęsti.", + "gcp-billing-error": "Nepavyko gauti atsiskaitymo informacijos", + "gcp-billing-error-zero": "Turite pridėti atsiskaitomąją paskyrą, kad galėtumėte tęsti.", + "gcp-click-create": "Spustelėkite „Kurti“ (Create).", + "gcp-create-new-project": "{openLink}Sukurkite naują „Google Cloud“ projektą{closeLink}.", + "gcp-create-new-vm": "{openLink}Sukurkite naują VM atvejį{closeLink}.", + "gcp-create-project": "Sukurkite „Google Cloud“ projektą", + "gcp-create-server": "Sukurkite „Google Cloud“ projektą", + "gcp-create-vm": "Sukurkite VM atvejį", + "gcp-disconnect-account": "Atjunkite „Google Cloud Platform“ paskyrą", + "gcp-firewall-create-0": "{openLink}Pridėkite naują užkardos taisyklę{closeLink} prie „Compute Engine“ projekto.", + "gcp-firewall-create-1": "Lauke „Pavadinimas“ (Name) įveskite „outline“.", + "gcp-firewall-create-2": "Lauke „Tikslinės žymos“ (Target tags) įveskite „outline“.", + "gcp-firewall-create-3": "Lauke „Šaltinio IP diapazonai“ (Source IP ranges) įveskite „0.0.0.0/0“.", + "gcp-firewall-create-4": "Skiltyje „Protokolai ir prievadai“ (Protocols and ports) pasirinkite „Leisti viską“ (Allow all).", + "gcp-name-your-project": "Suteikite projektui pavadinimą lauke „Projekto pavadinimas“ (Project name).", + "gcp-project-setup-error": "Nustatant „Google Cloud“ projektą įvyko klaida", + "gcp-select-machine-type": "Skiltyje „Įrenginio tipas“ (Machine type) pasirinkite „f1-micro“.", + "gcp-select-networking": "Spustelėkite „Valdymas, sauga, diskai, tinklas, atskiras nuomotojas“ (Management, security, disks, networking, sole tenancy), tada – „Tinklas“ (Networking)", + "gcp-select-region": "Skiltyje „Regionas“ (Region) pasirinkite regioną netoli serverio naudotojų vietos.", + "gcp-type-network-tag": "Lauke „Tinklo žymos“ (Network tags) įveskite „outline“", + "gcp-type-outline-server": "Lauke „Pavadinimas“ (Name) įveskite „outline-server“.", + "geo-amsterdam": "Amsterdamas", + "geo-bangalore": "Bangaloras", + "geo-changhua-county": "Čanghua", + "geo-delhi": "Delis", + "geo-eemshaven": "Emshavenas", + "geo-frankfurt": "Frankfurtas", + "geo-hamina": "Hamina", + "geo-hk": "Honkongas", + "geo-iowa": "Ajova", + "geo-jakarta": "Džakarta", + "geo-jurong-west": "Vakarų Džurongas", + "geo-las-vegas": "Las Vegasas", + "geo-london": "Londonas", + "geo-los-angeles": "Los Andželas", + "geo-melbourne": "Melburnas", + "geo-montreal": "Monrealis", + "geo-mumbai": "Mumbajus", + "geo-new-york-city": "Niujorkas", + "geo-northern-virginia": "Šiaurės Virdžinija", + "geo-oregon": "Oregonas", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Solt Leik Sitis", + "geo-san-francisco": "San Fransiskas", + "geo-sao-paulo": "San Paulas", + "geo-seoul": "Seulas", + "geo-sg": "Singapūras", + "geo-south-carolina": "Pietų Karolina", + "geo-st-ghislain": "Sen Gislenas", + "geo-sydney": "Sidnėjus", + "geo-tokyo": "Tokijas", + "geo-toronto": "Torontas", + "geo-warsaw": "Varšuva", + "geo-zurich": "Ciurichas", + "key": "Raktas: {keyId}", + "manual-server-assign-firewall": "Priskirkite užkardos taisyklę", + "manual-server-assign-group": "Priskirkite saugos grupes", + "manual-server-create-firewall": "Sukurkite užkardos taisyklę", + "manual-server-create-group": "Sukurkite saugos grupę", + "manual-server-description": "Atlikę šiuos veiksmus lengviau įdiegsite „Outline“ {cloudProvider} „Linux“ serveryje.", + "manual-server-firewall": "Užkardos konfigūravimas", + "manual-server-install-paste": "Čia įklijuokite diegimo išvestį.", + "manual-server-install-run": "Prisijunkite prie serverio ir vykdykite šią komandą.", + "manual-server-instructions": "Instrukcijos", + "manual-server-show-me": "Parodykite kur", + "manual-server-title": "Vadovaukitės toliau pateiktomis instrukcijomis", + "metrics-description": "Bendrindami anonimizuotas metrikas padėkite tobulinti „Outline“ patikimumą ir veikimą sau ir asmenims, su kuriais bendrinate serverį. {openLink}Sužinokite daugiau.{closeLink}", + "metrics-share": "Bendrinti metrikas", + "metrics-skip": "Praleisti", + "metrics-title": "Metrikų bendrinimas", + "nav-about": "Apie", + "nav-data-collection": "Duomenų rinkimas", + "nav-feedback": "Atsiliepimai", + "nav-help": "Pagalba", + "nav-licenses": "Licencijos", + "nav-privacy": "Privatumas", + "nav-terms": "Sąlygos", + "no-data-limit": "Nėra", + "notification-app-update": "Atsiųsta atnaujinta „Outline Manager“ versija. Ji bus įdiegta, kai iš naujo paleisite programą.", + "notification-feedback-thanks": "Dėkojame, kad padedate tobulinti produktą! Labai laukiame jūsų atsiliepimų.", + "notification-key-added": "Raktas pridėtas", + "notification-key-removed": "Raktas pašalintas", + "notification-server-destroyed": "Serveris sunaikintas", + "notification-server-exists": "Serveris jau pridėtas", + "notification-server-removed": "Serveris pašalintas", + "oauth-account-active": "„DigitalOcean“ paskyra aktyvinta.", + "oauth-account-active-tag": "Paskyra aktyvinta! Įkeliamos serverio vietos...", + "oauth-activate-account": "Aktyvinkite „DigitalOcean“ paskyrą.", + "oauth-billing": "Įveskite atsiskaitymo informaciją adresu digitalocean.com ir tai atlikę grįžkite į programą.", + "oauth-billing-tag": "Įveskite atsiskaitymo informaciją...", + "oauth-connect-description": "Naudodama jūsų paskyrą „Outline“ gali padėti sukurti serverį ir prisijungti.", + "oauth-connect-tag": "Laukiama, kol bus galima prijungti paskyrą...", + "oauth-connect-title": "Prisijunkite arba sukurkite paskyrą naudodami „DigitalOcean“.", + "oauth-sign-out": "Atsijungti", + "oauth-verify": "Gautuosiuose raskite el. laišką nuo „DigitalOcean“ ir spustelėję jame pateiktą nuorodą patvirtinkite paskyrą.", + "oauth-verify-tag": "Patvirtinkite el. paštą...", + "okay": "Gerai", + "per-key-data-limit-dialog-set-custom": "Nustatyti tinkintą duomenų apribojimą", + "per-key-data-limit-dialog-title": "Duomenų apribojimas – „{keyName}“", + "region-best-value": "Geriausia vertė", + "region-description": "Iš pasirinktos vietos bus teikiama interneto paslauga.", + "region-setup": "Nustatyti „Outline“", + "region-title": "Pasirinkite serverio vietą.", + "remove": "Pašalinti", + "retry": "Bandyti iš naujo", + "save": "Išsaugoti", + "saved": "Išsaugota", + "saving": "Išsaugoma...", + "server-access": "Serverio prieiga", + "server-access-key-new": "Pridėti naują raktą", + "server-access-key-rename": "Pervardyti", + "server-access-keys": "Prieigos raktai", + "server-connections": "Ryšiai", + "server-data-transfer": "Duomenys perkelti / pastarosios 30 dienų", + "server-data-used": "Išnaudotas pralaidumas / pastarosios 30 dienų", + "server-destroy": "Naikinti serverį", + "server-help-access-key-description": "Bendrinkite prieigos raktą su draugais, kad jie galėtų prisijungti prie jūsų „Outline“ serverio. Jie galės naudoti tą patį prieigos raktą visuose įrenginiuose.", + "server-help-access-key-next": "Kitas", + "server-help-access-key-title": "Raktų kūrimas, prieigos bendrinimas", + "server-help-connection-description": "Spustelėkite čia, kad įdiegtumėte „Outline“ klientų programą naudodami prieigos raktą „Outline“ serveryje.", + "server-help-connection-ok": "Gerai, supratau!", + "server-help-connection-title": "Dar nesate prisijungę!", + "server-keys": "Raktai", + "server-my-access-key": "Mano prieigos raktas", + "server-name": "„Outline“ serveris, {serverLocation}", + "server-remove": "Pašalinti serverį", + "server-settings": "Nustatymai", + "server-unreachable": "Serveris nepasiekiamas", + "server-unreachable-description": "Jungiantis prie šio serverio kyla problemų.", + "server-unreachable-managed-description": "Bandykite dar kartą arba pašalinkite šį serverį iš programos.", + "server-unreachable-manual-description": "Bandykite dar kartą arba sunaikinkite šį serverį ir virtualią prieglobą.", + "server-usage": "NAudojimas (pastarosios 30 dienų)", + "servers-add": "Pridėti serverį", + "servers-digitalocean": "„DigitalOcean“ serveriai", + "servers-gcp": "„Google Cloud Platform“ serveriai", + "servers-manual": "Serveriai", + "settings-access-key-port": "Prievadas naujiems prieigos raktams", + "settings-metrics-header": "Anoniminių metrikų bendrinimas", + "settings-server-api-url": "Valdymo API URL", + "settings-server-cost": "Mėnesio kaina", + "settings-server-creation": "Sukurta", + "settings-server-hostname": "Prieglobos serverio pavadinimas", + "settings-server-id": "Serverio ID", + "settings-server-info": "Serverio informacija", + "settings-server-location": "Serverio vieta", + "settings-server-name": "Pavadinimas", + "settings-server-rename": "Nustatykite naują serverio pavadinimą. Atkreipkite dėmesį, kad naujas pavadinimas nebus rodomas naudotojų, kuriuos pakvietėte prisijungti prie serverio, įrenginiuose.", + "settings-server-version": "Serverio versija", + "settings-transfer-limit": "Duomenų perkėlimo pralaidumas", + "setup-action": "Nustatyti", + "setup-advanced": "Išplėstinis diegimas", + "setup-anywhere": "Nustatykite „Outline“ bet kur", + "setup-cancel": "Atšaukite bet kuriuo metu", + "setup-create": "Kurti serverį", + "setup-description": "Neturite serverio? Sukurkite „DigitalOcean“ paskyrą.", + "setup-do-cost": "Tik 6 USD per mėnesį", + "setup-do-create": "Sukurkite naują serverį naudodami „DigitalOcean“ paskyrą už papildomą 6 USD mokestį per 30 dienų ir gaukite 1 TB duomenims perkelti.", + "setup-do-data": "1 TB duomenų perkėlimo pralaidumas", + "setup-do-description": "Tai gali šiek tiek užtrukti. Galite sunaikinti šį serverį bet kuriuo metu.", + "setup-do-easiest": "Paprasčiausias sąrankos procesas", + "setup-do-title": "Nustatoma „Outline“.", + "setup-firewall-instructions": "Užkardos instrukcijos", + "setup-gcp-create": "Sukurkite naują serverį naudodami „Google“ paskyrą. Mokesčiai skiriasi pagal vietovę ir naudojimą.", + "setup-gcp-easy": "Paprastas sąrankos procesas", + "setup-gcp-free-tier": "Su {openLinkFreeTier}nemokamu planu{closeLink} pirmas serveris kainuos nuo {openLinkIpPrice} 3 USD per mėnesį{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 d. nemokamas bandomasis laikotarpis{closeLink} naujiems naudotojams", + "setup-gcp-promo": "Išbandykite naują automatinį „Outline“ serverio kūrimo procesą, skirtą „Google Cloud“", + "setup-recommended": "Rekomenduojama", + "setup-simple-commands": "Paprastos diegimo komandos", + "setup-step-by-step": "Išsamus sąrankos vadovas", + "setup-tested": "Išbandyta naudojant VULTR, „Linode“ ir „Liquid Web“ paslaugas", + "setup-title": "Pasirinkite debesies paslaugą ir nustatykite „Outline“.", + "share-description": "Nukopijuokite šį kvietimą ir išsiųskite naudodami patikimą ryšio priemonę. {openLink}Reikia pagalbos?{closeLink}", + "share-invite-access-key-copied": "Prieigos raktas nukopijuotas į iškarpinę", + "share-invite-copied": "Kvietimas nukopijuotas į iškarpinę", + "share-invite-copy": "Kopijuoti kvietimą", + "share-invite-copy-access-key": "Kopijuoti prieigos raktą", + "share-invite-html": "Naudodami šį serverį saugiai pasiekite atvirą internetą.

1. Atsisiųskite ir įdiekite „Outline“ programą savo įrenginyje.

– „iOS“: https://itunes.apple.com/app/outline-app/id1356177741
– „MacOS“: https://itunes.apple.com/app/outline-app/id1356178125
– „Windows“: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– „Linux“: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– „Android“: https://play.google.com/store/apps/details?id=org.outline.android.client
– „Android“ alternatyvi nuoroda: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2. Gausite prieigos raktą, kuris prasideda „ss://“. Kai jį gausite, nukopijuokite šį prieigos raktą.

3. Atidarykite „Outline“ klientų programą. Jei prieigos raktas aptinkamas automatiškai, palieskite „Prisijungti“ ir tęskite. Jei prieigos raktas neaptinkamas automatiškai, įklijuokite jį lauke, tada palieskite „Prisijungti“ ir tęskite.

Esate pasiruošę naudoti atvirą internetą! Norėdami įsitikinti, kad sėkmingai prisijungėte prie serverio, „Google“ paieškoje pabandykite ieškoti „koks mano IP adresas“. „Google“ rodomas IP adresas turi atitikti „Outline“ kliento IP adresą.

Sužinokite daugiau apie „Outline“ adresu https://getoutline.org/.", + "share-invite-instructions": "Vadovaukitės platformoje „GitHub“ pateiktomis kvietimo instrukcijomis:", + "share-invite-trouble": "Kyla problemų bandant pasiekti kvietimo nuorodą?", + "share-title": "Prieigos bendrinimas", + "survey-data-limits-title": "Padėkite mums suprasti, kaip patobulinti duomenų apribojimus", + "survey-decline": "Atmesti", + "survey-disclaimer": "Spustelėję „Tęsti“ būsite nukreipti į trumpą apklausą „Google“ formose. Apklausą užpildyti rekomenduojame prisijungus prie „Outline“.", + "survey-go-to-survey": "Eiti į apklausą", + "terms-of-service": "Perskaičiau ir supratau {openLink}„Outline“ paslaugų teikimo sąlygas{closeLink}" +} diff --git a/server_manager/messages/lv.json b/server_manager/messages/lv.json new file mode 100644 index 0000000000..5441df8a9f --- /dev/null +++ b/server_manager/messages/lv.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Lietojumprogramma Outline ir atklātā pirmkoda projekts, ko izveidoja Jigsaw, lai ziņu aģentūras un žurnālisti varētu piekļūt internetam drošākā veidā.

Lietojumprogrammas Outline darbību nodrošina Shadowsocks, un šī produkta izstrāde joprojām ir agrīnā posmā. Varat papildināt kodu vietnē GitHub, kā arī sekot mums vietnēs Reddit un Medium, lai uzzinātu, kad tiek pievienotas papildu platformas un jaunas funkcijas.", + "about-version": "Versija {version}", + "aws-lightsail-firewall-0": "Pārejiet uz {openLink}Amazon Lightsail{closeLink} instanču ekrānu.", + "aws-lightsail-firewall-1": "Noklikšķiniet uz instances, kurā vēlaties mitināt Outline.", + "aws-lightsail-firewall-2": "Pārejiet uz cilni “Tīkls” (Networking).", + "aws-lightsail-firewall-3": "Sadaļā “Ugunsmūris” (Firewall) noklikšķiniet uz “Add another” (Pievienot citu).", + "aws-lightsail-firewall-4": "Iestatiet vienuma “Lietojums” (Application) vērtību uz “Visi TCP+UDP” (All TCP+UDP).", + "aws-lightsail-firewall-5": "Noklikšķiniet uz “Saglabāt” (Save).", + "cancel": "Atcelt", + "close": "Aizvērt", + "confirmation-server-destroy": "Esošie lietotāji zaudēs piekļuvi. Šo darbību nevar atsaukt.", + "confirmation-server-destroy-title": "Vai iznīcināt serveri?", + "confirmation-server-remove": "Veicot šo darbību, jūsu serveris tiek noņemts no Outline pārvaldnieka, taču netiek bloķēta lietotāju piekļuve starpniekserverim. Jums joprojām būs manuāli jādzēš Outline serveris no saimniekdatora.", + "confirmation-server-remove-title": "Vai noņemt serveri?", + "data-limit": "Datu ierobežojums", + "data-limit-per-key": "Datu ierobežojums atslēgai", + "data-limits": "Datu ierobežojumi", + "data-limits-description": "Iestatiet 30 dienu sākuma datu pārsūtīšanas ierobežojumu šī servera piekļuves atslēgām.", + "data-limits-dialog-text": "Pārejiet uz cilni Iestatījumi, lai iestatītu datu pārsūtīšanas ierobežojumu šī servera piekļuves atslēgām.", + "data-limits-dialog-title": "Nepieļaujiet datu pārtēriņu", + "data-limits-disclaimer": "Apkopojot rādītāju pārskatus, tiks ietverta datu ierobežojumu funkcija. Plašāku informāciju skatiet {openLink}datu vākšanas politikā{closeLink}.", + "data-limits-usage": "Izmantots: {used} no {total}", + "destroy": "Iznīcināt", + "digitalocean-disconnect-account": "DigitalOcean konta atsaistīšana", + "digitalocean-unreachable": "Iespējams, šī kļūda ir saistīta ar jūsu tīkla ugunsmūri vai ar īslaicīgām savienojamības problēmām vietnē digitalocean.com.", + "disabled": "Atspējota", + "disconnect": "Pārtraukt savienojumu", + "done": "Gatavs", + "enabled": "Iespējota", + "error-connectivity": "Radās problēmas, veidojot savienojumu ar jūsu DigitalOcean kontu. Dažkārt šī ir īslaicīga problēma, kas saistīta ar pakalpojumu DigitalOcean var ar jūsu interneta savienojumu. Ja pēc atkārtota mēģinājuma neizdodas izveidot savienojumu, vēlreiz piesakieties DigitalOcean kontā, lai novērstu problēmu.", + "error-connectivity-title": "Savienojuma problēma", + "error-do-account-info": "Neizdevās iegūt DigitalOcean konta informāciju.", + "error-do-auth": "Neizdevās veikt DigitalOcean konta autentifikāciju.", + "error-do-limit": "Jūsu DigitalOcean kontā ir sasniegts serveru (Droplets) maksimālais skaits ({num}). Varat pieprasīt palielināt maksimālo skaitu vietnē https://cloud.digitalocean.com/account/team/droplet_limit_increase.", + "error-do-regions": "Neizdevās iegūt sarakstu ar pieejamiem reģioniem.", + "error-do-warning": "DigitalOcean brīdinājums: “{message}”", + "error-feedback": "Neizdevās iesniegt atsauksmes. Lūdzu, mēģiniet vēlreiz.", + "error-gcp-auth": "Neizdevās autentificēšana Google Cloud Platform kontā", + "error-hostname-invalid": "Jāievada IP adrese vai derīgs saimniekdatora nosaukums.", + "error-key-add": "Neizdevās pievienot atslēgu.", + "error-key-remove": "Neizdevās noņemt atslēgu.", + "error-key-rename": "Neizdevās pārdēvēt atslēgu.", + "error-keys-get": "Nevarēja ielādēt atslēgas.", + "error-keys-port-bad-input": "Porta numuram ir jābūt veselam skaitlim no 1 līdz 65 535.", + "error-keys-port-in-use": "Šis ports jau tiek izmantots serverī.", + "error-licenses": "Nevarēja ielādēt licences.", + "error-metrics": "Rādītāju ziņošanas iespējošanas kļūda", + "error-network": "Radās tīkla kļūda.", + "error-not-saved": "Nav saglabāts", + "error-remove-data-limit": "Nevarēja atspējot noklusējuma datu ierobežojumu", + "error-remove-per-key-limit": "Nevarēja noņemt datu ierobežojumu šai piekļuves atslēgai", + "error-server-creation": "Radās problēma, veidojot jūsu Outline serveri.", + "error-server-destroy": "Neizdevās iznīcināt serveri.", + "error-server-removed": "Serveri {serverName} vairs nav pieejami jūsu DigitalOcean kontā.", + "error-server-rename": "Neizdevās pārdēvēt serveri.", + "error-server-unreachable": "Outline serveris tika pareizi instalēts, taču neizdodas ar to izveidot savienojumu. Visticamāk, ienākošie savienojumi tiek bloķēti jūsu servera ugunsmūra kārtulu dēļ. Lūdzu, pārskatiet šīs kārtulas. Ir jābūt atļautiem ienākošajiem TCP savienojumiem portos, kuru numuri ir no 1024 līdz 65535.", + "error-server-unreachable-title": "Nevar izveidot savienojumu ar jūsu Outline serveri", + "error-servers-removed": "Serveri {serverNames} vairs nav pieejami jūsu DigitalOcean kontā.", + "error-set-data-limit": "Nevarēja iestatīt noklusējuma datu ierobežojumu", + "error-set-per-key-limit": "Nevarēja iestatīt datu ierobežojumu šai piekļuves atslēgai", + "error-unexpected": "Radās neparedzēta kļūda.", + "experimental": "Eksperimentāla funkcija", + "experiments": "Eksperimentālas funkcijas", + "experiments-description": "Izmēģiniet jaunas funkcijas un sniedziet mums atsauksmes pirms funkciju izlaišanas.", + "experiments-disclaimer": "Eksperimentālās funkcijas ir izstrādes stadijā un var tikt mainītas vai noņemtas no lietotnes. Ja pašlaik veidojat rādītāju pārskatus, eksperimentālo funkciju izmantošana tiks ietverta. Plašāku informāciju skatiet {openLink}datu vākšanas politikā{closeLink}.", + "experiments-feedback": "Vai jums ir ieteikumi? {openLink}Iesniedziet atsauksmes šeit{closeLink}.", + "feedback-cloud-provider": "Atlasiet mākoņpakalpojumu sniedzēju.", + "feedback-cloud-provider-error": "Lūdzu, atlasiet mākoņpakalpojumu sniedzēju.", + "feedback-connection": "Nevar izveidot savienojumu ar manu serveri", + "feedback-connection-others": "Citi lietotāji nevar izveidot savienojumu ar manu serveri.", + "feedback-disclaimer": "Lūdzu, ņemiet vērā, ka mūsu komanda var sniegt atbildes tikai uz atsauksmēm, kas iesnegtas angļu valodā.", + "feedback-email": "E-pasta adrese (neobligāti)", + "feedback-error": "Lūdzu, ievadiet atsauksmes.", + "feedback-explanation-install": "Mēģinot instalēt lietojumprogrammu Outline jūsu serverī, radās kļūda. Ja nevarējāt atrast risinājumu, varat nosūtīt mums atsauksmes, norādot savu e-pasta adresi (neobligāti), lai mēs varētu ar jums sazināties.", + "feedback-general": "Vispārīgas atsauksmes", + "feedback-install": "Problēmas ar Outline instalēšanu", + "feedback-label": "Jūsu atsauksmes", + "feedback-management": "Problēmas ar servera pārvaldīšanu", + "feedback-other": "Cits", + "feedback-privacy": "Jūsu atsauksmes, e-pasta adrese (ja tā ir norādīta) un papildu informācija, kas norādīta {openLink}konfidencialitātes politikā{closeLink}, tiks nosūtīta Outline komandai.", + "feedback-submit": "Iesniegt", + "feedback-suggestion": "Ieteikumi", + "feedback-title-generic": "Atsauksmju sūtīšana", + "feedback-title-install": "Neizdevās instalēt Outline serveri", + "gcp-billing-action": "Tālāk", + "gcp-billing-body": "Gaidām, lai jūs {openLink}pievienotu norēķinu kontu pakalpojumā Google Cloud{closeLink}", + "gcp-billing-description": "Lai turpinātu, {openLink}atveriet Cloud Console norēķinu lapu{closeLink} un pievienojiet kontu.", + "gcp-billing-error": "Nevar izgūt norēķinu informāciju", + "gcp-billing-error-zero": "Lai varētu turpināt, jums vispirms jāpievieno norēķinu konts.", + "gcp-click-create": "Noklikšķiniet uz “Create” (Izveidot).", + "gcp-create-new-project": "{openLink}Izveidojiet jaunu Google Cloud projektu{closeLink}.", + "gcp-create-new-vm": "{openLink}Izveidojiet jaunu VM instanci{closeLink}.", + "gcp-create-project": "Google Cloud projekta izveide", + "gcp-create-server": "Google Cloud projekta izveide", + "gcp-create-vm": "VM instances izveide", + "gcp-disconnect-account": "Google Cloud Platform konta atvienošana", + "gcp-firewall-create-0": "{openLink}Pievienojiet jaunu ugunsmūra kārtulu{closeLink} projektam Compute Engine.", + "gcp-firewall-create-1": "Laukā “Name” (Nosaukums) ierakstiet “outline”.", + "gcp-firewall-create-2": "Laukā “Target tags” (Mērķa atzīmes) ierakstiet “outline”.", + "gcp-firewall-create-3": "Laukā “Source IP ranges” (Mērķa IP diapazoni) ierakstiet “0.0.0.0/0”.", + "gcp-firewall-create-4": "Sadaļā “Protocols and ports” (Protokoli un porti) atlasiet vienumu “Allow all” (Atļaut visus).", + "gcp-name-your-project": "Laukā “Projekta nosaukums” (Project name) piešķiriet projektam nosaukumu.", + "gcp-project-setup-error": "Mēģinot izveidot Google Cloud projektu, radās kļūda", + "gcp-select-machine-type": "Sadaļā “Mašīnas veids” (Machine type) atlasiet “'f1-micro”.", + "gcp-select-networking": "Noklikšķiniet uz “Pārvaldība, drošība, diski, tīkls, atsevišķa nomāšana” (Management, security, disks, networking, sole tenancy) un pēc tam — uz “Tīkls” (Networking).", + "gcp-select-region": "Sadaļā “Reģions” (Region) atlasiet reģionu, kura tuvumā būs servera lietotāji.", + "gcp-type-network-tag": "Laukā “Tīkla atzīmes” (Network tags) ierakstiet “outline”.", + "gcp-type-outline-server": "Laukā “Nosaukums” (Name) ierakstiet “outline-server”.", + "geo-amsterdam": "Amsterdama", + "geo-bangalore": "Bengalūru", + "geo-changhua-county": "Džanhua apgabals", + "geo-delhi": "Deli", + "geo-eemshaven": "Ēmsas osta", + "geo-frankfurt": "Frankfurte", + "geo-hamina": "Hamina", + "geo-hk": "Honkonga", + "geo-iowa": "Aiova", + "geo-jakarta": "Džakarta", + "geo-jurong-west": "Rietumdžurona", + "geo-las-vegas": "Lasvegasa", + "geo-london": "Londona", + "geo-los-angeles": "Losandželosa", + "geo-melbourne": "Melburna", + "geo-montreal": "Monreāla", + "geo-mumbai": "Mumbaja", + "geo-new-york-city": "Ņujorka", + "geo-northern-virginia": "Ziemeļvirdžīnija", + "geo-oregon": "Oregona", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Soltleiksitija", + "geo-san-francisco": "Sanfrancisko", + "geo-sao-paulo": "Sanpaulu", + "geo-seoul": "Seula", + "geo-sg": "Singapūra", + "geo-south-carolina": "Dienvidkarolīna", + "geo-st-ghislain": "Sengilēna", + "geo-sydney": "Sidneja", + "geo-tokyo": "Tokija", + "geo-toronto": "Toronto", + "geo-warsaw": "Varšava", + "geo-zurich": "Cīrihe", + "key": "Atslēga {keyId}", + "manual-server-assign-firewall": "Ugunsmūra kārtulas piešķiršana", + "manual-server-assign-group": "Drošības grupas piešķiršana", + "manual-server-create-firewall": "Ugunsmūra kārtulas izveide", + "manual-server-create-group": "Drošības grupas izveide", + "manual-server-description": "Veicot šīs darbības, varēsiet instalēt lietojumprogrammu Outline {cloudProvider} Linux serverī.", + "manual-server-firewall": "Ugunsmūra konfigurēšana", + "manual-server-install-paste": "Ielīmējiet instalēšanas skripta rezultātu šeit.", + "manual-server-install-run": "Piesakieties savā serverī un izpildiet šo komandu.", + "manual-server-instructions": "Norādījumi", + "manual-server-show-me": "Rādīt izvietojumu", + "manual-server-title": "Veicamās darbības", + "metrics-description": "Kopīgojiet anonimizētus rādītājus, lai palīdzētu uzlabot Outline uzticamību un veiktspēju sev un lietotājiem, ar kuriem koplietojat savu serveri. {openLink}Uzziniet vairāk{closeLink}.", + "metrics-share": "Kopīgot rādītājus", + "metrics-skip": "Izlaist", + "metrics-title": "Rādītāju kopīgošana", + "nav-about": "Par", + "nav-data-collection": "Datu apkopošana", + "nav-feedback": "Atsauksmes", + "nav-help": "Palīdzība", + "nav-licenses": "Licences", + "nav-privacy": "Konfidencialitāte", + "nav-terms": "Noteikumi", + "no-data-limit": "Nav", + "notification-app-update": "Tika lejupielādēta lietojumprogrammas Outline pārvaldnieks atjaunināta versija. Tā tiks instalēta, kad restartēsiet lietojumprogrammu.", + "notification-feedback-thanks": "Paldies, ka palīdzat mums veikt uzlabojumus! Mēs priecājamies saņemt jūsu atsauksmes.", + "notification-key-added": "Atslēga pievienota", + "notification-key-removed": "Atslēga noņemta", + "notification-server-destroyed": "Serveris iznīcināts", + "notification-server-exists": "Serveris jau pievienots", + "notification-server-removed": "Serveris noņemts", + "oauth-account-active": "Jūsu DigitalOcean konts ir aktivizēts.", + "oauth-account-active-tag": "Konts ir aktivizēts. Notiek serveru atrašanās vietu ielādēšana...", + "oauth-activate-account": "DigitalOcean konta aktivizēšana", + "oauth-billing": "Ievadiet savu norēķinu informāciju vietnē digitalocean.com. Kad esat to izdarījis, atgriezieties lietotnē.", + "oauth-billing-tag": "Ievadiet norēķinu informāciju...", + "oauth-connect-description": "Izmantojot savu kontu, lietojumprogrammā Outline varēsiet ērti izveidot serveri un savienojumu.", + "oauth-connect-tag": "Tiek gaidīts savienojums ar jūsu kontu...", + "oauth-connect-title": "Pierakstieties vai izveidojiet DigitalOcean kontu.", + "oauth-sign-out": "Izrakstīties", + "oauth-verify": "Pārbaudiet, vai jūsu iesūtnē nav saņemts e-pasta ziņojums no DigitalOcean, un noklikšķiniet uz ziņojumā norādītās saites, lai apstiprinātu savu kontu.", + "oauth-verify-tag": "Apstipriniet savu e-pasta adresi...", + "okay": "Labi", + "per-key-data-limit-dialog-set-custom": "Iestatīt pielāgotu datu ierobežojumu", + "per-key-data-limit-dialog-title": "Datu ierobežojums — {keyName}", + "region-best-value": "Izdevīgākā cena.", + "region-description": "No šī servera varēsiet izmantot internetu.", + "region-setup": "Iestatīt Outline", + "region-title": "Atlasiet servera atrašanās vietu.", + "remove": "Noņemt", + "retry": "Mēģināt vēlreiz", + "save": "Saglabāt", + "saved": "Saglabāts", + "saving": "Notiek saglabāšana...", + "server-access": "Piekļuve serverim", + "server-access-key-new": "Pievienot jaunu atslēgu", + "server-access-key-rename": "Pārdēvēt", + "server-access-keys": "Piekļuves atslēgas", + "server-connections": "Savienojumi", + "server-data-transfer": "Pārsūtītie dati / pēdējās 30 dienas", + "server-data-used": "Izmantotais atļautais apjoms / pēdējās 30 dienas", + "server-destroy": "Iznīcināt serveri", + "server-help-access-key-description": "Kopīgojiet piekļuves atslēgas ar draugiem, lai viņi varētu izveidot savienojumu ar jūsu Outline serveri. Jūsu draugi var izmantot vienu piekļuves atslēgu visās savās ierīcēs.", + "server-help-access-key-next": "Tālāk", + "server-help-access-key-title": "Atslēgu izveide un piekļuves kopīgošana", + "server-help-connection-description": "Noklikšķiniet šeit, lai instalētu Outline klienta lietotni, izmantojot personīgo piekļuves atslēgu savam Outline serverim.", + "server-help-connection-ok": "Labi, sapratu!", + "server-help-connection-title": "Jūs vēl neesat izveidojis savienojumu!", + "server-keys": "Atslēgas", + "server-my-access-key": "Mana piekļuves atslēga", + "server-name": "Outline serveris: {serverLocation}", + "server-remove": "Noņemt serveri", + "server-settings": "Iestatījumi", + "server-unreachable": "Nevar sasniegt serveri", + "server-unreachable-description": "Ir radušās problēmas, veidojot savienojumu ar šo serveri.", + "server-unreachable-managed-description": "Mēģiniet vēlreiz vai noņemiet šo serveri no lietojumprogrammas.", + "server-unreachable-manual-description": "Mēģiniet vēlreiz vai iznīciniet šo serveri un virtuālo saimniekdatoru.", + "server-usage": "Lietojums (pēdējās 30 dienas)", + "servers-add": "Pievienot serveri", + "servers-digitalocean": "DigitalOcean serveri", + "servers-gcp": "Google Cloud Platform serveri", + "servers-manual": "Serveri", + "settings-access-key-port": "Ports jaunām piekļuves atslēgām", + "settings-metrics-header": "Anonīmu rādītāju kopīgošana", + "settings-server-api-url": "Pārvaldības API URL", + "settings-server-cost": "Mēneša maksa", + "settings-server-creation": "Izveidots", + "settings-server-hostname": "Saimniekdatora nosaukums", + "settings-server-id": "Servera ID", + "settings-server-info": "Servera informācija", + "settings-server-location": "Servera atrašanās vieta", + "settings-server-name": "Nosaukums", + "settings-server-rename": "Iestatiet serverim jaunu nosaukumu. Ņemiet vērā, ka šīs izmaiņas netiks atspoguļotas to lietotāju ierīcēm, kurus uzaicinājāt izveidot savienojumu ar šo serveri.", + "settings-server-version": "Servera versija", + "settings-transfer-limit": "Atļautais datu pārsūtīšanas apjoms", + "setup-action": "Iestatīt", + "setup-advanced": "Papildu", + "setup-anywhere": "Outline iestatīšana pie jebkura mākoņpakalpojumu sniedzēja", + "setup-cancel": "Varēsiet atcelt jebkurā brīdī.", + "setup-create": "Izveidot serveri", + "setup-description": "Vai jums nav servera? Izveidojiet DigitalOcean kontu.", + "setup-do-cost": "Tikai 6 USD mēnesī", + "setup-do-create": "Izveidojiet jaunu serveri, izmantojot savu DigitalOcean kontu, par papildu 6 USD mēnesī un pārsūtiet datus 1 TB apmērā.", + "setup-do-data": "Atļautais datu pārsūtīšanas apjoms: 1 TB", + "setup-do-description": "Šis process var ilgt vairākas minūtes. Jebkurā brīdī varat iznīcināt šo serveri.", + "setup-do-easiest": "Īpaši ērts iestatīšanas process", + "setup-do-title": "Outline iestatīšana", + "setup-firewall-instructions": "Ugunsmūra konfigurēšanas norādījumi", + "setup-gcp-create": "Izveidojiet jaunu serveri, izmantojot savu Google kontu. Izmaksas ir atkarīgas no atrašanās vietas un lietojuma.", + "setup-gcp-easy": "Ērts iestatīšanas process.", + "setup-gcp-free-tier": "Izmantojot {openLinkFreeTier}bezmaksas līmeni{closeLink}, maksa par pirmo serveri ir {openLinkIpPrice}3 USD mēnesī{closeLink}.", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 dienu bezmaksas izmēģinājuma periods{closeLink} jauniem lietotājiem", + "setup-gcp-promo": "Izmēģināt jauno, automātisko Outline servera izveides procesu, kas paredzēts Google Cloud", + "setup-recommended": "Ieteicams", + "setup-simple-commands": "Vienkāršas instalēšanas komandas", + "setup-step-by-step": "Detalizēti iestatīšanas norādījumi", + "setup-tested": "Testēts pakalpojumos VULTR, Linode un Liquid Web", + "setup-title": "Izvēlieties mākoņpakalpojumu, lai iestatītu Outline serveri.", + "share-description": "Kopējiet šo uzaicinājumu un nosūtiet to no uzticama saziņas rīka. {openLink}Vai jums ir nepieciešama palīdzība?{closeLink}", + "share-invite-access-key-copied": "Piekļuves atslēga ir kopēta starpliktuvē", + "share-invite-copied": "Uzaicinājums ir kopēts starpliktuvē", + "share-invite-copy": "Kopēt uzaicinājumu", + "share-invite-copy-access-key": "Kopēt piekļuves atslēgu", + "share-invite-html": "Izmantojot šo serveri, varat droši piekļūt atklātajam internetam, kā norādīts tālāk.

1) Lejupielādējiet un instalējiet savai ierīcei atbilstošo Outline lietotni.

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- macOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Cita saite Android ierīcēm: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Saņemsiet piekļuves atslēgu, kas sāksies ar prefiksu “ss://”. Kad piekļuves atslēga ir saņemta, nokopējiet to.

3) Atveriet Outline klienta lietotni. Ja piekļuves atslēga tiek noteikta automātiski, pieskarieties pogai “Izveidot savienojumu” un turpiniet. Ja piekļuves atslēga netiek noteikta automātiski, ielīmējiet to laukā, pēc tam pieskarieties pogai “Izveidot savienojumu” un turpiniet.

Esat gatavs izmantot atklāto internetu. Lai pārbaudītu, vai esat sekmīgi izveidojis savienojumu ar serveri, varat Google meklēšanā ievadīt frāzi “what is my ip” (kāda ir mana IP adrese). Google parādītajai IP adresei ir jāatbilst Outline klientā norādītajai IP adresei.

Šeit varat uzzināt vairāk par Outline: https://getoutline.org/", + "share-invite-instructions": "Izpildiet norādījumus par uzaicinājumu, ko esam snieguši platformā GitHub:", + "share-invite-trouble": "Vai ir radušās problēmas ar piekļuvi uzaicinājuma saitei?", + "share-title": "Piekļuves kopīgošana", + "survey-data-limits-title": "Palīdziet mums saprast, kā uzlabot datu ierobežojumus", + "survey-decline": "Noraidīt", + "survey-disclaimer": "Noklikšķinot uz “Turpināt”, tiksiet novirzīts uz īsu aptauju Google veidlapās. Ieteicams aizpildīt aptauju, kamēr ir izveidots savienojums ar Outline.", + "survey-go-to-survey": "Pāriet uz aptauju", + "terms-of-service": "Esmu izlasījis un saprotu {openLink}Outline pakalpojumu sniegšanas noteikumus{closeLink}." +} diff --git a/server_manager/messages/master_messages.json b/server_manager/messages/master_messages.json new file mode 100644 index 0000000000..ccae614a56 --- /dev/null +++ b/server_manager/messages/master_messages.json @@ -0,0 +1,1315 @@ +{ + "about_outline": { + "message": "Outline is an open source project created by $JIGSAW$ to provide a safer way for news organizations and journalists to access the internet.$NEW_LINE$$NEW_LINE$ Outline is powered by $SHADOWSOCKS$ and is still an early stage product. You can contribute to the code on $GITHUB$, and follow us on $REDDIT$ and $MEDIUM$ to hear when we expand to more platforms and add new features.", + "description": "This string appears in a dialog as a paragraph to provide a description of the product. Outline is the product name and should not be translated.", + "placeholders": { + "GITHUB": { + "content": "GitHub" + }, + "JIGSAW": { + "content": "Jigsaw" + }, + "MEDIUM": { + "content": "Medium" + }, + "NEW_LINE": { + "content": "
" + }, + "REDDIT": { + "content": "Reddit" + }, + "SHADOWSOCKS": { + "content": "Shadowsocks" + } + } + }, + "about_version": { + "message": "Version $VERSION$", + "description": "This string appears in a dialog as a header to indicate the version of the application.", + "placeholders": { + "VERSION": { + "content": "{version}", + "example": "1.0.2" + } + } + }, + "aws_lightsail_firewall_0": { + "message": "Navigate to the $START_OF_LINK$Amazon Lightsail$END_OF_LINK$ instances screen.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure firewall rules in Amazon Lightsail. Amazon Lightsail is a product name and should not be translated.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "aws_lightsail_firewall_1": { + "message": "Click the instance on which you want to host Outline.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure firewall rules in Amazon Lightsail." + }, + "aws_lightsail_firewall_2": { + "message": "Navigate to the 'Networking' tab.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure firewall rules in Amazon Lightsail.. 'Networking' should be translated and included untranslated in parentheses." + }, + "aws_lightsail_firewall_3": { + "message": "In the 'Firewall' section, click 'Add another'.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure firewall rules in Amazon Lightsail. Words in quotes should be translated and included untranslated in parentheses." + }, + "aws_lightsail_firewall_4": { + "message": "Set 'Application' value to 'All TCP+UDP'.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure firewall rules in Amazon Lightsail. Words in quotes should be translated and included untranslated in parentheses." + }, + "aws_lightsail_firewall_5": { + "message": "Click 'Save'.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure firewall rules in Amazon Lightsail. Words in quotes should be translated and included untranslated in parentheses." + }, + "cancel": { + "message": "Cancel", + "description": "This string appears across the application as a button. Clicking it aborts the current flow." + }, + "geo_amsterdam": { + "message": "Amsterdam", + "description": "Name of the city in the Netherlands." + }, + "geo_bangalore": { + "message": "Bangalore", + "description": "Name of the city in India." + }, + "geo_changhua_county": { + "message": "Changhua County", + "description": "Name of the county in Taiwan." + }, + "geo_delhi": { + "message": "Delhi", + "description": "Name of the city in India." + }, + "geo_eemshaven": { + "message": "Eemshaven", + "description": "Name of the seaport in the Netherlands." + }, + "geo_frankfurt": { + "message": "Frankfurt", + "description": "Name of the city in Germany." + }, + "geo_hamina": { + "message": "Hamina", + "description": "Name of the town in Finland." + }, + "geo_hk": { + "message": "Hong Kong", + "description": "Name of Hong Kong in China" + }, + "geo_iowa": { + "message": "Iowa", + "description": "Name of the US state." + }, + "geo_jakarta": { + "message": "Jakarta", + "description": "Name of the capital of Indonesia." + }, + "geo_jurong_west": { + "message": "Jurong West", + "description": "Name of the area in Singapore." + }, + "geo_las_vegas": { + "message": "Las Vegas", + "description": "Name of the city in the Nevada, USA." + }, + "geo_london": { + "message": "London", + "description": "Name of the city in England." + }, + "geo_los_angeles": { + "message": "Los Angeles", + "description": "Name of the city in California, USA." + }, + "geo_melbourne": { + "message": "Melbourne", + "description": "Name of the city in Australia." + }, + "geo_montreal": { + "message": "Montréal", + "description": "Name of the city in Canada." + }, + "geo_mumbai": { + "message": "Mumbai", + "description": "Name of the city in India." + }, + "geo_new_york_city": { + "message": "New York", + "description": "Name of the city in the United States." + }, + "geo_northern_virginia": { + "message": "Northern Virginia", + "description": "Name of the area in Virginia, USA." + }, + "geo_oregon": { + "message": "Oregon", + "description": "Name of the US state." + }, + "geo_osaka": { + "message": "Osaka", + "description": "Name of the city in Japan." + }, + "geo_salt_lake_city": { + "message": "Salt Lake City", + "description": "Name of the city in Utah, USA." + }, + "geo_san_francisco": { + "message": "San Francisco", + "description": "Name of the city in the United States." + }, + "geo_sao_paulo": { + "message": "São Paulo", + "description": "Name of the state in Brazil." + }, + "geo_seoul": { + "message": "Seoul", + "description": "Name of the city in South Korea." + }, + "geo_sg": { + "message": "Singapore", + "description": "Name of the country of Singapore" + }, + "geo_south_carolina": { + "message": "South Carolina", + "description": "Name of the US state." + }, + "geo_st_ghislain": { + "message": "St. Ghislain", + "description": "Name of the town in Belgium." + }, + "geo_sydney": { + "message": "Sydney", + "description": "Name of the city in Australia." + }, + "geo_tokyo": { + "message": "Tokyo", + "description": "Name of the city in Japan." + }, + "geo_toronto": { + "message": "Toronto", + "description": "Name of the city in Canada." + }, + "geo_warsaw": { + "message": "Warsaw", + "description": "Name of the city in Poland." + }, + "geo_zurich": { + "message": "Zürich", + "description": "Name of the city in Switzerland." + }, + "close": { + "message": "Close", + "description": "This string appears in dialogs as a button. Clicking it dismisses the dialog." + }, + "confirmation_server_destroy": { + "message": "Existing users will lose access. This action cannot be undone.", + "description": "This string appears in a dialog that requests user confirmation for destroying a server. It informs the user about the consequences of destroying a server. 'Destroy' in this context implies that the server will be deleted." + }, + "confirmation_server_destroy_title": { + "message": "Destroy Server?", + "description": "This string appears in a dialog that requests user confirmation for destroying a server. 'Destroy' in this context implies that the server will be deleted." + }, + "confirmation_server_remove": { + "message": "This action removes your server from the Outline Manager, but does not block proxy access to users. You will still need to manually delete the Outline server from your host machine.", + "description": "This string appears in a dialog that requests user confirmation for removing a server from the application. It informs the user about the consequences of removing a server. 'Remove' in this context does not imply server deletion." + }, + "confirmation_server_remove_title": { + "message": "Remove Server?", + "description": "This string appears in a dialog that requests user confirmation for removing a server from the application. 'Remove' in this context does not imply server deletion." + }, + "data_limit": { + "message": "Data Limit", + "Description": "This string appears in various places related to the data transfer limit for a single access key." + }, + "data_limit_per_key": { + "message": "Data limit per key", + "description": "This string appears as a label to an input to set the default access key data limit for a server." + }, + "data_limits": { + "message": "Data limits", + "description": "This string appears as a title in a section to configure access key data transfer limits." + }, + "data_limits_description": { + "message": "Set a 30 day trailing data transfer limit for access keys on this server.", + "description": "This string appears as an explanation to the access key data transfer limits feature." + }, + "data_limits_dialog_text": { + "message": "Go to the Settings tab to set a data transfer limit for access keys on this server.", + "description": "This string appears as a text in a dialog to advertise the data limits feature." + }, + "data_limits_dialog_title": { + "message": "Avoid data overages", + "description": "This string appears as a title in a dialog to advertise the data limits feature." + }, + "data_limits_disclaimer": { + "message": "Since you are currently reporting metrics, use of the data limits feature will be included. Please see the $START_OF_LINK$data collection policy$END_OF_LINK$ for more details.", + "description": "This string provides a data collection disclaimer to opting into the data limits features.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "data_limits_usage": { + "message": "$USED$ of $TOTAL$ used", + "description": "This string appears in a tooltip when the data limits feature is enabled. It lets the user know how much data an access key has used, relative to the limit.", + "placeholders": { + "USED": { + "content": "{used}", + "example": "10 GB" + }, + "TOTAL": { + "content": "{total}", + "example": "50 GB" + } + } + }, + "destroy": { + "message": "Destroy", + "description": "This string appears as a button in a dialog that requests user confirmation for destroying a server. Clicking the button causes the server to be deleted." + }, + "disconnect": { + "message": "Disconnect", + "description": "This string appears as a button in a dialog to disconnect the user's cloud service account from the application. Clicking it signs the user out of the cloud server provider." + }, + "digitalocean_disconnect_account": { + "message": "Disconnect DigitalOcean account", + "description": "This string appears as a header in a dialog to disconnect the user's DigitalOcean account from the application. DigitalOcean is a cloud server provider name and should not be translated." + }, + "digitalocean_unreachable": { + "message": "This error may be due to a firewall on your network or temporary connectivity issues with digitalocean.com.", + "description": "This string appears in a dialog as a paragraph. It is shown when a DigitalOcean server cannot be reached. DigitalOcean is a cloud server provider." + }, + "disabled": { + "message": "Disabled", + "description": "This string appears across the application as a drop-down menu option. It allows the user to deactivate features." + }, + "done": { + "message": "Done", + "description": "This string appears across the application as a button. It lets the user indicate that an action, such as entering text or reading a dialog, has been completed." + }, + "enabled": { + "message": "Enabled", + "description": "This string appears across the application as a drop-down menu option. It allows the user to activate features." + }, + "error_connectivity": { + "message": "We're having trouble connecting to your DigitalOcean account. This is sometimes a temporary problem with DigitalOcean or with your internet connection. If retrying doesn't work, logging into DigitalOcean again should fix the problem.", + "description": "This string appears in a dialog as a paragraph. The dialog is shown when an operation on a DigitalOcean server fails due to connectivity issues. The dialog displays buttons that allow the user to retry the operation. DigitalOcean is a cloud server provider name and should not be translated." + }, + "error_connectivity_title": { + "message": "Connection problem", + "description": "This string appears in a dialog as a header. The dialog is shown when an operation on a server fails due to connectivity issues. The dialog displays buttons that allow the user to retry the operation." + }, + "error_do_account_info": { + "message": "Failed to get DigitalOcean account information", + "description": "This string appears in an error notification toast. It is shown when there is an error retrieving the user's DigitalOcean account. DigitalOcean is a cloud server provider name and should not be translated." + }, + "error_do_auth": { + "message": "Authentication with DigitalOcean failed", + "description": "This string appears in an error notification toast. It is shown when there is an error when logging in to the user's DigitalOcean account. DigitalOcean is a cloud server provider name and should not be translated." + }, + "error_do_regions": { + "message": "Failed to get list of available regions", + "description": "This string appears in an error notification toast. It is shown when there is an error retrieving the regions available for server deployment." + }, + "error_do_limit": { + "message": "Your DigitalOcean account has reached its limit of $NUM$ Droplets. You can request an increase at https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "description": "This string appears in an error notification toast. It is shown when the user has created the maximum number of allowed servers.", + "placeholders": { + "NUM": { + "content": "{num}", + "example": "3" + } + } + }, + "error_do_warning": { + "message": "DigitalOcean warning: \"$MESSAGE$\"", + "description": "This string appears in an error notification toast when login has succeeded but there is a warning message.", + "placeholders": { + "MESSAGE": { + "content": "{message}", + "example": "Your team has been locked due to improper use of the platform." + } + } + }, + "error_gcp_auth": { + "message": "Authentication with Google Cloud Platform failed", + "description": "This string appears in an error notification toast. It is shown when there is an error when logging in to the user's Google Cloud Platform account. Google Cloud Platform is a cloud server provider name and should not be translated." + }, + "error_feedback": { + "message": "Failed to submit feedback. Please try again.", + "description": "This string appears in an error notification toast. It is shown when there is an error submitting the user's feedback." + }, + "error_hostname_invalid": { + "message": "Must be an IP address or valid hostname.", + "description": "This string appears in an inline error message. It signifies that the user has input an invalid hostname." + }, + "error_key_add": { + "message": "Failed to add key", + "description": "This string appears in an error notification toast. It is shown when there is an error creating a server access key." + }, + "error_key_remove": { + "message": "Failed to remove key", + "description": "This string appears in an error notification toast. It is shown when there is an error deleting a server access key." + }, + "error_key_rename": { + "message": "Failed to rename key", + "description": "This string appears in an error notification toast. It is shown when there is an error renaming a server access key." + }, + "error_keys_get": { + "message": "Could not load keys", + "description": "This string appears in an error notification toast. It is shown when there is an error retrieving a server access keys." + }, + "error_keys_port_bad_input": { + "message": "The port must be an integer between 1 and 65,535.", + "description": "This string appears in an inline error message. It signifies that the input number for the port for new access keys is invalid." + }, + "error_keys_port_in_use": { + "message": "The port is already in use on the server.", + "description": "This string appears in an inline error message. It signifies that the input port for new access keys is already being used on the server and is unavailable." + }, + "error_licenses": { + "message": "Could not load licenses.", + "description": "This string appears in a dialog that shows the application's software licenses. It is shown instead of the licenses' text when loading them fails." + }, + "error_metrics": { + "message": "Error setting metrics enabled", + "description": "This string appears in an error notification toast. It is shown when there is an error enabling or disabling a server's metrics reporting." + }, + "error_network": { + "message": "A network error occurred.", + "description": "This string indicates that an error happened due to network errors like not being connected to the internet." + }, + "error_not_saved": { + "message": "Not Saved", + "description": "This string appears in an error notification toast. It signifies failure to submit user input to change the port number for new access keys." + }, + "error_server_creation": { + "message": "There was an error creating your Outline server.", + "description": "This string appears in an dialog as a paragraph. The dialog is shown when there is an creating a server; the user can retry the operation or destroy the server." + }, + "error_server_destroy": { + "message": "Failed to destroy server", + "description": "This string appears in an error notification toast. It is shown when there is an error destroying a server." + }, + "error_server_removed": { + "message": "$SERVER_NAME$ no longer present in your DigitalOcean account.", + "description": "This string appears in an error notification toast. It is shown when a DigitalOcean server was destroyed outside the application to let the user know that it will not be displayed in the UI. DigitalOcean is a cloud server provider name and should not be translated.", + "placeholders": { + "SERVER_NAME": { + "content": "{serverName}", + "example": "New York Outline Server" + } + } + }, + "error_server_rename": { + "message": "Failed to rename server", + "description": "This string appears in an error notification toast. It is shown when there is an error renaming a server." + }, + "error_server_unreachable": { + "message": "Your Outline Server was installed correctly, but we are not able to connect to it. Most likely this is because your server's firewall rules are blocking incoming connections. Please review them and make sure to allow incoming TCP connections on ports ranging from 1024 to 65535.", + "description": "This string appears in dialog as a paragraph. The dialog is shown when a server is installed successfully but cannot be reached. The dialog provides possible solutions and displays buttons that allow the user to retry reaching the server." + }, + "error_server_unreachable_title": { + "message": "Unable to connect to your Outline Server", + "description": "This string appears in dialog as a header. The dialog is shown when a server is installed successfully but cannot be reached." + }, + "error_servers_removed": { + "message": "$SERVER_NAMES$ no longer present in your DigitalOcean account.", + "description": "This string appears in an error notification toast. It is shown when multiple DigitalOcean servers were destroyed outside the application to let the user know that they will not be displayed in the UI. DigitalOcean is a cloud server provider name and should not be translated.", + "placeholders": { + "SERVER_NAMES": { + "content": "{serverNames}", + "example": "New York Outline Server, Amsterdam Outline Server" + } + } + }, + "error_unexpected": { + "message": "An unexpected error occurred.", + "description": "This string signifies that an error we didn't expect was encountered." + }, + "error_set_data_limit": { + "message": "Could not set default data limit", + "description": "This string appears in an error notification toast. It is shown on failure to set the default data transfer limit on access keys." + }, + "error_remove_data_limit": { + "message": "Could not disable default data limit", + "description": "This string appears in an error notification toast. It is shown on failure to remove the default data transfer limit on access keys." + }, + "error_set_per_key_limit": { + "message": "Could not set data limit for this access key", + "description": "This string appears in an error notification toast. It is shown on failure to set the data transfer limit on a particular access key." + }, + "error_remove_per_key_limit": { + "message": "Could not remove data limit from this access key", + "description": "This string appears in an error notification toast. It is shown on failure to remove the data transfer limit on a particular access key." + }, + "experimental": { + "message": "Experimental", + "description": "This tag appears above a feature that is not yet fully tested." + }, + "experiments": { + "message": "Experiments", + "description": "This string is the title of a section that displays opt-in experimental features." + }, + "experiments_description": { + "message": "Test new features and provide us with feedback before they are released.", + "description": "This string is the description of a section that displays opt-in experimental features." + }, + "experiments_disclaimer": { + "message": "Experiments are in development and may change or be removed from the app. If you are currently reporting metrics, use of experimental features will be included. Please see the $START_OF_LINK$data collection policy$END_OF_LINK$ for more details.", + "description": "This string provides a disclaimer to opting into experimental features.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "experiments_feedback": { + "message": "Have suggestions? $START_OF_LINK$Submit feedback here.$END_OF_LINK$", + "description": "This string appears in a section that allows the user to enable experimental features. Allows the user to submit feedback about a particular feature.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "feedback_cloud_provider": { + "message": "Select cloud provider", + "description": "This string appears in the feedback dialog as an placeholder within a drop-down. Allows the user to select a cloud provider for certain feedback categories." + }, + "feedback_cloud_provider_error": { + "message": "Please select a cloud provider.", + "description": "This string appears in the feedback dialog as an error message within a drop-down. The string appears when the user attempts to submit feedback without selecting a cloud provider." + }, + "feedback_connection": { + "message": "Can't connect to my server", + "description": "This string appears in the feedback dialog as an option within a drop-down of feedback categories. Indicates that the user cannot connect to their server." + }, + "feedback_connection_others": { + "message": "Others can't connect to my server", + "description": "This string appears in the feedback dialog as an option within a drop-down of feedback categories. Indicates that users who have been given access keys cannot connect to the server." + }, + "feedback_disclaimer": { + "message": "Please note that our team is only able to answer feedback in English.", + "description": "This string appears in the feedback dialog as a paragraph under the feedback form. Lets the user know that, although the application is localized, our team can only respond to feedback in English." + }, + "feedback_email": { + "message": "Email address (optional)", + "description": "This string appears in the feedback dialog as a label of the email input form." + }, + "feedback_error": { + "message": "Please enter feedback.", + "description": "This string appears in the feedback dialog as a paragraph below the feedback input form. It is displayed when the user clicks the submit button without having entered feedback in the input form." + }, + "feedback_explanation_install": { + "message": "An error occurred while attempting to install Outline on your server. If you haven't been able to figure out a solution, please consider sending us feedback and telling us your email address (optional) so that we can get back to you.", + "description": "This string appears in the feedback dialog as a paragraph above the feedback input form. The feedback dialog gets automatically displayed with this message when a server installation fails." + }, + "feedback_general": { + "message": "General feedback", + "description": "This string appears in the feedback dialog as an option within a drop-down of feedback categories. Indicates that the user is providing general feedback." + }, + "feedback_install": { + "message": "Having trouble installing Outline", + "description": "This string appears in the feedback dialog as an option within a drop-down of feedback categories. Indicates that the user cannot install Outline on their server." + }, + "feedback_label": { + "message": "Your feedback", + "description": "This string appears in the feedback dialog as a placeholder of the feedback input form." + }, + "feedback_management": { + "message": "Having trouble managing my server", + "description": "This string appears in the feedback dialog as an option within a drop-down of feedback categories. Indicates that the user is having issues managing their server." + }, + "feedback_other": { + "message": "Other", + "description": "This string appears in the feedback dialog as an option within a drop-down of cloud providers. Indicates that the user has a server on an unlisted cloud provider." + }, + "feedback_privacy": { + "message": "Your feedback, email address (if provided) and additional information referred to in the $START_OF_LINK$privacy policy$END_OF_LINK$ will be sent to the Outline team.", + "description": "This string appears in the feedback dialog as paragraph below the feedback input form. Lets the user know how their feedback and personal information will be handled.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "feedback_submit": { + "message": "Submit", + "description": "This string appears in the feedback dialog as a button. Clicking it submits the feedback form." + }, + "feedback_suggestion": { + "message": "Suggestions", + "description": "This string appears in the feedback dialog as an option within a drop-down of feedback categories. Indicates that the user is providing a product suggestion." + }, + "feedback_title_generic": { + "message": "Send Feedback", + "description": "This string appears in the feedback dialog as a header." + }, + "feedback_title_install": { + "message": "Outline Server Installation Failed", + "description": "This string appears in the feedback dialog as a header. The feedback dialog gets automatically displayed with this header when a server installation fails." + }, + "gcp_billing_description": { + "message": "$START_OF_LINK$Open the Cloud Console billing page$END_OF_LINK$ and add an account in order to proceed.", + "description": "This instruction is a clarification regarding the title of the billing page.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "gcp_billing_action": { + "message": "Next", + "description": "Button label for a button that opens the billing page in the web browser (i.e. next step).", + "meaning": "gcp_billing_action" + }, + "gcp_billing_body": { + "message": "Waiting for you to $START_OF_LINK$add a billing account on Google Cloud$END_OF_LINK$", + "description": "Body text on the billing page", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "gcp_billing_error": { + "message": "Unable to retrieve billing information", + "description": "Error popup message in response to a user click" + }, + "gcp_billing_error_zero": { + "message": "You must add a billing account before proceeding.", + "description": "Error popup message in response to a user click" + }, + "gcp_click_create": { + "message": "Click 'Create'.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure a firewall in Google Cloud Platform. 'Create' should be translated and included untranslated in parentheses." + }, + "gcp_create_new_project": { + "message": "$START_OF_LINK$Create a new Google Cloud Project$END_OF_LINK$.", + "description": "This string appears in the server setup view as a card header for creating a new Google Cloud project", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "gcp_create_new_vm": { + "message": "$START_OF_LINK$Create a new VM instance$END_OF_LINK$.", + "description": "This string appears in the server setup view as an section header for instructions for creating a VM on Google Cloud.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "gcp_create_project": { + "message": "Create a Google Cloud project", + "description": "This string appears as a header of a set of instructions for creating a new Google Cloud project" + }, + "gcp_create_server": { + "message": "Create your Google Cloud Project", + "description": "This string appears in the server setup view as a section header for creating a new Google Cloud project" + }, + "gcp_create_vm": { + "message": "Create a VM Instance", + "description": "This string appears as a header for a set of instructions for creating a new Google Cloud VM" + }, + "gcp_disconnect_account": { + "message": "Disconnect Google Cloud Platform account", + "description": "This string appears as a header in a dialog to disconnect the user's Google Cloud Platform account from the application. Google Cloud Platform is a cloud server provider name and should not be translated." + }, + "gcp_firewall_create_0": { + "message": "$START_OF_LINK$Add a new firewall rule$END_OF_LINK$ to your Compute Engine project.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure a firewall in Google Cloud Platform. Compute Engine is a product of Google Cloud Platform and should not be translated.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "gcp_firewall_create_1": { + "message": "Type 'outline' in the 'Name' field.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure a firewall in Google Cloud Platform. 'Name' should be translated and included untranslated in parentheses." + }, + "gcp_firewall_create_2": { + "message": "Type 'outline' in the 'Target tags' field.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure a firewall in Google Cloud Platform. 'Target tags' should be translated and included untranslated in parentheses." + }, + "gcp_firewall_create_3": { + "message": "Type '0.0.0.0/0' in the 'Source IP ranges' field.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure a firewall in Google Cloud Platform. 'Source IP ranges' should be translated and included untranslated in parentheses." + }, + "gcp_firewall_create_4": { + "message": "Select 'Allow all' under 'Protocols and ports'.", + "description": "This string appears within the server setup view as an item of a list that provides instructions to configure a firewall in Google Cloud Platform. 'Allow all' and 'Protocols and ports' should be translated and included untranslated in parentheses." + }, + "gcp_name_your_project": { + "message": "Name your project in the 'Project name' field.", + "description": "This string appears as instructions for naming a new Google Cloud Project. 'Project Name' should be translated and include untranslated in parentheses" + }, + "gcp_project_setup_error": { + "message": "An error occurred while setting up your Google Cloud project", + "description": "Error message, shown in a popup when server creation fails" + }, + "gcp_select_machine_type": { + "message": "Select 'f1-micro' under 'Machine type'", + "description": "This string appears as an instruction for selecting the machine type for a new Google Cloud VM. 'Machine type' should be translated and include untranslated in parentheses." + }, + "gcp_select_networking": { + "message": "Click 'Management, security, disks, networking, sole tenancy', then 'Networking'", + "description": "This string appears as an instruction to find the networking options when creating a new Google Cloud VM. 'Management, security, disks, networking, sole tenancy' and 'Networking' should match that used in the Google Cloud Console should be translated and included untranslated in parentheses." + }, + "gcp_select_region": { + "message": "Select a region close to where the server's users will be under 'Region'.", + "description": "This string appears as an instruction for selecting a region for a new Google Cloud VM. 'Region' should be translated and include untranslated in parentheses." + }, + "gcp_type_network_tag": { + "message": "Type 'outline' in the 'Network tags' field", + "description": "This string appears as an instruction for specifying a network tag in a new Google Cloud VM. 'Network tags' should be translated and include untranslated in parentheses" + }, + "gcp_type_outline_server": { + "message": "Type 'outline-server' in the 'Name' field.", + "description": "This string is an instruction in directions for creating a new Google Cloud VM. 'Name' should be translated and include untranslated in parentheses" + }, + "key": { + "message": "Key $KEY_ID$", + "description": "This string appears in the server view as a placeholder for a newly created access key with id number KEY_ID.", + "placeholders": { + "KEY_ID": { + "content": "{keyId}", + "example": "1" + } + } + }, + "manager_resources": { + "message": "Manager Resources", + "description": "This string appears within the manager sidebar as a link to the manager documentation." + }, + "management_api_documentation": { + "message": "Server Management API Documentation", + "description": "This string appears next to the management API url, pointing to the API documentation." + }, + "manual_server_assign_firewall": { + "message": "Assign firewall rule", + "description": "This string appears in the server setup view as a sub-header of a section that provides instructions to configure the server's firewall." + }, + "manual_server_assign_group": { + "message": "Assign Security Group", + "description": "This string appears in the server setup view as a sub-header of a section that provides instructions to configure the server's firewall." + }, + "manual_server_create_firewall": { + "message": "Create a firewall rule", + "description": "This string appears in the server setup view as a sub-header of a section that provides instructions to configure the server's firewall." + }, + "manual_server_create_group": { + "message": "Create a Security Group", + "description": "This string appears in the server setup view as a sub-header of a section that provides instructions to configure the server's firewall." + }, + "manual_server_description": { + "message": "These steps will help you install Outline on a $CLOUD_PROVIDER$ Linux server.", + "description": "This string appears in the server setup view as a header. Lets the user know that the following sections provide instructions on how to install Outline on their server.", + "placeholders": { + "CLOUD_PROVIDER": { + "content": "{cloudProvider}", + "example": "Amazon Web Services" + } + } + }, + "manual_server_firewall": { + "message": "Configure your firewall", + "description": "This string appears in the server setup view as the header of a section that provides instructions to configure the server's firewall." + }, + "manual_server_install_paste": { + "message": "Paste your installation output here.", + "description": "This string appears in the server setup view as a header of a section that contains an input form. The user must enter the output of the server installation script to manage their server in the application." + }, + "manual_server_install_run": { + "message": "Log into your server, and run this command.", + "description": "This string appears in the server setup view as a header of a section that displays a command to install Outline on their server." + }, + "manual_server_instructions": { + "message": "Instructions", + "description": "This string appears in the server setup view as a toggle of a section that provides instructions to configure the server's firewall." + }, + "manual_server_show_me": { + "message": "Show me where", + "description": "This string appears in the server setup view as a button. Clicking the button opens a link to the cloud server provider management console." + }, + "manual_server_title": { + "message": "Follow the instructions below", + "description": "This string appears in the server setup view as a header. Communicates to the user that they need to perform a series of actions to install Outline on their server." + }, + "metrics_description": { + "message": "Share anonymized metrics to help improve the reliability and performance of Outline, for you and for those you share your server with. $START_OF_LINK$Learn more.$END_OF_LINK$", + "description": "This string appears in the server settings view as a paragraph next to a toggle that enables/disables server metrics reporting.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "metrics_share": { + "message": "Share metrics", + "description": "This string appears as a button of a dialog that prompts the user to share server metrics. Clicking it enables server metrics reporting." + }, + "metrics_skip": { + "message": "Skip", + "description": "This string appears as a button of a dialog that prompts the user to share server metrics. Clicking it dismisses the dialog." + }, + "metrics_title": { + "message": "Metrics sharing", + "description": "This string appears as the header of a dialog that prompts the user to share server metrics." + }, + "nav_about": { + "message": "About", + "description": "This string appears in an application drawer as a navigation link. Clicking it opens a dialog with information about Outline." + }, + "no_data_limit": { + "message": "None", + "description": "This string appears alongside each access key in the data transfer stats section if it is under no data limit. Example: 450 MB / None" + }, + "nav_data_collection": { + "message": "Data collection", + "description": "This string appears in an application drawer as a navigation link. Clicking it opens Outline's data collection policy in the browser." + }, + "nav_feedback": { + "message": "Feedback", + "description": "This string appears in an application drawer as a navigation link. Clicking it opens a dialog that allows the user to submit feedback." + }, + "nav_help": { + "message": "Help", + "description": "This string appears in an application drawer as a navigation link. Clicking it opens Outline's support website." + }, + "nav_licenses": { + "message": "Licenses", + "description": "This string appears in an application drawer as a navigation link. Clicking it opens a dialog listing Outline's software licenses." + }, + "nav_privacy": { + "message": "Privacy", + "description": "This string appears in an application drawer as a navigation link. Clicking it opens Outline's privacy policy in the browser." + }, + "nav_terms": { + "message": "Terms", + "description": "This string appears in an application drawer as a navigation link. Clicking it opens Outline's terms of service in the browser." + }, + "notification_app_update": { + "message": "An updated version of the Outline Manager has been downloaded. It will be installed when you restart the application.", + "description": "This string appears in a transient notification toast. It is shown when an update to the application is ready to install." + }, + "notification_feedback_thanks": { + "message": "Thanks for helping us improve! We love hearing from you.", + "description": "This string appears in a transient notification toast. It is shown when the user has successfully submitted feedback." + }, + "notification_key_added": { + "message": "Key added", + "description": "This string appears in a transient notification toast. It is shown when a server access key has been successfully created." + }, + "notification_key_removed": { + "message": "Key removed", + "description": "This string appears in a transient notification toast. It is shown when a server access key has been successfully removed." + }, + "notification_server_destroyed": { + "message": "Server destroyed", + "description": "This string appears in a transient notification toast. It is shown when a server has been successfully destroyed." + }, + "notification_server_exists": { + "message": "Server already added", + "description": "This string appears in a transient notification toast. It is shown when the user attempts to add server that is already present in the application." + }, + "notification_server_removed": { + "message": "Server removed", + "description": "This string appears in a transient notification toast. It is shown when a server has been successfully removed from the application." + }, + "oauth_account_active": { + "message": "Your DigitalOcean account has been activated.", + "description": "This string appears in the DigitalOcean account creation flow as a sub-header. Lets the user know their DigitalOcean account is active. DigitalOcean is a cloud provider name and should not be translated." + }, + "oauth_account_active_tag": { + "message": "Account activated! Loading server locations...", + "description": "This string appears in the DigitalOcean account creation flow as a paragraph. Displayed when the user's DigitalOcean account has been successfully activated." + }, + "oauth_activate_account": { + "message": "Activate your DigitalOcean account.", + "description": "This string appears in the DigitalOcean account creation flow as a header. Displayed when the account has been created but not yet active. DigitalOcean is a cloud provider name and should not be translated." + }, + "oauth_billing": { + "message": "Enter your billing information on digitalocean.com and return to the app once you are done.", + "description": "This string appears in the DigitalOcean account creation flow as a sub-header. Prompts the user to enter their billing information on DigitalOcean's website." + }, + "oauth_billing_tag": { + "message": "Enter billing information...", + "description": "This string appears in the DigitalOcean account creation flow as a paragraph. Prompts the user to enter their billing information on DigitalOcean's website." + }, + "oauth_connect_description": { + "message": "With your account, Outline makes it easy to create a server and get connected.", + "description": "This string appears in the DigitalOcean account creation flow as a sub-header. Displayed when the user has not yet authorized Outline to access their DigitalOcean account." + }, + "oauth_connect_tag": { + "message": "Waiting to connect your account...", + "description": "This string appears in the DigitalOcean account creation flow as a paragraph. Displayed when the user has not yet authorized Outline to access their DigitalOcean account." + }, + "oauth_connect_title": { + "message": "Sign in or create an account with DigitalOcean.", + "description": "This string appears in the DigitalOcean account creation flow as a header. Displayed when the user has not yet signed in to DigitalOcean or created an account." + }, + "oauth_sign_out": { + "message": "Sign Out", + "description": "This string appears in the DigitalOcean account creation flow as a button. Displayed when the user has authorized Outline to access their account. Clicking it aborts the account creation flow and signs out the user." + }, + "oauth_verify": { + "message": "Check your inbox for an email from DigitalOcean, and click the link in it to confirm your account.", + "description": "This string appears in the DigitalOcean account creation flow as a sub-header. Displayed when the user has not yet entered billing information to activate their DigitalOcean account. DigitalOcean is a cloud provider name and should not be translated." + }, + "oauth_verify_tag": { + "message": "Confirm your email...", + "description": "This string appears in the DigitalOcean account creation flow as a paragraph. Displayed when the user has not yet confirmed the registered email for their DigitalOcean account." + }, + "okay": { + "message": "OK", + "description": "This string appears across the application as a button. It lets the user acknowledge displayed information. Clicking dismisses the enclosing UI element." + }, + "per_key_data_limit_dialog_set_custom": { + "message": "Set a custom data limit", + "description": "This string appears next to a checkbox in the per-key data limit dialog which, when selected, shows the input to add a data limit to an access key" + }, + "per_key_data_limit_dialog_title": { + "message": "Data Limit - $KEY_NAME$", + "description": "This string appears as the title of the per-key data limit dialog.", + "placeholders": { + "KEY_NAME": { + "content": "{keyName}", + "Example": "Key 1" + } + } + }, + "region_description": { + "message": "This is where your internet experience will come from.", + "description": "This string appears within the server creation flow, as a sub-header of the server selection view. Lets the user know about the implications of selecting a server location." + }, + "region_best_value": { + "message": "Best Value", + "description": "Appears within the server creation flow, indicating that a server option costs less than the other options." + }, + "region_setup": { + "message": "Set up Outline", + "description": "This string appears within the server creation flow, as a button of the server selection view. Clicking it creates an Outline server at the selected location. 'Set up' means install and run the Outline server software." + }, + "region_title": { + "message": "Select the location of your server.", + "description": "This string appears within the server creation flow, as the header of the server selection view." + }, + "remove": { + "message": "Remove", + "description": "This string appears across the application as a button. It allows the user to confirm the removal of a server or access key." + }, + "retry": { + "message": "Retry", + "description": "This string appears across the application as a button. It allows the user to retry a failed operation." + }, + "save": { + "message": "Save", + "description": "This string appears across the application as a button. It allows the user to submit some input" + }, + "saved": { + "message": "Saved", + "description": "This string appears across the application as a transient notification toast. It appears when user input has been accepted." + }, + "saving": { + "message": "Saving...", + "description": "This string appears across the application as a transient notification toast. It appears when user input is being processed." + }, + "server_access": { + "message": "Server access", + "description": "This string appears within the server view as the header of a card that displays the number of server access keys." + }, + "server_access_key_new": { + "message": "Add new key", + "description": "This string appears within the server view as a button. Clicking it creates a new server access key." + }, + "server_access_key_rename": { + "message": "Rename", + "description": "This string appears within the server view as a button of a drop-down to manage a server access key. Clicking it renames the access key." + }, + "server_access_keys": { + "message": "Access keys", + "description": "This string appears within the server view as a header of a table column that displays server access keys." + }, + "server_connections": { + "message": "Connections", + "description": "This string appears within the server view as a header of the section that displays server information and access keys." + }, + "server_data_transfer": { + "message": "Data transferred / last 30 days", + "description": "This string appears within the server view as the header of a card that displays the amount of data transferred by the server." + }, + "server_data_used": { + "message": "Allowance used / last 30 days", + "description": "This string appears within the server view as the header of a card that displays the amount of data transferred by the server as a percentage of the total available data." + }, + "server_destroy": { + "message": "Destroy server", + "description": "This string appears within the server view as a button of a drop-down to manage a server. Clicking it opens a confirmation dialog to destroy the server." + }, + "server_help_access_key_description": { + "message": "Share access keys with friends, so they can connect to your Outline server. They can use the same access key on all their devices.", + "description": "This string appears within a help bubble as a paragraph. The help bubble is displayed when a server is installed. Informs to the user how to share access to their server." + }, + "server_help_access_key_next": { + "message": "Next", + "description": "This string appears within a help bubble as a button. Clicking it displays the next help bubble." + }, + "server_help_access_key_title": { + "message": "Create keys, share access", + "description": "This string appears within a help bubble as a header. The help bubble provides information about sharing access to the server through access keys." + }, + "server_help_connection_description": { + "message": "Click here to install the Outline client app, using your personal access key to your Outline server.", + "description": "This string appears within a help bubble as a paragraph. Informs the user how to install the Outline clients and get connected to the server." + }, + "server_help_connection_ok": { + "message": "Okay, got it!", + "description": "This string appears within a help bubble as a button. Clicking it dismisses the help bubble." + }, + "server_help_connection_title": { + "message": "You are not connected yet!", + "description": "This string appears within a help bubble as a header. The help bubble provides information about connecting to the server." + }, + "server_keys": { + "message": "Keys", + "description": "This string appears within the server view as the unit of a card that displays the number of server access keys." + }, + "server_my_access_key": { + "message": "My access key", + "description": "This string appears within the server view as the header for the default server access key. This key is meant to be used by the server administrator." + }, + "server_name": { + "message": "Outline Server $SEVER_LOCATION$", + "description": "This string appears within the server view and in the application drawer. It is the default name for a newly created server.", + "placeholders": { + "SEVER_LOCATION": { + "content": "{serverLocation}", + "example": "New York" + } + } + }, + "server_remove": { + "message": "Remove server", + "description": "This string appears within the server view as a button of a drop-down to manage a server. Clicking it opens a confirmation dialog to remove the server from the application." + }, + "server_settings": { + "message": "Settings", + "description": "This string appears within the server view as a header of the section that displays server settings." + }, + "server_unreachable": { + "message": "Server unreachable", + "description": "This string appears within a server view as a header. Displayed when a server's information cannot be displayed because it is not reachable." + }, + "server_unreachable_description": { + "message": "We're having issues connecting to this server.", + "description": "This string appears within a server view as a paragraph. Informs the user that a server's information cannot be displayed because it is not reachable." + }, + "server_unreachable_managed_description": { + "message": "Try again or remove this server from the application.", + "description": "This string appears within a server view as a header. Displayed when a server's information cannot be displayed because it is not reachable. Prompts the user to retry contacting the server or remove it from the application." + }, + "server_unreachable_manual_description": { + "message": "Try again or destroy this server and the virtual host.", + "description": "This string appears within a server view as a header. Displayed when a server's information cannot be displayed because it is not reachable. Prompts the user to retry contacting the server or destroy it." + }, + "server_usage": { + "message": "Usage (last 30 days)", + "description": "This string appears within the server view as a header of a table column that displays the breakdown of data usage by access key." + }, + "servers_add": { + "message": "Add server", + "description": "This string appears in an application drawer as a button. Clicking it starts the server setup flow." + }, + "servers_digitalocean": { + "message": "DigitalOcean servers", + "description": "This string appears in an application drawer as the header of a section that displays the list of DigitalOcean servers. DigitalOcean is a cloud server provider name and should not be translated." + }, + "servers_gcp": { + "message": "Google Cloud Platform servers", + "description": "This string appears in an application drawer as the header of a section that displays the list of Google Cloud Platform servers. Google Cloud Platform is a cloud server provider name and should not be translated." + }, + "servers_manual": { + "message": "Servers", + "description": "This string appears in an application drawer as the header of a section that displays a list of servers." + }, + "settings_access_key_port": { + "message": "Port for new access keys", + "description": "This string appears in the server settings view as a label for the server port number used to create new access keys." + }, + "settings_metrics_header": { + "message": "Share anonymous metrics", + "description": "This string appears in the server settings view as a header of the section to configure server metrics reporting." + }, + "settings_server_api_url": { + "message": "Management API URL", + "description": "This string appears in the server settings view as a label for the server's management API URL. API stands for application programming interface; the acronym should not be translated." + }, + "settings_server_cost": { + "message": "Monthly cost", + "description": "This string appears in the server settings view as a label for the server's monthly cost." + }, + "settings_server_creation": { + "message": "Created", + "description": "This string appears in the server settings view as a label for the server's creation date." + }, + "settings_server_hostname": { + "message": "Hostname", + "description": "This string appears in the server settings view as a label for the server's IP address or domain name." + }, + "settings_server_id": { + "message": "Server ID", + "description": "This string appears in the server settings view as a label for the server's unique identifier." + }, + "settings_server_info": { + "message": "Server Information", + "description": "This string appears in the server settings view as a header of the section that displays server details." + }, + "settings_server_location": { + "message": "Server location", + "description": "This string appears in the server settings view as a label for the server's location." + }, + "settings_server_name": { + "message": "Name", + "description": "This string appears in the server settings view as a label for the server's name." + }, + "settings_server_rename": { + "message": "Set a new name for your server. Note that this will not be reflected on the devices of the users that you invited to connect to it.", + "description": "This string appears in the server settings view as a paragraph below the server's name. Informs the user about the implications of renaming a server." + }, + "settings_server_version": { + "message": "Server version", + "description": "This string appears in the server settings view as a label for the server version." + }, + "settings_transfer_limit": { + "message": "Data transfer allowance", + "description": "This string appears in the server settings view as a label for the server's data transfer allowance." + }, + "setup_action": { + "message": "Set up", + "description": "This string appears in the server setup view as a button. Clicking it starts the server setup flow. 'Set up' means install and run the Outline server software." + }, + "setup_advanced": { + "message": "Advanced", + "description": "This string appears in the server setup view as a label. Advanced in this context implies that the user will have to follow technical instructions to install Outline." + }, + "setup_anywhere": { + "message": "Set up Outline anywhere", + "description": "This string appears in the server setup view as a header within a card. The card provides information about installing Outline on an arbitrary cloud server provider." + }, + "setup_create": { + "message": "Create server", + "description": "This string appears in the server setup view as a button. Clicking it starts the server creation flow." + }, + "setup_description": { + "message": "Don't have a server? Create an account with DigitalOcean.", + "description": "This string appears in the server setup view as a sub-header. Prompts the user to create a DigitalOcean account to deploy Outline servers. DigitalOcean is a cloud provider name and should not be translated." + }, + "setup_cancel": { + "message": "Cancel at any time", + "description": "This string appears in the server setup view as an item of a list describing Outline's features." + }, + "setup_do_cost": { + "message": "Only US$6 a month", + "description": "This string appears in the server setup view as an item of a list describing Outline's features." + }, + "setup_do_create": { + "message": "Create a new server with your DigitalOcean account for an additional US$6/30 days for 1 TB of data transfer.", + "description": "This string appears in the server setup view as a paragraph within a card. Describes Outline servers' features when deployed on DigitalOcean. DigitalOcean is a cloud provider name and should not be translated; TB is an abbreviation for terabyte and should not be translated" + }, + "setup_do_data": { + "message": "1 TB data transfer allowance", + "description": "This string appears in the server setup view as an item of a list describing Outline's features. Refers to the monthly amount of transfer data offered by a cloud server provider. TB is an abbreviation for terabyte and should not be translated." + }, + "setup_do_description": { + "message": "This could take several minutes. You can destroy this server at any time.", + "description": "This string appears in the server setup view as a sub-header. Displayed when a server is being created along a progress bar." + }, + "setup_do_easiest": { + "message": "Easiest setup process", + "description": "This string appears in the server setup view as an item of a list describing Outline's features." + }, + "setup_do_title": { + "message": "Setting up Outline.", + "description": "This string appears in the server setup view as a header. Displayed when a server is being created along a progress bar." + }, + "setup_gcp_easy": { + "message": "Easy setup process", + "description": "This string appears in the server setup view as an item of a list describing Outline's features." + }, + "setup_gcp_free_tier": { + "message": "With $START_OF_LINK1$Free Tier$END_OF_LINK$, your first server starts at $START_OF_LINK2$US$3/month$END_OF_LINK$", + "description": "Describes the benefits of the GCP Free Tier program (https://cloud.google.com/free/docs/gcp-free-tier)", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK1": { + "content": "{openLinkFreeTier}" + }, + "START_OF_LINK2": { + "content": "{openLinkIpPrice}" + } + } + }, + "setup_gcp_free_trial": { + "message": "$START_OF_LINK$90 day free trial$END_OF_LINK$ for new users", + "description": "Describes the benefits of the GCP Free Trial program (https://cloud.google.com/free/docs/gcp-free-tier/#free-trial)", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLinkFreeTrial}" + } + } + }, + "setup_gcp_create": { + "message": "Create a new server with your Google account. Costs vary by location and usage.", + "description": "This string appears in the server setup view as a paragraph within a card. Describes Outline servers' features when deployed on Google Cloud Platform." + }, + "setup_gcp_promo": { + "message": "Try the new automatic Outline server creation process for Google Cloud", + "description": "Link text that takes users to an easier setup procedure" + }, + "setup_firewall_instructions": { + "message": "Firewall instructions", + "description": "This string appears in the server setup view as the header of a section that provides instructions to configure the server's firewall." + }, + "setup_recommended": { + "message": "Recommended", + "description": "This string appears in the server setup view as a label. Describes Outline servers deployment on DigitalOcean, which is easier from a user perspective." + }, + "setup_simple_commands": { + "message": "Simple install commands", + "description": "This string appears in the server setup view as an item of a list describing Outline's features." + }, + "setup_step-by-step": { + "message": "Step-by-step set-up guide", + "description": "This string appears in the server setup view as an item of a list describing Outline's features." + }, + "setup_tested": { + "message": "Tested on VULTR, Linode, and Liquid Web", + "description": "This string appears in the server setup view as an item of a list describing Outline's features. VULTR, Linode, and Liquid Web a cloud provider names and should not be translated." + }, + "setup_title": { + "message": "Choose a cloud service to set up Outline.", + "description": "This string appears in the server setup view as a header. Prompts the user to create deploy Outline servers on the cloud provider of their choice. 'Set up' means install and run the Outline server software." + }, + "share_description": { + "message": "Copy this invitation and send it from a communication tool you trust. $START_OF_LINK$Need help?$END_OF_LINK$", + "description": "This string appears as a sub-header of a dialog that provides instructions on how to share access to a server.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + }, + "share_invite_html": { + "message": "Use this server to safely access the open internet:$LINE_BREAK$$LINE_BREAK$1) Download and install the Outline app for your device:$LINE_BREAK$$LINE_BREAK$ - iOS: https://itunes.apple.com/app/outline-app/id1356177741$LINE_BREAK$ - MacOS: https://itunes.apple.com/app/outline-app/id1356178125$LINE_BREAK$ - Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe$LINE_BREAK$ - Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage$LINE_BREAK$ - Android: https://play.google.com/store/apps/details?id=org.outline.android.client$LINE_BREAK$ - Android alternative link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk$LINE_BREAK$$LINE_BREAK$2) You will receive an access key that starts with ss://. Once your receive it, copy this access key.$LINE_BREAK$$LINE_BREAK$3) Open the Outline client app. If your access key is auto-detected, tap \"Connect\" and proceed. If your access key is not auto-detected, then paste it in the field, then tap \"Connect\" and proceed.$LINE_BREAK$$LINE_BREAK$You're ready to use the open internet! To make sure you successfully connected to the server, try searching for \"what is my ip\" on Google Search. The IP address shown in Google should match the IP address in the Outline client.$LINE_BREAK$$LINE_BREAK$Learn more about Outline here: https://getoutline.org/", + "description": "This string appears as an email invitation instructing new Outline users how to set up and connect to Outline.", + "placeholders": { + "LINE_BREAK": { + "content": "
" + } + } + }, + "share_invite_copied": { + "message": "Copied invitation to clipboard", + "description": "This string appears as a label within a dialog that provides an invitation to share access to a server. Displayed when the user clicks a button to copy the invitation text to the clipboard." + }, + "share_invite_copy": { + "message": "Copy invitation", + "description": "This string appears as a button within a dialog that provides an invitation to share access to a server. Clicking it copies the invitation instructions text to the clipboard." + }, + "share_invite_copy_access_key": { + "message": "Copy access key", + "description": "This string appears as a button within a dialog that provides an access key to use a server. Clicking it copies the access key to the clipboard." + }, + "share_invite_access_key_copied": { + "message": "Copied access key to clipboard", + "description": "This string appears as a label within a dialog that provides an access key to use a server. Displayed when the user clicks a button to copy this access key to the clipboard." + }, + "share_invite_instructions": { + "message": "Follow our invitation instructions on GitHub:", + "description": "This string appears as a list item within a dialog that provides an invitation to share access to a server. Belongs to the instructions for the user with whom access is being shared." + }, + "share_invite_trouble": { + "message": "Having trouble accessing the invitation link?", + "description": "This string appears as a paragraph within a dialog that provides an invitation to share access to a server. Belongs to the instructions for the user with whom access is being shared." + }, + "share_title": { + "message": "Share access", + "description": "This string appears as the header of a dialog that provides an invitation to share access to a server." + }, + "survey_data_limits_title": { + "message": "Help us understand how to improve data limits", + "description": "This string appears as the title of a dialog that prompts the user to complete a survey about the data limits feature." + }, + "survey_decline": { + "message": "Decline", + "description": "This string appears in a dialog that prompts the user to complete a survey. It is shown in a button that dismisses the dialog." + }, + "survey_disclaimer": { + "message": "By clicking continue you will be sent to a short survey on Google Forms. We recommend taking the survey while connected to Outline.", + "description": "This string appears in a dialog that prompts the user to complete a survey as a disclaimer." + }, + "survey_go_to_survey": { + "message": "Go to survey", + "description": "This string appears in a dialog that prompts the user to complete a survey. It is shown in a button that takes the user to the online survey." + }, + "terms_of_service": { + "message": "I have read and understood the $START_OF_LINK$Outline Terms of Service$END_OF_LINK$", + "description": "This string appears within an overlay the first time the user runs the app. Prompts the user to review and accept Outline's terms of service.", + "placeholders": { + "END_OF_LINK": { + "content": "{closeLink}" + }, + "START_OF_LINK": { + "content": "{openLink}" + } + } + } +} diff --git a/server_manager/messages/mk.json b/server_manager/messages/mk.json new file mode 100644 index 0000000000..7ad953fad0 --- /dev/null +++ b/server_manager/messages/mk.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline е проект за софтвер со отворен код создаден од Jigsaw за да обезбеди побезбеден начин за пристап на интернет за организациите за вести и новинарите.

Outline е овозможен од Shadowsocks и сѐ уште е производ во рана фаза. Може да придонесете на кодот на GitHub, и да нѐ следите на Reddit и Medium за да дознаете кога ќе се прошириме на повеќе платформи и ќе додадеме нови функции.", + "about-version": "Верзија {version}", + "aws-lightsail-firewall-0": "Одете на екранот со примероци на {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Кликнете на примерокот на којшто сакате да ја хостирате Outline.", + "aws-lightsail-firewall-2": "Одете на картичката „Вмрежување“ ('Networking').", + "aws-lightsail-firewall-3": "Во делот „Заштитен ѕид“ ('Firewall'), кликнете на „Додајте друг“ ('Add another').", + "aws-lightsail-firewall-4": "Поставете вредноста за „Апликација“ ('Application') да биде „Сите TCP+UDP“ ('All TCP+UDP').", + "aws-lightsail-firewall-5": "Кликнете на „Зачувај“ ('Save').", + "cancel": "Откажи", + "close": "Затвори", + "confirmation-server-destroy": "Постојните корисници ќе го изгубат пристапот. Дејствово не може да се врати.", + "confirmation-server-destroy-title": "Дали да се избрише серверот?", + "confirmation-server-remove": "Дејствово ќе го отстрани вашиот сервер од Outline Manager, но нема да го блокира прокси пристапот до корисниците. Сѐ уште ќе треба рачно да го избришете серверот на Outline од вашата машина за хостирање.", + "confirmation-server-remove-title": "Дали да се отстрани серверот?", + "data-limit": "Oграничување на интернетот", + "data-limit-per-key": "Ограничување на интернетот по клуч", + "data-limits": "Oграничувања на интернетот", + "data-limits-description": "Поставете ограничување на интернет-сообраќајот за следење од 30 дена за клучевите за пристап на серверов.", + "data-limits-dialog-text": "Одете во картичката „Поставки“ за да поставите ограничување за интернет-сообраќај за клучевите за пристап на серверов.", + "data-limits-dialog-title": "Избегнување трошење вишок интернет", + "data-limits-disclaimer": "Тековно пријавувате метрика, па ќе се опфати и користењето на функцијата за функцијата „Ограничувања на интернетот“. За повеќе детали, погледнете во {openLink}Политиката за прибирање податоци{closeLink}.", + "data-limits-usage": "Искористено: {used} од {total}", + "destroy": "Избриши", + "digitalocean-disconnect-account": "Прекинување на врската со сметката на DigitalOcean", + "digitalocean-unreachable": "Грешкава можеби се должи на заштитен ѕид на вашата мрежа или привремен проблем со поврзување со digitalocean.com.", + "disabled": "Оневозможете", + "disconnect": "Прекини ја врската", + "done": "Готово", + "enabled": "Овозможено", + "error-connectivity": "Имаме проблем при поврзување на вашата сметка на DigitalOcean. Понекогаш ова е привремен проблем со DigitalOcean или вашата интернет-врска. Ако повторниот обид не успее, проблемот ќе се реши со најавување на сметката на DigitalOcean повторно.", + "error-connectivity-title": "Проблем со поврзување", + "error-do-account-info": "Не можеше да се вчитаат податоците на сметката на DigitalOcean", + "error-do-auth": "Проверката со DigitalOcean не успеа", + "error-do-limit": "Вашата сметка на DigitalOcean го достигна своето ограничување од {num} сервери. Може да побарате зголемување на https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Не можеше да се вчита списокот со достапни региони", + "error-do-warning": "Предупредување на DigitalOcean: „{message}“", + "error-feedback": "Не можеше да се испратат повратните информации. Обидете се повторно.", + "error-gcp-auth": "Проверката со Google Cloud Platform не успеа", + "error-hostname-invalid": "Мора да биде IP-адреса или точно име на хост.", + "error-key-add": "Не можеше да се додаде клуч", + "error-key-remove": "Не можеше да се отстрани клуч", + "error-key-rename": "Не можеше да се преименува клуч", + "error-keys-get": "Не можеше да се вчитаат клучевите", + "error-keys-port-bad-input": "Портата мора да биде цел број меѓу 1 и 65.535.", + "error-keys-port-in-use": "Портата веќе се користи на серверот.", + "error-licenses": "Не можеше да се вчитаат лиценците", + "error-metrics": "Грешка при овозможување на поставката за метрика", + "error-network": "Се јави грешка на мрежата.", + "error-not-saved": "Не е зачувано", + "error-remove-data-limit": "Не можеше да се оневозможи стандардното ограничување на интернетот", + "error-remove-per-key-limit": "Не можеше да се отстрани ограничувањето на интернетот за овој клуч за пристап", + "error-server-creation": "Се јави грешка при создавањето на вашиот сервер на Outline.", + "error-server-destroy": "Не можеше да се избрише сервер", + "error-server-removed": "{serverName} веќе не се прикажува на вашата сметка на DigitalOcean.", + "error-server-rename": "Не можеше да се преименува серверот", + "error-server-unreachable": "Вашиот сервер на Outline е правилно инсталиран, но не можеме да се поврземе на него. Најверојатно тоа се случува затоа што правилата за заштитниот ѕид на вашиот сервер блокираат дојдовни врски. Прегледајте ги и погрижете се да бидат дозволени дојдовни TCP-поврзувања на порти во опсег од 1024 до 65535.", + "error-server-unreachable-title": "Не може да се поврзе на вашиот сервер на Outline", + "error-servers-removed": "{serverNames} веќе не се прикажува на вашата сметка на DigitalOcean.", + "error-set-data-limit": "Не можеше да се постави стандардно ограничување на интернетот", + "error-set-per-key-limit": "Не можеше да се постави ограничување на интернетот за овој клуч за пристап", + "error-unexpected": "Се јави неочекувана грешка.", + "experimental": "Експериментално", + "experiments": "Експериментални функции", + "experiments-description": "Тестирајте ги новите функции и испратете ни повратни информации пред да се објават.", + "experiments-disclaimer": "Експерименталните функции се во фаза на развој и може да се променат или отстранат од апликацијата. Ако пријавувате метрика тековно, ќе се опфати и користењето на експерименталните функции. За повеќе детали, погледнете во {openLink}Политиката за прибирање податоци{closeLink}.", + "experiments-feedback": "Дали имате предлози? {openLink}Испратете повратни информации тука.{closeLink}", + "feedback-cloud-provider": "Изберете давател на услуги во облак", + "feedback-cloud-provider-error": "Изберете давател на услуги во облак.", + "feedback-connection": "Не може да се поврзе на мојот сервер", + "feedback-connection-others": "Другите не може да се поврзат на мојот сервер", + "feedback-disclaimer": "Имајте предвид дека нашиот тим може да одговори само на повратни информации на англиски.", + "feedback-email": "Адреса на е-пошта (незадолжително)", + "feedback-error": "Внесете повратни информации.", + "feedback-explanation-install": "Се јави грешка при обидот да се инсталира Outline на вашиот сервер. Ако не можете да најдете решение, испратете ни повратни информации и кажете ни ја вашата адреса на е-пошта (незадолжително) за да може да контактираме со вас.", + "feedback-general": "Општи повратни информации", + "feedback-install": "Имам проблем со инсталирањето Outline", + "feedback-label": "Вашите повратни информации", + "feedback-management": "Имам проблем со управувањето со мојот сервер", + "feedback-other": "Друго", + "feedback-privacy": "Вашите повратни информации, адресата на е-пошта (ако е наведена) и дополнителните податоци спомнати во {openLink}Политиката за приватност{closeLink} ќе се испратат до тимот на Outline.", + "feedback-submit": "Испрати", + "feedback-suggestion": "Предлози", + "feedback-title-generic": "Испраќање повратни информации", + "feedback-title-install": "Инсталацијата на серверот на Outline не успеа", + "gcp-billing-action": "Следно", + "gcp-billing-body": "Чекаме да {openLink}додадете сметка за наплата на Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Отворете ја страницата за наплата на конзолата на Cloud{closeLink} и додајте сметка за да продолжите.", + "gcp-billing-error": "Не можеше да се вчитаат податоци за наплата", + "gcp-billing-error-zero": "Пред да продолжите, мора да додадете сметка за наплата.", + "gcp-click-create": "Кликнете на „Создај“ ('Create').", + "gcp-create-new-project": "{openLink}Создавање нов проект на Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Создајте нов примерок на VM{closeLink}.", + "gcp-create-project": "Создајте проект на Google Cloud", + "gcp-create-server": "Создајте сопствен проект на Google Cloud", + "gcp-create-vm": "Создавање примерок на VM", + "gcp-disconnect-account": "Прекинување на врската со сметката на Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Додајте ново правило за заштитниот ѕид{closeLink} на вашиот проект на Compute Engine.", + "gcp-firewall-create-1": "Напишете „outline“ во полето „Име“ ('Name').", + "gcp-firewall-create-2": "Напишете „outline“ во полето „Целни ознаки“ ('Target tags').", + "gcp-firewall-create-3": "Напишете „0.0.0.0/0“ во полето „Опсези на изворна IP“ ('Source IP ranges').", + "gcp-firewall-create-4": "Изберете „Дозволи ги сите“ ('Allow all') во „Протоколи и псрти“ ('Protocols and ports').", + "gcp-name-your-project": "Именувајте го вашиот проект во полето „Име на проектот“ ('Project name').", + "gcp-project-setup-error": "Се јави грешка при поставувањето на вашиот проект на Google Cloud", + "gcp-select-machine-type": "Изберете „f1-micro“ во „Тип машина“ ('Machine type')", + "gcp-select-networking": "Кликнете на „Управување, безбедност, дискови, вмрежување, еден сопственик“ ('Management, security, disks, networking, sole tenancy'), а потоа на „Вмрежување“ ('Networking')", + "gcp-select-region": "Изберете регион близу локацијата на корисниците на серверот наведена во „Регион“ ('Region').", + "gcp-type-network-tag": "Напишете „outline“ во полето „Ознаки на мрежа“ ('Network tags').", + "gcp-type-outline-server": "Напишете „outline-server“ во полето „Име“ ('Name').", + "geo-amsterdam": "Амстердам", + "geo-bangalore": "Бангалор", + "geo-changhua-county": "Округ Чангуа", + "geo-delhi": "Делхи", + "geo-eemshaven": "Емсхавен", + "geo-frankfurt": "Франкфурт", + "geo-hamina": "Хамина", + "geo-hk": "Хонгконг", + "geo-iowa": "Ајова", + "geo-jakarta": "Џакарта", + "geo-jurong-west": "Јуронг Вест", + "geo-las-vegas": "Лас Вегас", + "geo-london": "Лондон", + "geo-los-angeles": "Лос Анџелес", + "geo-melbourne": "Мелбурн", + "geo-montreal": "Монтреал", + "geo-mumbai": "Мумбај", + "geo-new-york-city": "Њујорк", + "geo-northern-virginia": "Северна Вирџинија", + "geo-oregon": "Орегон", + "geo-osaka": "Осака", + "geo-salt-lake-city": "Солт Лејк Сити", + "geo-san-francisco": "Сан Франциско", + "geo-sao-paulo": "Сао Паоло", + "geo-seoul": "Сеул", + "geo-sg": "Сингапур", + "geo-south-carolina": "Јужна Каролина", + "geo-st-ghislain": "Сент Жислен", + "geo-sydney": "Сиднеј", + "geo-tokyo": "Токио", + "geo-toronto": "Торонто", + "geo-warsaw": "Варшава", + "geo-zurich": "Цирих", + "key": "Клуч {keyId}", + "manual-server-assign-firewall": "Назначување правило за заштитниот ѕид", + "manual-server-assign-group": "Назначување безбедносна група", + "manual-server-create-firewall": "Создавање правило за заштитен ѕид", + "manual-server-create-group": "Создавање безбедносна група", + "manual-server-description": "Чекориве ќе ви помогнат да инсталирате Outline на сервер со Linux на {cloudProvider}.", + "manual-server-firewall": "Конфигурирање на вашиот заштитен ѕид", + "manual-server-install-paste": "Залепете ги излезните податоци од инсталацијата тука.", + "manual-server-install-run": "Најавете се на вашиот сервер и извршете ја наредбава.", + "manual-server-instructions": "Упатства", + "manual-server-show-me": "Покажи ми каде", + "manual-server-title": "Следете ги упатствата подолу", + "metrics-description": "Споделувајте анонимна метрика за да помогнете во подобрувањето на сигурноста и изведбата на Outline, за вас и за лицата со коишто го споделувате вашиот сервер. {openLink}Дознајте повеќе.{closeLink}", + "metrics-share": "Споделете метрика", + "metrics-skip": "Прескокни", + "metrics-title": "Споделување метрика", + "nav-about": "За", + "nav-data-collection": "Прибирање податоци", + "nav-feedback": "Повратни информации", + "nav-help": "Помош", + "nav-licenses": "Лиценци", + "nav-privacy": "Приватност", + "nav-terms": "Услови", + "no-data-limit": "Нема ограничување", + "notification-app-update": "Преземена е ажурирана верзија на Outline Manager. Ќе се инсталира кога ќе ја рестартирате апликацијата.", + "notification-feedback-thanks": "Фала што ни помагате да се подобриме! Ги обожаваме вашите повратни информации.", + "notification-key-added": "Клучот е додаден", + "notification-key-removed": "Клучот е отстранет", + "notification-server-destroyed": "Серверот е избришан", + "notification-server-exists": "Серверот е веќе додаден", + "notification-server-removed": "Серверот е отстранет", + "oauth-account-active": "Вашата сметка на DigitalOcean е активирана.", + "oauth-account-active-tag": "Сметката е активирана! Се вчитуваат локациите на серверот…", + "oauth-activate-account": "Активирајте ја вашата сметка на DigitalOcean.", + "oauth-billing": "Внесете ги вашите податоци за наплата на digitalocean.com и вратете се на апликацијата кога ќе завршите.", + "oauth-billing-tag": "Внесете податоци за наплата…", + "oauth-connect-description": "Со сметката, Outline го олеснува создавањето сервер и поврзувањето.", + "oauth-connect-tag": "Се чека да се поврзе вашата сметка…", + "oauth-connect-title": "Најавете се или создајте сметка со DigitalOcean.", + "oauth-sign-out": "Одјавување", + "oauth-verify": "Проверете го вашето приемно сандаче за е-порака од DigitalOcean, и кликнете на линкот во неа за да ја потврдите вашата сметка.", + "oauth-verify-tag": "Потврдете ја вашата е-пошта…", + "okay": "Во ред", + "per-key-data-limit-dialog-set-custom": "Поставете приспособено ограничување на интернетот", + "per-key-data-limit-dialog-title": "Ограничување за интернетот: {keyName}", + "region-best-value": "Најдобра вредност", + "region-description": "Одовде ќе произлегува вашето доживување на интернет.", + "region-setup": "Поставување на Outline", + "region-title": "Избирање на локацијата на вашиот сервер.", + "remove": "Отстрани", + "retry": "Обидете се повторно", + "save": "Зачувај", + "saved": "Зачувано", + "saving": "Се зачувува…", + "server-access": "Пристап до серверот", + "server-access-key-new": "Додајте нов клуч", + "server-access-key-rename": "Преименувај", + "server-access-keys": "Клучеви за пристап", + "server-connections": "Врски", + "server-data-transfer": "Користење / изминатите 30 дена", + "server-data-used": "Искористен интернет-сообраќај од дозволениот / изминатите 30 дена", + "server-destroy": "Избришете го серверот", + "server-help-access-key-description": "Споделете клучеви за пристап до пријателите за да може да се поврзат на вашиот сервер на Outline. Може да го користат истиот клуч на сите свои уреди.", + "server-help-access-key-next": "Следно", + "server-help-access-key-title": "Создавање клучеви, споделување пристап", + "server-help-connection-description": "Кликнете тука за да го инсталирате клиентот Outline со вашиот личен клуч за пристап до вашиот сервер на Outline.", + "server-help-connection-ok": "Во ред, сфатив!", + "server-help-connection-title": "Сѐ уште не сте поврзани!", + "server-keys": "Клучеви", + "server-my-access-key": "Мојот клуч за пристап", + "server-name": "Сервер на Outline: {serverLocation}", + "server-remove": "Отстранете сервер", + "server-settings": "Поставки", + "server-unreachable": "Серверот е недостапен", + "server-unreachable-description": "Се соочуваме со проблеми при поврзување на серверов.", + "server-unreachable-managed-description": "Обидете се повторно или отстранете го серверов од апликацијата.", + "server-unreachable-manual-description": "Обидете се повторно или избришете ги серверов и виртуелниот хост.", + "server-usage": "Користење (изминатите 30 дена)", + "servers-add": "Додајте сервер", + "servers-digitalocean": "Сервери на DigitalOcean", + "servers-gcp": "Сервери на Google Cloud Platform", + "servers-manual": "Сервери", + "settings-access-key-port": "Порта за нови клучеви за пристап", + "settings-metrics-header": "Споделете анонимна метрика", + "settings-server-api-url": "URL до API за управување", + "settings-server-cost": "Цена на месечно ниво", + "settings-server-creation": "Создадено", + "settings-server-hostname": "Име на хост", + "settings-server-id": "ID на серверот", + "settings-server-info": "Информации за серверот", + "settings-server-location": "Локација на серверот", + "settings-server-name": "Име", + "settings-server-rename": "Поставете ново име за вашиот сервер. Имајте предвид дека ова нема да се прикаже на уредите на корисниците на кои сте им испратиле покана за поврзување на серверот.", + "settings-server-version": "Верзија на серверот", + "settings-transfer-limit": "Дозволен интернет-сообраќај", + "setup-action": "Поставување", + "setup-advanced": "Напредно", + "setup-anywhere": "Поставување на Outline насекаде", + "setup-cancel": "Откажете во секое време", + "setup-create": "Создавање сервер", + "setup-description": "Дали немате сервер? Создајте сметка со DigitalOcean.", + "setup-do-cost": "Само 6 американски $ месечно", + "setup-do-create": "Создајте нов сервер со вашата сметка на DigitalOcean за дополнителни 6 американски $/30 дена за интернет-сообраќај од 1 TB.", + "setup-do-data": "Дозволен интернет-сообраќај: 1 TB", + "setup-do-description": "Ова може да потрае неколку минути. Може да го избришете серверов во секое време.", + "setup-do-easiest": "Најлесен процес на поставување", + "setup-do-title": "Outline се поставува.", + "setup-firewall-instructions": "Упатства за заштитниот ѕид", + "setup-gcp-create": "Создајте нов сервер со вашата сметка на Google. Цените се разликуваат согласно локацијата и користењето.", + "setup-gcp-easy": "Лесен процес на поставување", + "setup-gcp-free-tier": "Со {openLinkFreeTier}Бесплатно ниво{closeLink}, вашиот прв сервер започнува со цена од {openLinkIpPrice}3 американски $/месечно{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Бесплатен пробен период од 90 дена{closeLink} за нови корисници", + "setup-gcp-promo": "Испробајте го новиот автоматски процес на создавање сервер на Outline за Google Cloud", + "setup-recommended": "Препорачано", + "setup-simple-commands": "Едноставни наредби за инсталирање", + "setup-step-by-step": "Детален водич за поставување", + "setup-tested": "Тестирано на VULTR, Linode и Liquid Web", + "setup-title": "Изберете услуга во облак за поставување на Outline.", + "share-description": "Копирајте ја поканава и испратете ја од алатка за комуникација во којашто имате доверба. {openLink}Дали ви треба помош?{closeLink}", + "share-invite-access-key-copied": "Клучот за пристап е копиран во привремената меморија", + "share-invite-copied": "Поканата е копирана во привремената меморија", + "share-invite-copy": "Копирај ја поканата", + "share-invite-copy-access-key": "Копирај го клучот за пристап", + "share-invite-html": "Користете го серверов за безбеден пристап до отворениот интернет:

1) Преземете и инсталирајте ја апликацијата Outline за вашиот уред:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- алтернативен линк за Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Ќе добиете клуч за пристап што започнува со ss://. Штом ќе го добиете, копирајте го клучов за пристап.

3) Отворете ја апликацијата клиент Outline. Ако вашиот клуч за пристап се открие автоматски, допрете „Поврзи се“ и продолжете. Ако вашиот клуч за пристап не се открие автоматски, залепете го во полето, па допрете „Поврзи се“ и продолжете.

Подготвени сте да го користите отворениот интернет! За да се уверите дека сте успешно поврзани на интернет, обидете се со пребарување на „what is my ip“ („Која е мојата IP“) на „Пребарување на Google“. IP-адресата што ќе се прикаже на Google треба да се совпаѓа со IP-адресата во клиентот Outline.

Дознајте повеќе за Outline тука: https://getoutline.org/", + "share-invite-instructions": "Следете ги нашите упатства во поканата на GitHub:", + "share-invite-trouble": "Дали имате проблем да пристапите до линкот за покана?", + "share-title": "Споделете пристап", + "survey-data-limits-title": "Помогнете ни да разбереме како да ја подобриме „Ограничувања на интернетот“", + "survey-decline": "Одбиј", + "survey-disclaimer": "Ако кликнете на „Продолжете“, ќе се отвори кратка анкета на „Формулари на Google“. Препорачуваме да ја пополните додека сте поврзани на Outline.", + "survey-go-to-survey": "Отворете ја анкетата", + "terms-of-service": "Ги прочитав и разбрав {openLink}Условите за користење на Outline{closeLink}" +} diff --git a/server_manager/messages/mn.json b/server_manager/messages/mn.json new file mode 100644 index 0000000000..06184c56f1 --- /dev/null +++ b/server_manager/messages/mn.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline нь Jigsaw-н бүтээсэн нээлттэй эх кодтой төсөл бөгөөд мэдээллийн байгууллага болон сэтгүүлчдийг интернэтэд хандах илүү найдвартай арга замаар хангадаг.

Outline-г Shadowsocks-с дэмжсэн бөгөөд бүтээгдэхүүний хөгжүүлэлтийн эхний шатанд байсан хэвээр байна. Та GitHub дээрх кодод хувь нэмрээ оруулах болон бид бусад платформ руу өргөжих, мөн шинэ онцлогууд гаргах үед мэдээлэл авахын тулд биднийг Reddit, Medium дээр дагах боломжтой.", + "about-version": "{version}-р хувилбар", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail-н{closeLink} инстансуудын дэлгэц рүү шилжинэ үү.", + "aws-lightsail-firewall-1": "Та Outline-г хост хийхийг хүсэж буй инстансаа товшино уу.", + "aws-lightsail-firewall-2": "'Сүлжээ' таб руу шилжинэ үү.", + "aws-lightsail-firewall-3": "'Галт хана' хэсэгт 'Өөрийг нэмэх' дээр товшино уу.", + "aws-lightsail-firewall-4": "'Аппликэйшн' утгыг 'Бүх TCP+UDP' болгож тохируулна уу.", + "aws-lightsail-firewall-5": "'Хадгалах' дээр товшино уу.", + "cancel": "Цуцлах", + "close": "Хаах", + "confirmation-server-destroy": "Одоо байгаа хэрэглэгчид хандах эрхээ алдана. Энэ үйлдлийг буцаах боломжгүй.", + "confirmation-server-destroy-title": "Серверийг устгах уу?", + "confirmation-server-remove": "Энэ үйлдэл таны серверийг Outline Manager-с хасах хэдий ч хэрэглэгчдэд прокси хандалтыг блоклохгүй. Та хост машинаасаа Outline серверийг гар аргаар устгах шаардлагатай хэвээр байх болно.", + "confirmation-server-remove-title": "Серверийг хасах уу?", + "data-limit": "Дата хязгаар", + "data-limit-per-key": "Түлхүүр тутмын дата хязгаар", + "data-limits": "Дата хязгаар", + "data-limits-description": "Энэ сервер дээрх хандалтын түлхүүрүүдэд 30 хоног дагах өгөгдөл дамжуулалтын хязгаарыг тохируулна уу.", + "data-limits-dialog-text": "Энэ сервер дээрх хандалтын түлхүүрүүдэд өгөгдөл дамжуулалтын хязгаар тохируулахын тулд Тохиргоо таб руу очно уу.", + "data-limits-dialog-title": "Дата хэтрүүлэхээс зайлсхийх", + "data-limits-disclaimer": "Та одоогоор хэмжигдэхүүнүүд мэдээлж байгаа тул дата хязгаарын онцлогийн ашиглалтыг багтаана. Илүү дэлгэрэнгүй мэдээлэл авах бол {openLink}өгөгдөл цуглуулах бодлогыг{closeLink} харна уу.", + "data-limits-usage": "{total}-с {used}-г ашигласан", + "destroy": "Устгах", + "digitalocean-disconnect-account": "DigitalOcean бүртгэлээс салгах", + "digitalocean-unreachable": "Энэ алдаа нь таны сүлжээн дээрх галт хана эсвэл digitalocean.com-той холбоотой холболтын асуудлаас үүдэлтэй байж магадгүй.", + "disabled": "Идэвхгүй болгосон", + "disconnect": "Салгах", + "done": "Болсон", + "enabled": "Идэвхжүүлсэн", + "error-connectivity": "Бидэнд таны DigitalOcean бүртгэлтэй холбогдоход асуудал гарлаа. Энэ нь заримдаа DigitalOcean эсвэл таны интернэт холболттой холбоотой түр зуурын асуудал байж болно. Хэрэв дахин оролдох ажиллахгүй байвал DigitalOcean-д дахин нэвтрэх нь асуудлыг засах ёстой.", + "error-connectivity-title": "Холболтын асуудал", + "error-do-account-info": "DigitalOcean бүртгэлийн мэдээллийг авч чадсангүй", + "error-do-auth": "DigitalOcean-н баталгаажуулалт амжилтгүй боллоо", + "error-do-limit": "Таны DigitalOcean бүртгэл {num} Droplet-н хязгаартаа хүрлээ. Та https://cloud.digitalocean.com/account/team/droplet_limit_increase дээр нэмэх хүсэлт гаргах боломжтой", + "error-do-regions": "Боломжтой бүс нутгуудын жагсаалтыг авч чадсангүй", + "error-do-warning": "DigitalOcean-н сануулга: \"{message}\"", + "error-feedback": "Санал хүсэлт илгээж чадсангүй. Дахин оролдоно уу.", + "error-gcp-auth": "Google Cloud Platform-н баталгаажуулалт амжилтгүй боллоо", + "error-hostname-invalid": "IP хаяг эсвэл хүчинтэй хостны нэр байх ёстой.", + "error-key-add": "Түлхүүр нэмж чадсангүй", + "error-key-remove": "Түлхүүрийг хасаж чадсангүй", + "error-key-rename": "Түлхүүрийн нэрийг өөрчилж чадсангүй", + "error-keys-get": "Түлхүүрүүдийг ачаалж чадсангүй", + "error-keys-port-bad-input": "Порт нь 1 болон 65535-ын хоорондох бүхэл тоо байх ёстой.", + "error-keys-port-in-use": "Портыг сервер дээр аль хэдийн ашиглаж байна.", + "error-licenses": "Лицензүүдийг ачаалж чадсангүй.", + "error-metrics": "Хэмжигдэхүүнүүдийг идэвхжүүлэхэд алдаа гарсан", + "error-network": "Сүлжээний алдаа гарлаа.", + "error-not-saved": "Хадгалаагүй", + "error-remove-data-limit": "Өгөгдмөл дата хязгаарыг идэвхгүй болгож чадсангүй", + "error-remove-per-key-limit": "Энэ хандалтын түлхүүрээс дата хязгаарыг хасаж чадсангүй", + "error-server-creation": "Таны Outline серверийг үүсгэхэд алдаа гарлаа.", + "error-server-destroy": "Серверийг устгаж чадсангүй", + "error-server-removed": "{serverName} цаашид таны DigitalOcean бүртгэлд байхаа больсон.", + "error-server-rename": "Серверийн нэрийг өөрчилж чадсангүй", + "error-server-unreachable": "Таны Outline серверийг зөв суулгасан хэдий ч бид үүнтэй холбогдох боломжгүй байна. Энэ нь таны серверийн галт хананы дүрэм ирж буй холболтуудыг блоклож байгаагаас үүдэлтэй байх магадлалтай. Тэдгээрийг шалгаад 1024-өөс 65535 хүртэлх порт дээрх ирж буй TCP холболтуудыг зөвшөөрсөн эсэхээ баталгаажуулна уу.", + "error-server-unreachable-title": "Таны Outline сервертэй холбогдох боломжгүй", + "error-servers-removed": "{serverNames} цаашид таны DigitalOcean бүртгэлд байхаа больсон.", + "error-set-data-limit": "Өгөгдмөл дата хязгаар тохируулж чадсангүй", + "error-set-per-key-limit": "Энэ хандалтын түлхүүрт дата хязгаар тохируулж чадсангүй", + "error-unexpected": "Гэнэтийн алдаа гарлаа.", + "experimental": "Туршилтын", + "experiments": "Туршилтууд", + "experiments-description": "Шинэ онцлогуудыг туршиж тэдгээрийг гаргахаас өмнө бидэнд санал хүсэлт өгнө үү.", + "experiments-disclaimer": "Туршилтууд нь хөгжүүлэлтийн явцад байгаа бөгөөд өөрчлөгдөж эсвэл аппаас хасагдаж магадгүй. Хэрэв та одоогоор хэмжигдэхүүнүүд мэдээлж байгаа бол туршилтын онцлогуудын ашиглалтыг багтаана. Илүү дэлгэрэнгүй мэдээлэл авах бол {openLink}өгөгдөл цуглуулах бодлогыг{closeLink} харна уу.", + "experiments-feedback": "Зөвлөмжүүд байгаа юү? {openLink}Энд санал хүсэлт илгээнэ үү.{closeLink}", + "feedback-cloud-provider": "Үүлэн үйлчилгээ үзүүлэгч сонгоно уу", + "feedback-cloud-provider-error": "Үүлэн үйлчилгээ үзүүлэгч сонгоно уу.", + "feedback-connection": "Сервертэйгээ холбогдож чадахгүй байна", + "feedback-connection-others": "Бусад хүн миний серверт хандах боломжгүй байна", + "feedback-disclaimer": "Манай баг санал хүсэлтэд зөвхөн англи хэлээр хариулах боломжтой болохыг анхаарна уу.", + "feedback-email": "Имэйл хаяг (заавал биш)", + "feedback-error": "Санал хүсэлтээ оруулна уу.", + "feedback-explanation-install": "Таны серверт Outline-г суулгахаар оролдоход алдаа гарлаа. Хэрэв та шийдэл олж чадаагүй бол бидэнд санал хүсэлт илгээхийн зэрэгцээ имэйл хаягаа хэлэх (заавал биш) талаар бодож үзээрэй. Ингэснээр бид тантай эргэн холбогдох боломжтой.", + "feedback-general": "Ерөнхий санал хүсэлт", + "feedback-install": "Outline-г суулгахад асуудал гарч байна", + "feedback-label": "Таны санал хүсэлт", + "feedback-management": "Серверээ удирдахад асуудал гарч байна", + "feedback-other": "Бусад", + "feedback-privacy": "Таны санал хүсэлт, имэйл хаяг (хэрэв өгсөн бол) болон {openLink}нууцлалын бодлогод{closeLink} дурдсан нэмэлт мэдээллийг Outline-н багт илгээнэ.", + "feedback-submit": "Илгээх", + "feedback-suggestion": "Зөвлөмжүүд", + "feedback-title-generic": "Санал хүсэлт илгээх", + "feedback-title-install": "Outline серверийг суулгаж чадсангүй", + "gcp-billing-action": "Дараах", + "gcp-billing-body": "Таныг {openLink}Google Cloud дээр төлбөрийн мэдээлэл хүлээн авах имэйл нэмэхийг{closeLink} хүлээж байна", + "gcp-billing-description": "Үргэлжлүүлэхийн тулд {openLink}Үүлэн консолын төлбөр тооцооны хуудсыг нээж{closeLink} бүртгэл нэмнэ үү.", + "gcp-billing-error": "Төлбөрийн мэдээллийг сэргээх боломжгүй", + "gcp-billing-error-zero": "Та үргэлжлүүлэхээсээ өмнө төлбөрийн мэдээлэл хүлээн авах имэйл нэмэх ёстой.", + "gcp-click-create": "'Үүсгэх' дээр товшрино уу.", + "gcp-create-new-project": "{openLink}Шинэ Google Cloud төсөл үүсгэнэ үү{closeLink}.", + "gcp-create-new-vm": "{openLink}Шинэ VM инстанс үүсгэнэ үү{closeLink}.", + "gcp-create-project": "Google Cloud төсөл үүсгэх", + "gcp-create-server": "Өөрийн Google Cloud төслийг үүсгэнэ үү", + "gcp-create-vm": "VM инстанс үүсгэх", + "gcp-disconnect-account": "Google Cloud Platform бүртгэлээс салах", + "gcp-firewall-create-0": "Compute Engine-н төсөлдөө {openLink}галт хананы шинэ дүрэм нэмнэ үү{closeLink}.", + "gcp-firewall-create-1": "'Нэр' талбарт 'outline' гэж бичнэ үү.", + "gcp-firewall-create-2": "'Зорилтот шошго' талбарт 'outline' гэж бичнэ үү.", + "gcp-firewall-create-3": "'Эх сурвалжийн IP мужууд' талбарт '0.0.0.0/0' гэж бичнэ үү.", + "gcp-firewall-create-4": "'Протокол болон порт'-ын доор байх 'Бүгдийг зөвшөөрөх'-ийг сонгоно уу.", + "gcp-name-your-project": "'Төслийн нэр' талбарт төсөлдөө нэр өгнө үү.", + "gcp-project-setup-error": "Таны Google Cloud төслийг тохируулахад алдаа гарлаа", + "gcp-select-machine-type": "'Машины төрөл' доороос 'f1-микро'-г сонгоно уу", + "gcp-select-networking": "'Менежмент, аюулгүй байдал, диск, сүлжээ, ганцаарчилсан түрээс' дараа нь 'Сүлжээ'-г товшино уу", + "gcp-select-region": "'Бүс нутаг' хэсгийн доороос серверийн хэрэглэгчдийн байх газартай ойр бүс нутгийг сонгоно уу.", + "gcp-type-network-tag": "'Сүлжээний шошго' талбарт 'outline' гэж бичнэ үү.", + "gcp-type-outline-server": "'Нэр' талбарт 'outline-server' гэж бичнэ үү.", + "geo-amsterdam": "Амстердам", + "geo-bangalore": "Бангалор", + "geo-changhua-county": "Чанхуа каунти", + "geo-delhi": "Дели", + "geo-eemshaven": "Эмсхавен", + "geo-frankfurt": "Франкфурт", + "geo-hamina": "Хамина", + "geo-hk": "Хонконг", + "geo-iowa": "Айова", + "geo-jakarta": "Жакарта", + "geo-jurong-west": "Журонг Вест", + "geo-las-vegas": "Лас Вегас", + "geo-london": "Лондон", + "geo-los-angeles": "Лос-Анжелес", + "geo-melbourne": "Мельбурн", + "geo-montreal": "Монреал", + "geo-mumbai": "Мумбай", + "geo-new-york-city": "Нью-Йорк", + "geo-northern-virginia": "Хойд Виржиниа", + "geo-oregon": "Орегон", + "geo-osaka": "Осака", + "geo-salt-lake-city": "Солт Лэйк Сити", + "geo-san-francisco": "Сан Франциско", + "geo-sao-paulo": "Сан Паулу", + "geo-seoul": "Сөүл", + "geo-sg": "Сингапур", + "geo-south-carolina": "Өмнөд Каролина", + "geo-st-ghislain": "Сент Гислайн", + "geo-sydney": "Сидней", + "geo-tokyo": "Токио", + "geo-toronto": "Торонто", + "geo-warsaw": "Варшав", + "geo-zurich": "Цюрих", + "key": "{keyId} түлхүүр", + "manual-server-assign-firewall": "Галт хананы дүрэм оноох", + "manual-server-assign-group": "Аюулгүй байдлын бүлэг оноох", + "manual-server-create-firewall": "Галт хананы дүрэм үүсгэх", + "manual-server-create-group": "Аюулгүй байдлын бүлэг үүсгэх", + "manual-server-description": "Эдгээр алхам танд Outline-г {cloudProvider} Linux сервер дээр суулгахад тусална.", + "manual-server-firewall": "Галт ханаа тохируулна уу", + "manual-server-install-paste": "Суулгалтын гаралтаа энд буулгана уу.", + "manual-server-install-run": "Сервертээ нэвтрээд, энэ тушаалыг ажиллуулна уу.", + "manual-server-instructions": "Зааварчилгаа", + "manual-server-show-me": "Хаана гэдгийг надад харуул", + "manual-server-title": "Доорх зааварчилгааг дагана уу", + "metrics-description": "Outline-н найдвартай байдал болон гүйцэтгэлийг өөртөө болон серверээ хуваалцдаг хүмүүстээ зориулж сайжруулахад туслахын тулд нэргүй хэмжигдэхүүнүүд хуваалцаарай. {openLink}Нэмэлт мэдээлэл авна уу.{closeLink}", + "metrics-share": "Хэмжигдэхүүн хуваалцах", + "metrics-skip": "Алгасах", + "metrics-title": "Хэмжигдэхүүн хуваалцах", + "nav-about": "Тухай", + "nav-data-collection": "Өгөгдлийн цуглуулга", + "nav-feedback": "Санал хүсэлт", + "nav-help": "Тусламж", + "nav-licenses": "Лицензүүд", + "nav-privacy": "Нууцлал", + "nav-terms": "Нөхцөл", + "no-data-limit": "Байхгүй", + "notification-app-update": "Outline Manager-н шинэчилсэн хувилбарыг татсан. Таныг аппликэйшнийг дахин эхлүүлэх үед үүнийг суулгана.", + "notification-feedback-thanks": "Бидэнд сайжруулахад тусалсанд баярлалаа! Бид танаас санал хүсэлт авахдаа таатай байна.", + "notification-key-added": "Түлхүүр нэмсэн", + "notification-key-removed": "Түлхүүрийг хассан", + "notification-server-destroyed": "Серверийг устгасан", + "notification-server-exists": "Серверийг аль хэдийн нэмсэн", + "notification-server-removed": "Серверийг хассан", + "oauth-account-active": "Таны DigitalOcean бүртгэлийг идэвхжүүлсэн.", + "oauth-account-active-tag": "Бүртгэл идэвхэжсэн! Серверийн байршлуудыг ачаалж байна...", + "oauth-activate-account": "DigitalOcean бүртгэлээ идэвхжүүлнэ үү.", + "oauth-billing": "Digitalocean.com дээр төлбөрийн мэдээллээ оруулж, дууссаныхаа дараа апп руу буцна уу.", + "oauth-billing-tag": "Төлбөрийн мэдээлэл оруулах...", + "oauth-connect-description": "Outline нь бүртгэлээрээ сервер үүсгэж, холбогдохыг хялбар болгодог.", + "oauth-connect-tag": "Таны бүртгэлд холбогдохоор хүлээж байна...", + "oauth-connect-title": "DigitalOcean-р нэвтрэх эсвэл бүртгэл үүсгэнэ үү.", + "oauth-sign-out": "Гарах", + "oauth-verify": "DigitalOcean-н имэйлийг ирсэн имэйлээсээ шалгаж, бүртгэлээ баталгаажуулахын тулд үүнд байх холбоосыг товшино уу.", + "oauth-verify-tag": "Имэйлээ баталгаажуулах...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Захиалгат дата хязгаар тохируулах", + "per-key-data-limit-dialog-title": "Дата хязгаар - {keyName}", + "region-best-value": "Шилдэг утга", + "region-description": "Таны интернэтийн хэрэглээ эндээс ирнэ.", + "region-setup": "Outline-г тохируулах", + "region-title": "Серверийнхээ байршлыг сонгоно уу.", + "remove": "Хасах", + "retry": "Дахин оролдох", + "save": "Хадгалах", + "saved": "Хадгалсан", + "saving": "Хадгалж байна...", + "server-access": "Серверийн хандалт", + "server-access-key-new": "Шинэ түлхүүр нэмэх", + "server-access-key-rename": "Нэр өөрчлөх", + "server-access-keys": "Хандалтын түлхүүрүүд", + "server-connections": "Холболтууд", + "server-data-transfer": "Өгөгдөл дамжуулсан / сүүлийн 30 хоног", + "server-data-used": "Ашигласан датаны хэмжээ / сүүлийн 30 хоног", + "server-destroy": "Сервер устгах", + "server-help-access-key-description": "Хандалтын түлхүүрүүдийг найзуудтайгаа хуваалцсанаар тэд таны Outline серверт хандах боломжтой. Тэд бүх төхөөрөмждөө хандалтын ижил түлхүүрийг ашиглаж болно.", + "server-help-access-key-next": "Дараах", + "server-help-access-key-title": "Түлхүүр үүсгэж, хандалт хуваалцах", + "server-help-connection-description": "Outline сервертээ хувийн хандалтын түлхүүрээ ашиглан Outline клиент аппыг суулгахын тулд энд товшино уу.", + "server-help-connection-ok": "За, ойлголоо!", + "server-help-connection-title": "Та хараахан холбогдоогүй байна!", + "server-keys": "Түлхүүрүүд", + "server-my-access-key": "Миний хандалтын түлхүүр", + "server-name": "Outline сервер {serverLocation}", + "server-remove": "Серверийг хасах", + "server-settings": "Тохиргоо", + "server-unreachable": "Серверт холбогдох боломжгүй", + "server-unreachable-description": "Бидэнд энэ сервертэй холбогдоход асуудал гарлаа.", + "server-unreachable-managed-description": "Дахин оролдох эсвэл энэ серверийг аппликэйшнээс хасна уу.", + "server-unreachable-manual-description": "Дахин оролдох эсвэл энэ сервер болон виртуал хостыг устгана уу.", + "server-usage": "Ашиглалт (сүүлийн 30 хоног)", + "servers-add": "Сервер нэмэх", + "servers-digitalocean": "DigitalOcean серверүүд", + "servers-gcp": "Google Cloud Platform-н серверүүд", + "servers-manual": "Серверүүд", + "settings-access-key-port": "Шинэ хандалтын түлхүүрүүдийн порт", + "settings-metrics-header": "Хэмжигдэхүүнүүдийг нэргүй хуваалцах", + "settings-server-api-url": "Менежментийн API-н URL", + "settings-server-cost": "Сар тутмын зардал", + "settings-server-creation": "Үүсгэсэн", + "settings-server-hostname": "Хостны нэр", + "settings-server-id": "Серверийн ID", + "settings-server-info": "Серверийн мэдээлэл", + "settings-server-location": "Серверийн байршил", + "settings-server-name": "Нэр", + "settings-server-rename": "Сервертээ шинэ нэр тохируулна уу. Таны үүнтэй холбогдохыг урьсан хэрэглэгчдийн төхөөрөмжид үүнийг тусгахгүй болохыг анхаарна уу.", + "settings-server-version": "Серверийн хувилбар", + "settings-transfer-limit": "Өгөгдөл дамжуулалтын зөвшөөрөл", + "setup-action": "Тохируулах", + "setup-advanced": "Нарийвчилсан", + "setup-anywhere": "Outline-г хүссэн газраа тохируулаарай", + "setup-cancel": "Хүссэн үедээ цуцлах", + "setup-create": "Сервер үүсгэх", + "setup-description": "Сервер байхгүй юү? DigitalOcean бүртгэл үүсгэнэ үү.", + "setup-do-cost": "Сард ердөө 6 ам.доллар", + "setup-do-create": "DigitalOcean бүртгэлээрээ шинэ сервер үүсгэж, 30 хоногийн 1 ТБ-ын өгөгдөл дамжуулалтад нэмэлт 6 ам.доллар төлөөрэй.", + "setup-do-data": "1 ТБ-ын өгөгдөл дамжуулалтын зөвшөөрөл", + "setup-do-description": "Үүнд хэдэн минут шаардлагатай. Та энэ серверийг хүссэн үедээ устгах боломжтой.", + "setup-do-easiest": "Хамгийн хялбар тохируулгын явц", + "setup-do-title": "Outline-г тохируулж байна.", + "setup-firewall-instructions": "Галт хананы зааварчилгаа", + "setup-gcp-create": "Google бүртгэлээрээ шинэ сервер үүсгэнэ үү. Зардал нь байршил болон ашиглалтаараа ялгаатай байна.", + "setup-gcp-easy": "Тохируулгын хялбар явц", + "setup-gcp-free-tier": "{openLinkFreeTier}Үнэгүй шатлалын{closeLink} тусламжтай таны анхны сервер {openLinkIpPrice}сарын 3 ам.доллароос{closeLink} эхэлнэ", + "setup-gcp-free-trial": "Шинэ хэрэглэгчдэд зориулсан {openLinkFreeTrial}90 хоногийн үнэгүй туршилтын хугацаа{closeLink}", + "setup-gcp-promo": "Google Cloud-н Outline серверийг автоматаар үүсгэх явцыг туршаарай", + "setup-recommended": "Санал болгосон", + "setup-simple-commands": "Суулгах хялбар тушаалууд", + "setup-step-by-step": "Тохируулгын алхамт хөтөч", + "setup-tested": "VULTR, Linode болон Liquid Web дээр туршсан", + "setup-title": "Outline-г тохируулахын тулд үүлэн үйлчилгээ сонгоно уу.", + "share-description": "Энэ урилгыг хуулж, үүнийг харилцаа холбооны итгэдэг хэрэгслээсээ илгээнэ үү. {openLink}Тусламж хэрэгтэй юү?{closeLink}", + "share-invite-access-key-copied": "Хандалтын түлхүүрийг түр санах ойд хуулсан", + "share-invite-copied": "Урилгыг түр санах ойд хуулсан", + "share-invite-copy": "Урилгыг хуулах", + "share-invite-copy-access-key": "Хандалтын түлхүүр хуулах", + "share-invite-html": "Энэ серверийг нээлттэй интернэтэд аюулгүй хандахад ашиглана уу:

1) Төхөөрөмждөө Outline аппыг татаж, суулгана уу:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android-н өөр холбоос: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Та ss://-р эхэлсэн хандалтын түлхүүр хүлээн авна. Та үүнийг хүлээн авсныхаа дараа энэ хандалтын түлхүүрийг хуулна уу.

3) Outline клиент аппыг нээнэ үү. Хэрэв таны хандалтын түлхүүрийг автоматаар илрүүлсэн бол \"Холбох\" дээр товшиж, үргэлжлүүлнэ үү. Хэрэв таны хандалтын түлхүүрийг автоматаар илрүүлээгүй бол үүнийг талбарт буулгаад, дараа нь \"Холбогдох\" дээр товшиж, үргэлжлүүлнэ үү.

Та нээлттэй интернэтийг ашиглахад бэлэн боллоо! Та серверт амжилттай холбогдсон эсэхээ баталгаажуулахын тулд Google Хайлтад \"миний IP юу вэ?\" гэж хайж үзнэ үү. Google-д харуулсан IP хаяг Outline клиентийн IP хаягтай таарч байх ёстой.

Outline-н талаар эндээс нэмэлт мэдээлэл авна уу: https://getoutline.org/", + "share-invite-instructions": "GitHub дээрх манай урилгын зааварчилгааг дагана уу:", + "share-invite-trouble": "Урилгын холбоосонд хандахад асуудал гарч байна уу?", + "share-title": "Хандалт хуваалцах", + "survey-data-limits-title": "Дата хязгаарыг хэрхэн сайжруулах талаар ойлгоход бидэнд тусална уу", + "survey-decline": "Татгалзах", + "survey-disclaimer": "Үргэлжлүүлэхийг товшсоноор таныг Google Маягт дээрх товч судалгаанд аваачна. Бид судалгааг Outline-д холбогдсон байхдаа бөглөхийг зөвлөж байна.", + "survey-go-to-survey": "Судалгаа руу очих", + "terms-of-service": "Би {openLink}Outline-н үйлчилгээний нөхцөлийг{closeLink} уншсан бөгөөд ойлгож байна" +} diff --git a/server_manager/messages/mr.json b/server_manager/messages/mr.json new file mode 100644 index 0000000000..6be771d906 --- /dev/null +++ b/server_manager/messages/mr.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline हा बातम्यांच्या संस्था आणि पत्रकार यांना इंटरनेट अ‍ॅक्सेस करण्यासाठी सुरक्षित मार्ग प्रदान करण्याकरिता Jigsaw ने तयार केलेला मुक्त स्रोत प्रोजेक्ट आहे.

Outline हे Shadowsocks द्वारे समर्थित आहे आणि अजूनही सुरुवातीच्या टप्प्यावर आहे. तुम्ही GitHub वर कोडसाठी योगदान देऊ शकता आणि आम्ही आणखी प्लॅटफॉर्म विस्तारित करू व नवीन वैशिष्ट्ये जोडू, तेव्हा त्यांबद्दल जाणून घेण्यासाठी आम्हाला Reddit आणि Medium वर फॉलो करू शकता.", + "about-version": "आवृत्ती {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} इंस्टन्स स्क्रीनवर नेव्हिगेट करा.", + "aws-lightsail-firewall-1": "तुम्हाला Outline ज्या इंस्टन्सवर होस्ट करायचे आहे त्यावर क्लिक करा.", + "aws-lightsail-firewall-2": "'नेटवर्किंग (Networking)' टॅबवर नेव्हिगेट करा.", + "aws-lightsail-firewall-3": "'फायरवॉल (Firewall)' विभागामध्ये, 'दुसरा जोडा (Add another)' वर क्लिक करा.", + "aws-lightsail-firewall-4": "'अ‍ॅप्लिकेशन (Application)' मूल्य 'सर्व TCP+UDP (All TCP+UDP)' वर सेट करा.", + "aws-lightsail-firewall-5": "'सेव्ह करा (Save)' वर क्लिक करा.", + "cancel": "रद्द करा", + "close": "बंद करा", + "confirmation-server-destroy": "सध्याचे वापरकर्ते अ‍ॅक्सेस गमावतील. ही कृती पहिल्यासारखी केली जाऊ शकत नाही.", + "confirmation-server-destroy-title": "सर्व्हर नष्ट करायचा आहे का?", + "confirmation-server-remove": "या कृतीमुळे तुमचा सर्व्हर Outline Manager मधून काढून टाकला जातो, पण वापरकर्त्यांसाठी प्रॉक्सी अ‍ॅक्सेस ब्लॉक करत नाही. तुम्ही अजूनही तुमच्या होस्ट मशीनमधून Outline सर्व्हर मॅन्युअली हटवण्याची आवश्यकता आहे.", + "confirmation-server-remove-title": "सर्व्हर काढून टाकायचा आहे का?", + "data-limit": "डेटा मर्यादा", + "data-limit-per-key": "प्रति कीसाठी डेटाची मर्यादा", + "data-limits": "डेटा मर्यादा", + "data-limits-description": "या सर्व्हरवरील अ‍ॅक्सेस कीसाठी ३० दिवसांची ट्रेलिंग डेटा ट्रान्सफर मर्यादा सेट करा.", + "data-limits-dialog-text": "या सर्व्हरवरील अ‍ॅक्सेस कीसाठी डेटा ट्रान्सफरची मर्यादा सेट करण्याकरिता सेटिंग्ज टॅबवर जा.", + "data-limits-dialog-title": "डेटाचा अतिवापर करणे टाळा", + "data-limits-disclaimer": "तुम्ही सध्या मेट्रिकचा अहवाल देत असल्यामुळे, डेटा मर्यादांच्या वैशिष्ट्याचा वापर समाविष्ट केला जाईल. अधिक तपशिलांसाठी, कृपया {openLink}डेटा संग्रह धोरण{closeLink} पहा.", + "data-limits-usage": "{total} पैकी {used} वापरले", + "destroy": "नष्ट करा", + "digitalocean-disconnect-account": "DigitalOcean खाते डिस्कनेक्ट करा", + "digitalocean-unreachable": "ही एरर तुमच्या नेटवर्कवरील फायरवॉलमुळे किंवा digitalocean.com च्या कनेक्टिव्हिटीशी संबंधित तात्पुरत्या समस्यांमुळे येऊ शकते.", + "disabled": "बंद केले", + "disconnect": "डिस्कनेक्ट करा", + "done": "पूर्ण झाले", + "enabled": "सुरू केले", + "error-connectivity": "आम्हाला तुमच्या DigitalOcean खात्याशी कनेक्ट करण्यात समस्या येत आहे. काही वेळा ही DigitalOcean किंवा तुमच्या इंटरनेट कनेक्शनशी संबंधित तात्पुरती समस्या असते. पुन्हा प्रयत्न केल्याने काम होत नसल्यास, DigitalOcean मध्ये पुन्हा लॉग इन केल्यास समस्येचे निराकरण होईल.", + "error-connectivity-title": "कनेक्शनशी संबंधित समस्या", + "error-do-account-info": "DigitalOcean ची खाते माहिती मिळवता आली नाही", + "error-do-auth": "DigitalOcean चे ऑथेंटिकेशन करता आले नाही", + "error-do-limit": "तुमच्या DigitalOcean खात्याने त्याची {num} ड्रॉपलेट ची मर्यादा गाठली आहे. तुम्ही https://cloud.digitalocean.com/account/team/droplet_limit_increase येथे मर्यादा वाढवण्याची विनंती करू शकता", + "error-do-regions": "उपलब्ध प्रदेशांची सूची मिळवता आली नाही", + "error-do-warning": "DigitalOcean शी संबंधित चेतावणी: \"{message}\"", + "error-feedback": "फीडबॅक सबमिट करता आला नाही. कृपया पुन्हा प्रयत्न करा.", + "error-gcp-auth": "Google Cloud Platform सह ऑथेंटिकेशन करता आले नाही", + "error-hostname-invalid": "आयपी अ‍ॅड्रेस किंवा वैध होस्ट नाव असणे आवश्यक आहे.", + "error-key-add": "की जोडता आली नाही", + "error-key-remove": "की काढून टाकता आली नाही", + "error-key-rename": "कीचे नाव बदलता आले नाही", + "error-keys-get": "की लोड करता आल्या नाहीत", + "error-keys-port-bad-input": "पोर्ट १ आणि ६५,५३५ मधील पूर्णांक असणे आवश्यक आहे.", + "error-keys-port-in-use": "पोर्ट हा सर्व्हरवर आधीपासून वापरात आहे.", + "error-licenses": "परवाने लोड करता आले नाहीत.", + "error-metrics": "मेट्रिकचा अहवाल देणे सुरु करताना एरर आली", + "error-network": "नेटवर्क एरर आली.", + "error-not-saved": "सेव्ह केल्या नाहीत", + "error-remove-data-limit": "डीफॉल्ट डेटा मर्यादा बंद करता आली नाही", + "error-remove-per-key-limit": "या अ‍ॅक्सेस कीसाठी डेटा मर्यादा काढून टाकू शकत नाही", + "error-server-creation": "तुमचा Outline सर्व्हर तयार करताना एरर आली.", + "error-server-destroy": "सर्व्हर नष्ट करता आला नाही", + "error-server-removed": "{serverName} हा सर्व्हर आता तुमच्या DigitalOcean खात्यामध्ये उपलब्ध नाही.", + "error-server-rename": "सर्व्हरचे नाव बदलता आले नाही", + "error-server-unreachable": "तुमचा Outline सर्व्हर व्यवस्थित इंस्टॉल केला होता, पण आम्ही त्याच्याशी कनेक्ट करू शकलो नाही. बहुधा तुमच्या सर्व्हरचे फायरवॉल नियम येणारी कनेक्शन ब्लॉक करत असल्यामुळे असे होत असावे. कृपया त्यांचे पुनरावलोकन करा आणि १०२४ ते ६५५३५ या रेंजमधील पोर्टवर येणाऱ्या TCP कनेक्शनना अनुमती दिल्याची खात्री करा.", + "error-server-unreachable-title": "तुमच्या Outline सर्व्हर शी कनेक्ट करता आले नाही", + "error-servers-removed": "{serverNames} हा सर्व्हर आता तुमच्या DigitalOcean खात्यामध्ये उपलब्ध नाही.", + "error-set-data-limit": "डीफॉल्ट डेटा मर्यादा सेट करता आली नाही", + "error-set-per-key-limit": "या अ‍ॅक्सेस कीसाठी डेटाची मर्यादा सेट करता आली नाही", + "error-unexpected": "अनपेक्षित एरर आली.", + "experimental": "प्रायोगिक", + "experiments": "प्रयोग", + "experiments-description": "नवीन वैशिष्ट्यांची चाचणी करा आणि ती रिलीझ होण्याआधी आम्हाला फीडबॅक द्या.", + "experiments-disclaimer": "प्रयोग विकसित होत आहेत आणि ते बदलू शकतात किंवा अ‍ॅपमधून काढून टाकले जाऊ शकतात. तुम्ही सध्या मेट्रिकचा अहवाल देत असल्यास, प्रायोगिक वैशिष्ट्यांचा वापर समाविष्ट असेल. अधिक तपशिलांसाठी, कृपया {openLink}डेटा संग्रह धोरण{closeLink} पहा.", + "experiments-feedback": "सूचना आहेत का? {openLink}फीडबॅक येथे सबमिट करणे{closeLink} हे करा.", + "feedback-cloud-provider": "क्लाउड पुरवठादार निवडा", + "feedback-cloud-provider-error": "कृपया क्लाउड पुरवठादार निवडा.", + "feedback-connection": "माझ्या सर्व्हरशी कनेक्ट करू शकत नाही", + "feedback-connection-others": "इतर माझ्या सर्व्हरशी कनेक्ट करू शकत नाही", + "feedback-disclaimer": "कृपया नोंद घ्या, की आमची टीम फक्त इंग्रजीमधील फीडबॅकना उत्तर देऊ शकता.", + "feedback-email": "ईमेल अ‍ॅड्रेस (पर्यायी)", + "feedback-error": "कृपया फीडबॅक एंटर करा.", + "feedback-explanation-install": "तुमच्या सर्व्हरवर Outline इंस्टॉल करण्याचा प्रयत्न करताना एरर आली. तुम्ही समस्येचे निराकरण करू शकत नसल्यास, कृपया फीडबॅकसह तुमचा ईमेल अ‍ॅड्रेस (पर्यायी) पाठवा, जेणेकरून आम्ही तुमच्याशी संपर्क साधू शकू.", + "feedback-general": "सर्वसाधारण फीडबॅक", + "feedback-install": "Outline इंस्टॉल करताना समस्या येत आहे", + "feedback-label": "तुमचा फीडबॅक", + "feedback-management": "माझे सर्व्हर व्यवस्थापित करताना समस्या येत आहे", + "feedback-other": "इतर", + "feedback-privacy": "{openLink}गोपनीयता धोरण{closeLink} यामध्ये नमूद केलेला तुमचा फीडबॅक, ईमेल अ‍ॅड्रेस (दिलेला असल्यास) आणि अतिरिक्त माहिती Outline टीमला पाठवली जाईल.", + "feedback-submit": "सबमिट करा", + "feedback-suggestion": "सूचना", + "feedback-title-generic": "फीडबॅक पाठवा", + "feedback-title-install": "Outline सर्व्हर इंस्टॉल करता आला नाही", + "gcp-billing-action": "पुढील", + "gcp-billing-body": "तुम्ही {openLink}Google Cloud वर बिलिंग खाते जोडणे{closeLink} हे करण्याची प्रतीक्षा करत आहे", + "gcp-billing-description": "{openLink}क्लाउड कन्सोल बिलिंग पेज उघडणे{closeLink} हे करा आणि पुढे सुरू ठेवण्यासाठी खाते जोडा.", + "gcp-billing-error": "बिलिंग माहिती मिळवू शकत नाही", + "gcp-billing-error-zero": "पुढे सुरू ठेवण्यापूर्वी तुम्ही बिलिंग खाते जोडणे आवश्यक आहे.", + "gcp-click-create": "'तयार करा (Create)' वर क्लिक करा.", + "gcp-create-new-project": "{openLink}नवीन Google Cloud प्रोजेक्ट तयार करणे{closeLink}.", + "gcp-create-new-vm": "{openLink}नवीन VM इंस्टन्स तयार करणे{closeLink}.", + "gcp-create-project": "Google Cloud प्रोजेक्ट तयार करा", + "gcp-create-server": "तुमचा Google Cloud प्रोजेक्ट तयार करा", + "gcp-create-vm": "VM इंस्टन्स तयार करा", + "gcp-disconnect-account": "Google Cloud Platform खाते डिस्कनेक्ट करा", + "gcp-firewall-create-0": "तुमच्या Compute Engine प्रोजेक्टमध्ये {openLink}नवीन फायरवॉल नियम जोडणे{closeLink} हे करा.", + "gcp-firewall-create-1": "'नाव (Name)' या फील्डमध्ये 'outline' टाइप करा.", + "gcp-firewall-create-2": "'लक्ष्यीत टॅग (Target tags)' फील्डमध्ये 'outline' टाइप करा.", + "gcp-firewall-create-3": "'स्रोत आयपी रेंज (Source IP ranges)' या फील्डमध्ये '0.0.0.0/0' टाइप करा.", + "gcp-firewall-create-4": "'प्रोटोकॉल आणि पोर्ट (Protocols and ports)' या अंतर्गत 'सर्व अनुमती द्या (Allow all)' निवडा.", + "gcp-name-your-project": "'प्रोजेक्ट चे नाव (Project name)' या फील्डमध्ये तुमच्या प्रोजेक्टला नाव द्या.", + "gcp-project-setup-error": "तुमचा Google Cloud प्रोजेक्ट सेट करताना एरर आली", + "gcp-select-machine-type": "'मशीन प्रकार (Machine type)' या अंतर्गत 'f1-micro' निवडा", + "gcp-select-networking": "'व्यवस्थापन, सुरक्षा, डिस्क, नेटवर्किंग, सोल टेनन्सी (Management, security, disks, networking, sole tenancy)', त्यानंतर 'नेटवर्किंग (Networking)' वर क्लिक करा", + "gcp-select-region": "'प्रदेश (Region)' या अंतर्गत सर्व्हरचे वापरकर्ते असलेला प्रदेश निवडा.", + "gcp-type-network-tag": "'नेटवर्क टॅग (Network tags)' या फील्डमध्ये 'outline' टाइप करा", + "gcp-type-outline-server": "'नाव' या फील्डमध्ये 'outline सर्व्हर' टाइप करा.", + "geo-amsterdam": "ॲम्स्टरडॅम", + "geo-bangalore": "बेंगळुरू", + "geo-changhua-county": "चांघवा काउंटी", + "geo-delhi": "दिल्ली", + "geo-eemshaven": "इम्सहॅवन", + "geo-frankfurt": "फ्रँकफर्ट", + "geo-hamina": "हमिना", + "geo-hk": "हाँगकाँग", + "geo-iowa": "आयोवा", + "geo-jakarta": "जकार्ता", + "geo-jurong-west": "जुरॉंग वेस्ट", + "geo-las-vegas": "लास व्हेगास", + "geo-london": "लंडन", + "geo-los-angeles": "लॉस एंजेलिस", + "geo-melbourne": "मेलबर्न", + "geo-montreal": "माँट्रिआल", + "geo-mumbai": "मुंबई", + "geo-new-york-city": "न्यूयॉर्क", + "geo-northern-virginia": "उत्तर व्हर्जिनिया", + "geo-oregon": "ओरेगॉन", + "geo-osaka": "ओसाका", + "geo-salt-lake-city": "सॉल्ट लेक सिटी", + "geo-san-francisco": "सॅन फ्रान्सिस्को", + "geo-sao-paulo": "साओ पाउलो", + "geo-seoul": "सेऊल", + "geo-sg": "सिंगापूर", + "geo-south-carolina": "साउथ कॅरोलिना", + "geo-st-ghislain": "सेंट गिलेन", + "geo-sydney": "सिडनी", + "geo-tokyo": "टोकियो", + "geo-toronto": "टोरँटो", + "geo-warsaw": "वॉर्सा", + "geo-zurich": "झुरिक", + "key": "{keyId} की", + "manual-server-assign-firewall": "फायरवॉलचे नियम असाइन करा", + "manual-server-assign-group": "सुरक्षा गट असाइन करा", + "manual-server-create-firewall": "फायरवॉल नियम तयार करा", + "manual-server-create-group": "सुरक्षा गट तयार करा", + "manual-server-description": "या पायऱ्या तुम्हाला {cloudProvider} Linux सर्व्हरवर Outline इंस्टॉल करण्यात मदत करतील.", + "manual-server-firewall": "तुमचे फायरवॉल कॉंफिगर करा", + "manual-server-install-paste": "तुमचे इंस्टॉलेशन आउटपुट येथे पेस्ट करा.", + "manual-server-install-run": "तुमच्या सर्व्हरमध्ये लॉग इन करा आणि ही कमांड रन करा.", + "manual-server-instructions": "सूचना", + "manual-server-show-me": "कुठे ते मला दाखवा", + "manual-server-title": "खालील सूचना फॉलो करा", + "metrics-description": "तुमच्यासाठी आणि तुम्ही ज्यांच्यासोबत तुमचा सर्व्हर शेअर करता त्यांच्यासाठी, Outline ची विश्वासार्हता व परफॉर्मन्स यांमध्ये सुधारणा करण्यात मदत करण्याकरिता, निनावी मेट्रिक शेअर करा. {openLink}अधिक जाणून घ्या.{closeLink}", + "metrics-share": "मेट्रिक शेअर करा", + "metrics-skip": "वगळा", + "metrics-title": "मेट्रिक शेअर करणे", + "nav-about": "याबद्दल", + "nav-data-collection": "डेटा संग्रह", + "nav-feedback": "फीडबॅक", + "nav-help": "मदत", + "nav-licenses": "परवाने", + "nav-privacy": "गोपनीयता", + "nav-terms": "अटी", + "no-data-limit": "काहीही नाही", + "notification-app-update": "Outline Manager ची अपडेट केलेली आवृत्ती डाउनलोड केली गेली आहे. तुम्ही अ‍ॅप्लिकेशन रीस्टार्ट कराल, तेव्हा ती इंस्टॉल केली जाईल.", + "notification-feedback-thanks": "आम्हाला सुधारणा करण्यात मदत केल्याबद्दल धन्यवाद! तुमचा फीडबॅक जाणून घेण्यात आम्हाला समाधान मिळते.", + "notification-key-added": "की जोडली", + "notification-key-removed": "की काढून टाकली", + "notification-server-destroyed": "सर्व्हर नष्ट केला", + "notification-server-exists": "सर्व्हर आधीच जोडला", + "notification-server-removed": "सर्व्हर काढून टाकला", + "oauth-account-active": "तुमचे DigitalOcean खाते अ‍ॅक्टिव्हेट केले गेले आहे.", + "oauth-account-active-tag": "खाते अ‍ॅक्टिव्हेट केले! सर्व्हरची स्थाने लोड करत आहे...", + "oauth-activate-account": "तुमचे DigitalOcean खाते अ‍ॅक्टिव्हेट करा.", + "oauth-billing": "digitalocean.com वर तुमची बिलिंग माहिती एंटर करा आणि पूर्ण झाल्यावर अ‍ॅपवर परत जा.", + "oauth-billing-tag": "बिलिंग माहिती एंटर करा...", + "oauth-connect-description": "तुमच्या खात्यासह, Outline हे सर्व्हर तयार करणे आणि कनेक्ट करणे सुलभ करते.", + "oauth-connect-tag": "तुमचे खाते कनेक्ट करण्याची प्रतीक्षा करत आहे...", + "oauth-connect-title": "साइन इन करा किंवा DigitalOcean सह खाते तयार करा.", + "oauth-sign-out": "साइन आउट करा", + "oauth-verify": "DigitalOcean कडून मिळालेल्या ईमेलसाठी तुमचा इनबॉक्स पहा आणि तुमचे खाते कंफर्म करण्यासाठी त्यामधील लिंकवर क्लिक करा.", + "oauth-verify-tag": "तुमचा ईमेल कंफर्म करा...", + "okay": "ओके", + "per-key-data-limit-dialog-set-custom": "कस्टम डेटा मर्यादा सेट करा", + "per-key-data-limit-dialog-title": "डेटा मर्यादा - {keyName}", + "region-best-value": "सर्वोत्तम मूल्य", + "region-description": "तुमच्या इंटरनेट अनुभवाबद्दलचा डेटा येथून मिळतो.", + "region-setup": "Outline सेट करा", + "region-title": "तुमच्या सर्व्हरचे स्थान निवडा.", + "remove": "काढून टाका", + "retry": "पुन्हा प्रयत्न करा", + "save": "सेव्ह करा", + "saved": "सेव्ह केले", + "saving": "सेव्ह करत आहे...", + "server-access": "सर्व्हर अ‍ॅक्सेस", + "server-access-key-new": "नवीन की जोडा", + "server-access-key-rename": "नाव बदला", + "server-access-keys": "अ‍ॅक्सेस की", + "server-connections": "कनेक्शन", + "server-data-transfer": "डेटा ट्रान्सफर केला / मागील ३० दिवसांमध्ये", + "server-data-used": "वापरलेला अलावन्स / मागील ३० दिवसांमध्ये", + "server-destroy": "सर्व्हर नष्ट करा", + "server-help-access-key-description": "मित्रमैत्रिणींसोबत अ‍ॅक्सेस की शेअर करा, जेणेकरून ते तुमच्या Outline सर्व्हरशी कनेक्ट करू शकतील. ते तीच अ‍ॅक्सेस की त्यांच्या सर्व डिव्हाइसवर वापरू शकतात.", + "server-help-access-key-next": "पुढील", + "server-help-access-key-title": "की तयार करा, अ‍ॅक्सेस शेअर करा", + "server-help-connection-description": "तुमच्या Outline सर्व्हरसाठी तुमची वैयक्तिक अ‍ॅक्सेस की वापरून, Outline क्लायंट अ‍ॅप इंस्टॉल करण्यासाठी येथे क्लिक करा.", + "server-help-connection-ok": "ठीक आहे, समजले!", + "server-help-connection-title": "तुम्ही अद्याप कनेक्ट केलेले नाही!", + "server-keys": "की", + "server-my-access-key": "माझी अ‍ॅक्सेस की", + "server-name": "Outline सर्व्हर {serverLocation}", + "server-remove": "सर्व्हर काढून टाका", + "server-settings": "सेटिंग्ज", + "server-unreachable": "सर्व्हरपर्यंत पोहोचू शकत नाही", + "server-unreachable-description": "आम्हाला या सर्व्हरशी कनेक्ट करण्यात समस्या येत आहेत.", + "server-unreachable-managed-description": "पुन्हा प्रयत्न करा किंवा हा सर्व्हर अ‍ॅप्लिकेशनमधून काढून टाका.", + "server-unreachable-manual-description": "पुन्हा प्रयत्न करा किंवा हा सर्व्हर आणि व्हर्च्युअल होस्ट नष्ट करा.", + "server-usage": "वापर (मागील ३० दिवसांमधील)", + "servers-add": "सर्व्हर जोडा", + "servers-digitalocean": "DigitalOcean सर्व्हर", + "servers-gcp": "Google Cloud Platform सर्व्हर", + "servers-manual": "सर्व्हर", + "settings-access-key-port": "नवीन अ‍ॅक्सेस कीसाठी पोर्ट", + "settings-metrics-header": "निनावी मेट्रिक शेअर करा", + "settings-server-api-url": "व्यवस्थापन API URL", + "settings-server-cost": "मासिक शुल्क", + "settings-server-creation": "तयार केले", + "settings-server-hostname": "होस्ट नाव", + "settings-server-id": "सर्व्हर आयडी", + "settings-server-info": "सर्व्हरची माहिती", + "settings-server-location": "सर्व्हरचे स्थान", + "settings-server-name": "नाव", + "settings-server-rename": "तुमच्या सर्व्हरसाठी नवीन नाव सेट करा. नोंद घ्या, की ज्या वापरतकर्त्यांना तुम्ही या सर्व्हरशी कनेक्ट करण्यासाठी आमंत्रित केले आहे त्या वापरकर्त्यांच्या डिव्हाइसवर हे दिसणार नाही.", + "settings-server-version": "सर्व्हरची आवृत्ती", + "settings-transfer-limit": "डेटा ट्रान्सफर अलावन्स", + "setup-action": "सेट करा", + "setup-advanced": "प्रगत", + "setup-anywhere": "Outline कुठेही सेट करा", + "setup-cancel": "कधीही रद्द करा", + "setup-create": "सर्व्हर तयार करा", + "setup-description": "सर्व्हर नाही का? DigitalOcean सह खाते तयार करा.", + "setup-do-cost": "प्रति महिना फक्त US$६", + "setup-do-create": "तुमचे DigitalOcean खाते वापरून US$६/३० दिवसांसाठी १ TB डेटा ट्रान्सफरकरिता नवीन सर्व्हर तयार करा.", + "setup-do-data": "१ TB डेटा ट्रान्सफर अलावन्स", + "setup-do-description": "यासाठी काही मिनिटे लागू शकतात. तुम्ही हा सर्व्हर कधीही नष्ट करू शकता.", + "setup-do-easiest": "सर्वात सोपी सेटअप प्रक्रिया", + "setup-do-title": "Outline सेट करणे.", + "setup-firewall-instructions": "फायरवॉल सूचना", + "setup-gcp-create": "तुमचे Google खाते वापरून नवीन सर्व्हर तयार करा. स्थान आणि वापरानुसार शुल्क बदलते.", + "setup-gcp-easy": "सुलभ सेटअप प्रक्रिया", + "setup-gcp-free-tier": "{openLinkFreeTier}विनामूल्य टिएर{closeLink} सह, तुमचा पहिला सर्व्हर {openLinkIpPrice}US$३/महिना{closeLink} याने सुरू होतो", + "setup-gcp-free-trial": "नवीन वापरकर्त्यांसाठी {openLinkFreeTrial}९० दिवसांची विनामूल्य चाचणी{closeLink}", + "setup-gcp-promo": "Google Cloud साठी नवीन ऑटोमॅटिक Outline सर्व्हर तयार करण्याची प्रक्रिया वापरून पहा", + "setup-recommended": "शिफारस केलेले", + "setup-simple-commands": "इंस्टॉल करण्यासाठी साध्या कमांड", + "setup-step-by-step": "स्टेप-बाय-स्टेप सेटअप मार्गदर्शक", + "setup-tested": "VULTR, Linode आणि Liquid Web वर चाचणी केलेले", + "setup-title": "Outline सेट करण्यासाठी क्लाउड सेवा निवडा.", + "share-description": "हे आमंत्रण कॉपी करा आणि तुमचा विश्वास असलेल्या संभाषण टूलवरून पाठवा. {openLink}मदत हवी आहे का?{closeLink}", + "share-invite-access-key-copied": "अ‍ॅक्सेस की क्लिपबोर्डवर कॉपी केली", + "share-invite-copied": "आमंत्रण क्लिपबोर्डवर कॉपी केले", + "share-invite-copy": "आमंत्रण कॉपी करा", + "share-invite-copy-access-key": "अ‍ॅक्सेस की कॉपी करा", + "share-invite-html": "मुक्त इंटरनेट सुरक्षितरीत्या अ‍ॅक्सेस करण्यासाठी हा सर्व्हर वापरा:

१) तुमच्या डिव्हाइससाठी Outline अ‍ॅप डाउनलोड आणि इंस्टॉल करा:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android साठी पर्यायी लिंक: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

२) तुम्हाला ss:// ने सुरू होणारी अ‍ॅक्सेस की मिळेल. तुम्हाला ती मिळाल्यानंतर, ही अ‍ॅक्सेस की कॉपी करा.

३) Outline क्लायंट अ‍ॅप उघडा. तुमची अ‍ॅक्सेस की ऑटो-डिटेक्ट होत असल्यास, \"कनेक्ट करा\" वर टॅप करा आणि पुढे सुरू ठेवा. तुमची अ‍ॅक्सेस की ऑटो-डिटेक्ट होत नसल्यास, ती फील्डमध्ये पेस्ट करा, त्यानंतर \"कनेक्ट करा\" वर टॅप करा आणि पुढे सुरू ठेवा.

तुम्ही मुक्त इंटरनेट वापरण्यासाठी तयार आहात! तुम्ही सर्व्हरशी यशस्वीरीत्या कनेक्ट झाल्याची खात्री करण्यासाठी, Google Search वर \"माझा आयपी काय आहे\" हे शोधून पहा. Google वर दाखवलेला आयपी अ‍ॅड्रेस आणि Outline क्लायंटमधील आयपी अ‍ॅड्रेस जुळणे आवश्यक आहे.

Outline बद्दल येथे अधिक जाणून घ्या: https://getoutline.org/", + "share-invite-instructions": "GitHub वर आमच्या आमंत्रण सूचना फॉलो करा:", + "share-invite-trouble": "आमंत्रण लिंक अ‍ॅक्सेस करण्यात समस्या येत आहे का?", + "share-title": "अ‍ॅक्सेस शेअर करा", + "survey-data-limits-title": "डेटाच्या मर्यादांमध्ये सुधारणा कशी करावी हे समजून घेण्यात आम्हाला मदत करा", + "survey-decline": "नकार द्या", + "survey-disclaimer": "तुम्ही पुढे सुरू ठेवा वर क्लिक केल्यास, तुम्हाला संक्षिप्त सर्वेक्षणासाठी Google Forms वर पाठवले जाईल. तुम्ही Outline शी कनेक्ट केलेले असताना सर्वेक्षणामध्ये सहभागी व्हावे अशी आम्ही शिफारस करतो.", + "survey-go-to-survey": "सर्वेक्षणावर जा", + "terms-of-service": "मी {openLink}Outline च्या सेवा अटी{closeLink} वाचल्या आणि समजून घेतल्या आहेत" +} diff --git a/server_manager/messages/ms.json b/server_manager/messages/ms.json new file mode 100644 index 0000000000..f24e69ea8e --- /dev/null +++ b/server_manager/messages/ms.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline ialah sebuah projek sumber terbuka yang dibuat oleh Jigsaw untuk membolehkan organisasi berita dan wartawan mengakses Internet dengan cara yang lebih selamat.

Outline dikuasakan oleh Shadowsocks dan produk ini masih pada peringkat awal. Anda boleh memberikan sumbangan kepada kod ini pada GitHub dan mengikuti kami pada Reddit dan Medium untuk mengetahui tentang masa kami berkembang ke lebih banyak platform dan menambah ciri baharu.", + "about-version": "Versi {version}", + "aws-lightsail-firewall-0": "Navigasi ke skrin tika {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Klik tika yang ingin anda menghoskan Outline.", + "aws-lightsail-firewall-2": "Navigasi ke tab 'Perangkaian (Networking)'.", + "aws-lightsail-firewall-3": "Di bahagian 'Tembok Api (Firewall)', klik 'Tambah satu lagi (Add another)'.", + "aws-lightsail-firewall-4": "Tetapkan nilai 'Aplikasi (Application)' kepada 'Semua TCP+UDP (All TCP+UDP)'.", + "aws-lightsail-firewall-5": "Klik 'Simpan'.", + "cancel": "Batal", + "close": "Tutup", + "confirmation-server-destroy": "Pengguna sedia ada akan kehilangan akses. Tindakan ini tidak boleh dibuat asal.", + "confirmation-server-destroy-title": "Musnahkan Pelayan?", + "confirmation-server-remove": "Tindakan ini mengalih keluar pelayan anda daripada Outline Manager, tetapi tidak menyekat akses proksi kepada pengguna lain. Anda masih perlu memadamkan pelayan Outline berkenaan secara manual daripada mesin hos anda.", + "confirmation-server-remove-title": "Alih Keluar Pelayan?", + "data-limit": "Had Data", + "data-limit-per-key": "Had data setiap kunci", + "data-limits": "Had data", + "data-limits-description": "Tetapkan had pemindahan data belakang 30 hari untuk kunci akses pada pelayan ini.", + "data-limits-dialog-text": "Pergi ke tab Tetapan untuk menetapkan had pemindahan data bagi kunci akses pada pelayan ini.", + "data-limits-dialog-title": "Elakkan usia lanjut data", + "data-limits-disclaimer": "Oleh sebab anda melaporkan metrik pada masa ini, penggunaan ciri had data akan disertakan. Sila lihat {openLink}dasar pengumpulan data{closeLink} untuk mendapatkan butiran lanjut.", + "data-limits-usage": "{used} daripada {total} digunakan", + "destroy": "Musnahkan", + "digitalocean-disconnect-account": "Putuskan sambungan akaun DigitalOcean", + "digitalocean-unreachable": "Ralat ini mungkin disebabkan oleh tembok api pada rangkaian anda atau isu kesambungan sementara dengan digitalocean.com.", + "disabled": "Dilumpuhkan", + "disconnect": "Putuskan sambungan", + "done": "Selesai", + "enabled": "Didayakan", + "error-connectivity": "Kami sedang mengalami masalah bersambung ke akaun DigitalOcean anda. Ini adalah masalah sementara yang berkaitan dengan DigitalOcean atau sambungan Internet anda. Jika percubaan semula tidak berjaya, tindakan log masuk ke DigitalOcean sekali lagi sepatutnya membetulkan masalah ini.", + "error-connectivity-title": "Masalah sambungan", + "error-do-account-info": "Gagal mendapatkan maklumat akaun DigitalOcean", + "error-do-auth": "Pengesahan dengan DigitalOcean gagal", + "error-do-limit": "Akaun DigitalOcean anda telah mencapai had {num} Droplet. Anda boleh meminta peningkatan had di https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Gagal mendapatkan senarai rantau yang tersedia", + "error-do-warning": "Amaran DigitalOcean: \"{message}\"", + "error-feedback": "Gagal menyerahkan maklum balas. Sila cuba lagi.", + "error-gcp-auth": "Pengesahan dengan Google Cloud Platform gagal", + "error-hostname-invalid": "Mestilah alamat IP atau nama hos yang sah.", + "error-key-add": "Gagal menambah kunci", + "error-key-remove": "Gagal mengalih keluar kunci", + "error-key-rename": "Gagal menamakan semula kunci", + "error-keys-get": "Tidak dapat memuatkan kunci", + "error-keys-port-bad-input": "Port mestilah integer antara 1 hingga 65,535.", + "error-keys-port-in-use": "Port ini sudah digunakan pada pelayan ini.", + "error-licenses": "Tidak dapat memuatkan lesen.", + "error-metrics": "Ralat semasa penetapan metrik didayakan", + "error-network": "Ralat rangkaian telah berlaku.", + "error-not-saved": "Tidak Disimpan", + "error-remove-data-limit": "Tidak dapat melumpuhkan had data lalai", + "error-remove-per-key-limit": "Tidak dapat mengalih keluar had data daripada kunci akses ini", + "error-server-creation": "Terdapat ralat membuat pelayan Outline anda.", + "error-server-destroy": "Gagal memusnahkan pelayan", + "error-server-removed": "{serverName} tidak lagi wujud dalam akaun DigitalOcean anda.", + "error-server-rename": "Gagal menamakan semula pelayan", + "error-server-unreachable": "Pelayan Outline anda telah dipasang dengan betul, tetapi kami tidak dapat bersambung ke pelayan ini. Perkara ini kemungkinan besar disebabkan peraturan tembok api pelayan anda menyekat sambungan masuk. Sila semak peraturan tembok api ini dan pastikan sambungan TCP masuk dibenarkan pada port dari 1024 hingga 65535.", + "error-server-unreachable-title": "Tidak dapat bersambung ke Pelayan Outline anda", + "error-servers-removed": "{serverNames} tidak lagi wujud dalam akaun DigitalOcean anda.", + "error-set-data-limit": "Tidak dapat menetapkan had data lalai", + "error-set-per-key-limit": "Tidak dapat menetapkan had data untuk kunci akses ini", + "error-unexpected": "Ralat yang tidak dijangka telah berlaku.", + "experimental": "Percubaan", + "experiments": "Percubaan", + "experiments-description": "Uji ciri baharu dan beri kami maklum balas sebelum dikeluarkan.", + "experiments-disclaimer": "Percubaan sedang dalam pembangunan dan mungkin berubah atau dialih keluar daripada apl. Jika anda melaporkan metrik pada masa ini, penggunaan ciri percubaan akan disertakan. Sila lihat {openLink}dasar pengumpulan data{closeLink} untuk mendapatkan butiran lanjut.", + "experiments-feedback": "Ada cadangan? {openLink}Serahkan maklum balas di sini.{closeLink}", + "feedback-cloud-provider": "Pilih penyedia awan", + "feedback-cloud-provider-error": "Pilih penyedia awan.", + "feedback-connection": "Tidak dapat bersambung ke pelayan saya", + "feedback-connection-others": "Orang lain tidak dapat bersambung ke pelayan saya", + "feedback-disclaimer": "Harap maklum bahawa pasukan kami hanya dapat menjawab maklum balas dalam Bahasa Inggeris.", + "feedback-email": "Alamat e-mel (pilihan)", + "feedback-error": "Sila masukkan maklum balas.", + "feedback-explanation-install": "Ralat telah berlaku sewaktu cuba memasangkan Outline pada pelayan anda. Jika anda belum dapat mencari penyelesaian, sila pertimbangkan untuk menghantar maklum balas kepada kami dan memberitahu kami alamat e-mel anda (pilihan) supaya kami boleh menghubungi anda kembali.", + "feedback-general": "Maklum balas umum", + "feedback-install": "Menghadapi masalah memasang Outline", + "feedback-label": "Maklum balas anda", + "feedback-management": "Saya menghadapi masalah mengurus pelayan saya", + "feedback-other": "Lain-lain", + "feedback-privacy": "Maklum balas anda, alamat e-mel anda (jika diberikan), dan maklumat tambahan yang dirujuk dalam {openLink}dasar privasi{closeLink} akan dihantar kepada pasukan Outline.", + "feedback-submit": "Serah", + "feedback-suggestion": "Cadangan", + "feedback-title-generic": "Hantar Maklum Balas", + "feedback-title-install": "Pemasangan Pelayan Outline Gagal", + "gcp-billing-action": "Seterusnya", + "gcp-billing-body": "Sedang menunggu anda untuk {openLink}menambahkan akaun pengebilan pada Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Buka halaman pengebilan Konsol Cloud{closeLink} dan tambahkan akaun untuk meneruskan.", + "gcp-billing-error": "Tidak dapat mencari kembali maklumat bil", + "gcp-billing-error-zero": "Anda mesti menambahkan akaun pengebilan sebelum meneruskan.", + "gcp-click-create": "Klik 'Buat'.", + "gcp-create-new-project": "{openLink}Buat projek Google Cloud yang baharu{closeLink}.", + "gcp-create-new-vm": "{openLink}Buat tika VM yang baharu{closeLink}.", + "gcp-create-project": "Buat projek Google Cloud", + "gcp-create-server": "Buat Projek Google Cloud anda", + "gcp-create-vm": "Buat tika VM", + "gcp-disconnect-account": "Nyahsambung akaun Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Tambah peraturan tembok api baharu{closeLink} pada projek Compute Engine anda.", + "gcp-firewall-create-1": "Taip 'outline' dalam medan 'Nama (Name)'.", + "gcp-firewall-create-2": "Taip 'outline' dalam medan 'Tag sasaran (Target tags)'.", + "gcp-firewall-create-3": "Taip '0.0.0.0/0' dalam medan 'Julat IP Sumber'.", + "gcp-firewall-create-4": "Pilih 'Benarkan semua' di bawah 'Protokol dan port (Protocols and ports)'.", + "gcp-name-your-project": "Namakan projek anda dalam medan 'Nama projek (Project name)'.", + "gcp-project-setup-error": "Ralat telah berlaku sewaktu menyediakan projek Google Cloud anda", + "gcp-select-machine-type": "Pilih 'f1-micro' di bawah 'Jenis mesin (Machine type)'", + "gcp-select-networking": "Klik 'Pengurusan (Management), keselamatan (security), cakera (disks), perangkaian (networking), penyewaan tunggal (sole tenancy)', kemudian 'Perangkaian (Networking)'", + "gcp-select-region": "Pilih rantau yang hampir dengan tempat pengguna pelayan berada di bawah 'Rantau (Region)'.", + "gcp-type-network-tag": "Taip 'outline' dalam medan 'Tag rangkaian (Network tags)'", + "gcp-type-outline-server": "Taip 'outline-server' dalam medan 'Nama (Name)'.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua County", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong Barat", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Virginia Utara", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapura", + "geo-south-carolina": "Carolina Selatan", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warsaw", + "geo-zurich": "Zürich", + "key": "Kunci {keyId}", + "manual-server-assign-firewall": "Tetapkan peraturan tembok api", + "manual-server-assign-group": "Tetapkan Kumpulan Keselamatan", + "manual-server-create-firewall": "Buat peraturan tembok api", + "manual-server-create-group": "Buat Kumpulan Keselamatan", + "manual-server-description": "Langkah-langkah ini akan membantu anda memasangkan Outline pada pelayan Linux {cloudProvider}.", + "manual-server-firewall": "Konfigurasi tembok api anda", + "manual-server-install-paste": "Tampal output pemasangan anda di sini.", + "manual-server-install-run": "Log masuk ke pelayan anda dan jalankan perintah ini.", + "manual-server-instructions": "Arahan", + "manual-server-show-me": "Tunjukkan kepada saya tempatnya", + "manual-server-title": "Ikut arahan di bawah", + "metrics-description": "Kongsi metrik tanpa nama supaya meningkatkan kebolehpercayaan dan prestasi Outline, untuk anda dan mereka yang berkongsi pelayan dengan anda. {openLink}Ketahui lebih lanjut.{closeLink}", + "metrics-share": "Kongsi metrik", + "metrics-skip": "Langkau", + "metrics-title": "Perkongsian metrik", + "nav-about": "Perihal", + "nav-data-collection": "Pengumpulan data", + "nav-feedback": "Maklum balas", + "nav-help": "Bantuan", + "nav-licenses": "Lesen", + "nav-privacy": "Privasi", + "nav-terms": "Syarat", + "no-data-limit": "Tiada", + "notification-app-update": "Versi Outline Manager yang telah dikemaskinikan telah dimuat turun. Versi ini akan dipasangkan apabila anda memulakan semula aplikasi ini.", + "notification-feedback-thanks": "Terima kasih kerana membantu kami bertambah baik! Kami mengalu-alukan maklum balas anda.", + "notification-key-added": "Kunci ditambahkan", + "notification-key-removed": "Kunci dialih keluar", + "notification-server-destroyed": "Pelayan telah dimusnahkan", + "notification-server-exists": "Pelayan sudah ditambahkan", + "notification-server-removed": "Pelayan telah dialih keluar", + "oauth-account-active": "Akaun DigitalOcean anda telah diaktifkan.", + "oauth-account-active-tag": "Akaun diaktifkan! Sedang memuatkan lokasi pelayan...", + "oauth-activate-account": "Aktifkan akaun DigitalOcean anda.", + "oauth-billing": "Masukkan maklumat bil anda pada digitalocean.com dan kembali kepada apl setelah anda selesai berbuat demikian.", + "oauth-billing-tag": "Masukkan maklumat pengebilan...", + "oauth-connect-description": "Dengan akaun anda, Outline memudahkan anda untuk membuat pelayan dan bersambung.", + "oauth-connect-tag": "Sedang menunggu untuk menyambungkan akaun anda...", + "oauth-connect-title": "Log masuk atau buat akaun dengan DigitalOcean.", + "oauth-sign-out": "Log Keluar", + "oauth-verify": "Semak peti masuk anda untuk menemukan e-mel daripada DigitalOcean, dan klik pautan dalam e-mel itu untuk mengesahkan akaun anda.", + "oauth-verify-tag": "Sahkan e-mel anda...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Tetapkan had data tersuai", + "per-key-data-limit-dialog-title": "Had Data - {keyName}", + "region-best-value": "Nilai Terbaik", + "region-description": "Dari sinilah pengalaman Internet anda bermula.", + "region-setup": "Sediakan Outline", + "region-title": "Pilih lokasi pelayan anda.", + "remove": "Alih keluar", + "retry": "Cuba lagi", + "save": "Simpan", + "saved": "Disimpan", + "saving": "Sedang menyimpan…", + "server-access": "Akses pelayan", + "server-access-key-new": "Tambah kunci baharu", + "server-access-key-rename": "Namakan semula", + "server-access-keys": "Kunci akses", + "server-connections": "Sambungan", + "server-data-transfer": "Data dipindahkan / 30 hari yang lalu", + "server-data-used": "Peruntukan digunakan / 30 hari yang lalu", + "server-destroy": "Musnahkan pelayan", + "server-help-access-key-description": "Kongsi kunci akses dengan rakan, supaya mereka boleh bersambung ke pelayan Outline anda. Mereka boleh menggunakan kunci akses yang sama pada semua peranti mereka.", + "server-help-access-key-next": "Seterusnya", + "server-help-access-key-title": "Buat kunci, kongsi akses", + "server-help-connection-description": "Klik di sini untuk memasangkan apl klien Outline, menggunakan kunci akses peribadi anda pada pelayan Outline anda.", + "server-help-connection-ok": "Okey, faham!", + "server-help-connection-title": "Anda belum bersambung lagi!", + "server-keys": "Kunci", + "server-my-access-key": "Kunci akses saya", + "server-name": "Pelayan Outline {serverLocation}", + "server-remove": "Alih keluar pelayan", + "server-settings": "Tetapan", + "server-unreachable": "Pelayan tidak dapat dicapai", + "server-unreachable-description": "Kami sedang menghadapi masalah bersambung ke pelayan ini.", + "server-unreachable-managed-description": "Cuba lagi atau alih keluar pelayan ini daripada aplikasi.", + "server-unreachable-manual-description": "Cuba lagi dan musnahkan pelayan ini dan hos maya.", + "server-usage": "Penggunaan (30 hari yang lalu)", + "servers-add": "Tambah pelayan", + "servers-digitalocean": "Pelayan DigitalOcean", + "servers-gcp": "Pelayan Google Cloud Platform", + "servers-manual": "Pelayan", + "settings-access-key-port": "Port untuk kunci akses baharu", + "settings-metrics-header": "Kongsi metrik tanpa nama", + "settings-server-api-url": "URL API Pengurusan", + "settings-server-cost": "Kos bulanan", + "settings-server-creation": "Dibuat", + "settings-server-hostname": "Nama hos", + "settings-server-id": "ID Pelayan", + "settings-server-info": "Maklumat Pelayan", + "settings-server-location": "Lokasi pelayan", + "settings-server-name": "Nama", + "settings-server-rename": "Pilih nama baharu untuk pelayan anda. Harap maklum bahawa perkara ini tidak akan dicerminkan pada peranti pengguna yang anda undang untuk bersambung ke pelayan ini.", + "settings-server-version": "Versi pelayan", + "settings-transfer-limit": "Peruntukan pemindahan data", + "setup-action": "Sediakan", + "setup-advanced": "Lanjutan", + "setup-anywhere": "Sediakan Outline di mana-mana sahaja", + "setup-cancel": "Batal pada bila-bila masa", + "setup-create": "Buat pelayan", + "setup-description": "Tiada pelayan? Buat akaun dengan DigitalOcean.", + "setup-do-cost": "Cuma US$6 sebulan", + "setup-do-create": "Buat pelayan baharu dengan akaun DigitalOcean anda pada harga US$6/30 hari untuk pemindahan data 1 TB.", + "setup-do-data": "Peruntukan pemindahan data 1 TB", + "setup-do-description": "Proses ini boleh mengambil masa beberapa minit. Anda boleh memusnahkan pelayan pada bila-bila masa.", + "setup-do-easiest": "Proses persediaan paling mudah", + "setup-do-title": "Menyediakan Outline.", + "setup-firewall-instructions": "Arahan tembok api", + "setup-gcp-create": "Buat pelayan baharu dengan akaun Google anda. Kos berbeza-beza mengikut lokasi dan penggunaan.", + "setup-gcp-easy": "Proses persediaan mudah", + "setup-gcp-free-tier": "Dengan {openLinkFreeTier}Free Tier{closeLink}, pelayan pertama anda bermula pada kadar {openLinkIpPrice}US$3/bulan{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 hari percubaan percuma{closeLink} untuk pengguna baharu", + "setup-gcp-promo": "Cuba proses pembuatan pelayan Outline automatik yang baharu untuk Google Cloud", + "setup-recommended": "Disyorkan", + "setup-simple-commands": "Perintah pasang mudah", + "setup-step-by-step": "Panduan persediaan langkah demi langkah", + "setup-tested": "Telah diuji pada VULTR, Linode, dan Liquid Web", + "setup-title": "Pilih perkhidmatan awan untuk menyediakan Outline.", + "share-description": "Salin undangan ini dan hantar daripada alat komunikasi yang anda percayai. {openLink}Perlukan bantuan?{closeLink}", + "share-invite-access-key-copied": "Telah menyalin kunci akses ke papan keratan", + "share-invite-copied": "Telah menyalin undangan ke papan keratan", + "share-invite-copy": "Salin undangan", + "share-invite-copy-access-key": "Salin kunci akses", + "share-invite-html": "Gunakan pelayan ini untuk mengakses Internet terbuka dengan selamat:

1) Muat turun dan pasang apl Outline untuk peranti anda:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Pautan alternatif Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Anda akan menerima kunci akses yang bermula dengan ss://. Setelah anda menerima kunci akses itu, salin kunci akses tersebut di sini.

3) Buka apl klien Outline. Jika kunci akses anda dikesan secara automatik, ketik \"Sambung\" dan teruskan. Jika kunci akses anda tidak dikesan secara automatik, maka tampal dalam medan ini, kemudian ketik \"Sambung\" dan teruskan.

Anda bersedia untuk menggunakan Internet terbuka! Untuk memastikan anda berjaya bersambung ke pelayan ini, cuba mencari \"apakah ip saya\" pada Google Search. Alamat IP yang dipaparkan dalam Google hendaklah sepadan dengan alamat IP dalam klien Outline.

Ketahui lebih lanjut tentang Outline di sini: https://getoutline.org/", + "share-invite-instructions": "Ikut arahan undangan kami pada GitHub:", + "share-invite-trouble": "Sedang menghadapi masalah mengakses pautan undangan?", + "share-title": "Kongsi akses", + "survey-data-limits-title": "Bantu kami memahami cara meningkatkan had data", + "survey-decline": "Tolak", + "survey-disclaimer": "Dengan mengklik teruskan, anda akan dihantar ke tinjauan ringkas pada Google Forms. Kami mengesyorkan supaya anda mengambil tinjauan ini sewaktu bersambung ke Outline.", + "survey-go-to-survey": "Pergi ke tinjauan", + "terms-of-service": "Saya sudah baca dan memahami {openLink}Syarat Perkhidmatan Outline{closeLink}" +} diff --git a/server_manager/messages/my.json b/server_manager/messages/my.json new file mode 100644 index 0000000000..bd881a7464 --- /dev/null +++ b/server_manager/messages/my.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline သည် သတင်းအဖွဲ့အစည်းများနှင့် ဂျာနယ်လစ်များအတွက် အင်တာနက်အသုံးပြုရာတွင် ပိုမိုဘေးကင်းသောနည်းလမ်းကို ပေးရန် Jigsaw က ပြုလုပ်ထားသော အခမဲ့ရင်းမြစ် စီမံကိန်းတစ်ခု ဖြစ်သည်။

Outline ကို Shadowsocks က ပံ့ပိုးထားပြီး ထုတ်ကုန်၏ ကနဦးအဆင့်တွင် ရှိပါသေးသည်။ GitHub တွင် ကုဒ်ကို ပါဝင်ပံ့ပိုးနိုင်ပြီး နောက်ထပ်စနစ်များသို့ ချဲ့သည့်အခါနှင့် ဝန်ဆောင်မှုအသစ်များ ထည့်သည့်အခါ သိနိုင်ရန် Reddit နှင့် Medium တွင် ကျွန်ုပ်တို့ကို လိုက်ကြည့်နိုင်သည်။", + "about-version": "ဗားရှင်း {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} ဖြစ်ရပ်များ စခရင်သို့ သွားပါ။", + "aws-lightsail-firewall-1": "Outline ဆော့ဖ်ဝဲလက်ခံလုပ်ဆောင်လိုသည့် ဖြစ်စဉ်ကို နှိပ်ပါ။", + "aws-lightsail-firewall-2": "‘ကွန်ရက်ချိတ်ဆက်ခြင်း’ တဘ်သို့ သွားပါ။", + "aws-lightsail-firewall-3": "‘Firewall’ အပိုင်းတွင် ‘နောက်တစ်ခုထည့်ရန်’ ကို နှိပ်ပါ။", + "aws-lightsail-firewall-4": "‘အပလီကေးရှင်း’ တန်ဖိုးကို TCP+UDP အားလုံး’ သို့ သတ်မှတ်ပါ။", + "aws-lightsail-firewall-5": "'သိမ်းရန်' ကိုနှိပ်ပါ။", + "cancel": "မလုပ်တော့", + "close": "ပိတ်ရန်", + "confirmation-server-destroy": "လက်ရှိသုံးနေသူများ အသုံးပြုခွင့် ဆုံးရှုံးပါမည်။ ဤလုပ်ဆောင်ချက်ကို ပြန်ပြင်၍ မရပါ။", + "confirmation-server-destroy-title": "ဆာဗာကို ဖျက်မလား။", + "confirmation-server-remove": "ဤလုပ်ဆောင်ချက်သည် ‘Outline မန်နေဂျာ’ မှနေ၍ သင့်ဆာဗာကို ဖယ်ရှားမည်ဖြစ်သော်လည်း အသုံးပြုသူများသို့ ပရောက်စီသုံးခွင့်ကို မပိတ်ဆို့ပါ။ သင့်ဆာဗာပင်ရင်းစက်မှ Outline ဆာဗာကို ကိုယ်တိုင်ဖျက်ရန် လိုအပ်ပါဦးမည်။", + "confirmation-server-remove-title": "ဆာဗာကို ဖယ်ရှားမလား။", + "data-limit": "ဒေတာကန့်သတ်ချက်", + "data-limit-per-key": "ကီးတစ်ခုလျှင် ဒေတာကန့်သတ်ချက်", + "data-limits": "ဒေတာကန့်သတ်ချက်များ", + "data-limits-description": "ဤဆာဗာရှိ အသုံးပြုခွင့်ကီးများအတွက်ရက် ၃၀ ကြာ ဒေတာလွှဲပြောင်းမှု ကန့်သတ်ချက် သတ်မှတ်ပါ။", + "data-limits-dialog-text": "ဤဆာဗာရှိ အသုံးပြုခွင့်ကီးများအတွက် ရက်စွဲနှင့် ဒေတာလွှဲပြောင်းမှု ကန့်သတ်ချက် သတ်မှတ်ရန် ‘ဆက်တင်များ’ တဘ်သို့ သွားပါ။", + "data-limits-dialog-title": "ဒေတာဟောင်းများ မထည့်ပါနှင့်", + "data-limits-disclaimer": "လက်ရှိတွင် မက်ထရစ်များကို သတင်းပို့နေသည့်အတွက် ဒေတာကန့်သတ်ချက်များ ဝန်ဆောင်မှု အသုံးပြုခြင်း ပါဝင်သွားပါမည်။ နောက်ထပ်အသေးစိတ်အတွက် {openLink}ဒေတာစုဆောင်းမှု မူဝါဒ{closeLink} ကို ကြည့်ပါ။", + "data-limits-usage": "{total} အနက် {used} ကို သုံးထားသည်", + "destroy": "ဖျက်ရန်", + "digitalocean-disconnect-account": "DigitalOcean အကောင့်ကို ချိတ်ဆက်မှုဖြုတ်ခြင်း", + "digitalocean-unreachable": "ဤအမှားသည် သင့်ကွန်ရက်ပေါ်ရှိ firewall သို့မဟုတ် digitalocean.com နှင့် ယာယီချိတ်ဆက်မှု ပြဿနာများကြောင့် ဖြစ်နိုင်သည်။", + "disabled": "ပိတ်ထားသည်", + "disconnect": "ချိတ်ဆက်မှု ဖြုတ်ရန်", + "done": "ပြီးပြီ", + "enabled": "ဖွင့်ထားသည်", + "error-connectivity": "သင်၏ DigitalOcean အကောင့်နှင့် ချိတ်ဆက်ရာတွင် ပြဿနာရှိနေသည်။ ၎င်းသည် တစ်ခါတစ်ရံ DigitalOcean (သို့) သင့်အင်တာနက် ချိတ်ဆက်မှုနှင့် ယာယီပြဿနာကြောင့် ဖြစ်သည်။ ထပ်စမ်းကြည့်၍ မရပါက DigitalOcean သို့ ထပ်မံအကောင့်ဝင်ခြင်းက ပြဿနာကို ဖြေရှင်းနိုင်သည်။", + "error-connectivity-title": "ချိတ်ဆက်မှု ပြဿနာ", + "error-do-account-info": "DigitalOcean အကောင့်အချက်အလက်ကို မရယူနိုင်ပါ", + "error-do-auth": "DigitalOcean ဖြင့် အထောက်အထားစိစစ်၍ မရပါ", + "error-do-limit": "သင်၏ DigitalOcean အကောင့်သည် Droplet ကန့်သတ်ချက် {num} ခု ပြည့်သွားပါပြီ။ https://cloud.digitalocean.com/account/team/droplet_limit_increase တွင် ထပ်တိုးတောင်းဆိုနိုင်သည်", + "error-do-regions": "အသုံးပြုနိုင်သောဒေသများ စာရင်းကို မရယူနိုင်ပါ", + "error-do-warning": "DigitalOcean သတိပေးချက်- \"{message}\"", + "error-feedback": "အကြံပြုချက် ပို့၍မရပါ။ ထပ်စမ်းကြည့်ပါ။", + "error-gcp-auth": "Google Cloud Platform ဖြင့် အထောက်အထားစိစစ်ခြင်း မအောင်မြင်ပါ", + "error-hostname-invalid": "IP လိပ်စာ သို့မဟုတ် မှန်ကန်သော ဆာဗာအမည် ဖြစ်ရမည်။", + "error-key-add": "ကီးထည့်၍ မရပါ", + "error-key-remove": "ကီးကို ဖယ်ရှား၍မရပါ", + "error-key-rename": "ကီးကို အမည်ပြောင်း၍ မရပါ", + "error-keys-get": "ကီးများကို ဖွင့်၍မရပါ", + "error-keys-port-bad-input": "ပို့တ်သည် ၁ နှင့် ၆၅,၅၃၅ အကြား ကိန်းပြည့်ဖြစ်ရမည်။", + "error-keys-port-in-use": "ပို့တ်ကို ဆာဗာတွင်သုံးပြီး ဖြစ်သည်။", + "error-licenses": "လိုင်စင်များကို ဖွင့်၍မရပါ။", + "error-metrics": "မက်ထရစ်များဖွင့်ရန် သတ်မှတ်ရာတွင် အမှားဖြစ်သွားသည်", + "error-network": "ကွန်ရက်အမှား ဖြစ်သွားသည်။", + "error-not-saved": "သိမ်းမထားပါ", + "error-remove-data-limit": "မူရင်း ဒေတာကန့်သတ်ချက်ကို ပိတ်၍မရပါ", + "error-remove-per-key-limit": "ဤအသုံးပြုခွင့်ကီးမှ ဒေတာကန့်သတ်ချက်ကို ဖယ်ရှား၍မရပါ", + "error-server-creation": "သင့် Outline ဆာဗာကို ပြုလုပ်ရာတွင် အမှားဖြစ်သွားသည်။", + "error-server-destroy": "ဆာဗာကို ဖျက်၍မရပါ", + "error-server-removed": "{serverName} သည် သင်၏ DigitalOcean အကောင့်တွင် မရှိတော့ပါ။", + "error-server-rename": "ဆာဗာအမည်ပြောင်း၍ မရပါ", + "error-server-unreachable": "သင်၏ ‘Outline ဆာဗာ’ ကို မှန်ကန်စွာ ထည့်သွင်းထားသော်လည်း ၎င်းကို ချိတ်ဆက်၍မရပါ။ အများအားဖြင့် သင့်ဆာဗာ၏ firewall စည်းမျဉ်းများက အဝင်ချိတ်ဆက်မှုများကို ပိတ်ထားခြင်းကြောင့် ဖြစ်နိုင်သည်။ ၎င်းတို့ကို ပြန်စစ်ကြည့်ပြီး ပို့တ် 1024 မှ 65535 အထိ အပိုင်းအခြားရှိသော အဝင် TCP ချိတ်ဆက်မှုများကို ခွင့်ပြုထားကြောင်း သေချာပါစေ။", + "error-server-unreachable-title": "သင့် ‘Outline ဆာဗာ’ သို့ ချိတ်ဆက်၍မရပါ", + "error-servers-removed": "{serverNames} သည် သင်၏ DigitalOcean အကောင့်တွင် မရှိတော့ပါ။", + "error-set-data-limit": "မူရင်း ဒေတာကန့်သတ်ချက်ကို သတ်မှတ်၍မရပါ", + "error-set-per-key-limit": "ဤအသုံးပြုခွင့်ကီးအတွက် ဒေတာကန့်သတ်ချက်ကို သတ်မှတ်၍မရပါ", + "error-unexpected": "မျှော်လင့်မထားသော အမှား ဖြစ်သွားသည်။", + "experimental": "စမ်းသပ်ဆဲဖြစ်သည်", + "experiments": "စမ်းသပ်မှုများ", + "experiments-description": "ဝန်ဆောင်မှုအသစ်များကို စမ်းသုံးကြည့်ပြီး ၎င်းတို့ကို မဖြန့်ချိမီ ကျွန်ုပ်တို့အား အကြံပြုချက်ပေးပါ။", + "experiments-disclaimer": "စမ်းသပ်မှုများကို ဆောင်ရွက်နေဆဲဖြစ်ပြီး ပြောင်းလဲနိုင်သည် (သို့) အက်ပ်မှ ဖယ်ရှားနိုင်သည်။ သင်သည် လက်ရှိတွင် မက်ထရစ်များကို သတင်းပို့နေပါက စမ်းသပ်ဝန်ဆောင်မှုများ အသုံးပြုခြင်း ပါဝင်သွားပါမည်။ နောက်ထပ်အသေးစိတ်အတွက် {openLink}ဒေတာစုဆောင်းမှု မူဝါဒ{closeLink} ကို ကြည့်ပါ။", + "experiments-feedback": "အကြံပြုချက်များ ရှိသလား။ {openLink}ဤနေရာတွင် အကြံပြုချက်ကို ပို့ပါ။{closeLink}", + "feedback-cloud-provider": "Cloud ဝန်ဆောင်မှုပေးသူ ရွေးရန်", + "feedback-cloud-provider-error": "Cloud ဝန်ဆောင်မှုပေးသူ ရွေးပါ။", + "feedback-connection": "ကျွန်ုပ်၏ဆာဗာသို့ ချိတ်ဆက်၍မရပါ", + "feedback-connection-others": "အခြားသူများက ကျွန်ုပ်၏ဆာဗာသို့ ချိတ်ဆက်၍မရပါ", + "feedback-disclaimer": "ကျွန်ုပ်တို့၏အဖွဲ့သည် အကြံပြုချက်ကို အင်္ဂလိပ်ဘာသာဖြင့်သာ ဖြေဆိုနိုင်ပါသည်။", + "feedback-email": "အီးမေးလ်လိပ်စာ (ချန်လှပ်ထားနိုင်သည်)", + "feedback-error": "အကြံပြုချက် ထည့်ပါ။", + "feedback-explanation-install": "သင့်ဆာဗာတွင် Outline ထည့်သွင်းရန် ကြိုးပမ်းစဉ် အမှားဖြစ်သွားသည်။ ဖြေရှင်းနည်းရှာဖွေ၍ မရပါက သင့်အီးမေးလ်လိပ်စာ (ချန်လှပ်နိုင်သည်) ထည့်၍ ကျွန်ုပ်တို့ထံ အကြံပြုချက်ပို့ခြင်းဖြင့် သင့်ထံသို့ ပြန်ဆက်သွယ်နိုင်ပါမည်။", + "feedback-general": "အထွေထွေ အကြံပြုချက်", + "feedback-install": "Outline ထည့်သွင်းရာတွင် ပြဿနာရှိနေသည်", + "feedback-label": "သင့်အကြံပြုချက်", + "feedback-management": "ကျွန်ုပ်၏ဆာဗာကို စီမံရာတွင် အခက်အခဲရှိနေသည်", + "feedback-other": "အခြား", + "feedback-privacy": "သင့်အကြံပြုချက်၊ အီးမေးလ်လိပ်စာ (ပေးထားပါက) နှင့် {openLink}ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒ{closeLink} တွင် ရည်ညွှန်းထားသော နောက်ထပ်အချက်အလက်များကို Outline အဖွဲ့သို့ ပို့ပါမည်။", + "feedback-submit": "ပို့ရန်", + "feedback-suggestion": "အကြံပြုချက်များ", + "feedback-title-generic": "အကြံပြုချက် ပို့ရန်", + "feedback-title-install": "Outline ဆာဗာ ထည့်သွင်း၍မရပါ", + "gcp-billing-action": "ရှေ့သို့", + "gcp-billing-body": "{openLink}Google Cloud တွင် ငွေတောင်းခံအကောင့် ထည့်ရန်{closeLink} သင့်အား စောင့်ဆိုင်းနေသည်", + "gcp-billing-description": "ရှေ့ဆက်ရန် {openLink}Cloud Console ငွေတောင်းခံခြင်းစာမျက်နှာကို ဖွင့်ပြီး{closeLink} အကောင့်ထည့်ပါ။", + "gcp-billing-error": "ငွေတောင်းခံမှု အချက်အလက်များကို မရယူနိုင်ပါ", + "gcp-billing-error-zero": "ရှေ့မဆက်မီ ငွေတောင်းခံအကောင့် ထည့်ရပါမည်။", + "gcp-click-create": "‘ပြုလုပ်ရန်’ ကိုနှိပ်ပါ။", + "gcp-create-new-project": "{openLink}‘Google Cloud စီမံကိန်း’ အသစ်တစ်ခု ပြုလုပ်ပါ{closeLink}။", + "gcp-create-new-vm": "{openLink}VM ဖြစ်ရပ်အသစ် ပြုလုပ်ပါ{closeLink}။", + "gcp-create-project": "‘Google Cloud စီမံကိန်း’ ပြုလုပ်ခြင်း", + "gcp-create-server": "သင့် ‘Google Cloud စီမံကိန်း’ ပြုလုပ်ခြင်း", + "gcp-create-vm": "VM ဖြစ်စဉ်တစ်ခု ပြုလုပ်ခြင်း", + "gcp-disconnect-account": "Google Cloud Platform အကောင့်ကို ချိတ်ဆက်မှုဖြုတ်ပါ", + "gcp-firewall-create-0": "သင်၏ Compute Engine စီမံကိန်းတွင် {openLink}firewall စည်းမျဉ်းအသစ် ထည့်ပါ{closeLink}။", + "gcp-firewall-create-1": "‘အမည်’ အကွက်တွင် ‘outline’ ကို ထည့်ပါ။", + "gcp-firewall-create-2": "‘ပြစ်မှတ်တဂ်များ’ အကွက်တွင် ‘outline’ ကို ထည့်ပါ။", + "gcp-firewall-create-3": "‘ရင်းမြစ် IP အပိုင်းအခြားများ’ အကွက်တွင် ‘0.0.0.0/0’ ကို ထည့်ပါ။", + "gcp-firewall-create-4": "‘ပရိုတိုကောနှင့် ပို့တ်များ’ အောက်တွင် ‘အားလုံးခွင့်ပြုရန်’ ကိုရွေးပါ။", + "gcp-name-your-project": "‘စီမံကိန်း အမည်’ အကွက်တွင် သင့်စီမံကိန်းကို အမည်ပေးပါ။", + "gcp-project-setup-error": "သင်၏ Google Cloud ပရောဂျက်ကို စနစ်ထည့်သွင်းနေစဉ် အမှားဖြစ်သွားသည်", + "gcp-select-machine-type": "‘စက်အမျိုးအစား’ အောက်တွင် ‘f1-micro’ ကို ရွေးပါ", + "gcp-select-networking": "‘စီမံခန့်ခွဲမှု၊ လုံခြုံရေး၊ ဒစ်ခ်များ၊ ကွန်ရက်ချိတ်ဆက်ခြင်း၊ အငှားကာလတစ်ခုတည်း’ ပြီးနောက် ‘ကွန်ရက်ချိတ်ဆက်ခြင်း’ ကို နှိပ်ပါ", + "gcp-select-region": "‘ဒေသ’ အောက်တွင် ဆာဗာအသုံးပြုသူများနှင့် နီးသော ဒေသကို ရွေးပါ။", + "gcp-type-network-tag": "‘ကွန်ရက်တဂ်များ’ အကွက်တွင် ‘outline’ ကို ထည့်ပါ။", + "gcp-type-outline-server": "‘အမည်’ အကွက်တွင် ‘outline ဆာဗာ’ ကို ထည့်ပါ။", + "geo-amsterdam": "အမ်စတာဒမ်", + "geo-bangalore": "ဘန်ဂလို", + "geo-changhua-county": "ချိန်ဟွာကောင်တီ", + "geo-delhi": "ဒေလီ", + "geo-eemshaven": "အင်းမ်ရှေးဗန်", + "geo-frankfurt": "ဖရန့်ဖို့", + "geo-hamina": "ဟမ်းမနား", + "geo-hk": "ဟောင်ကောင်", + "geo-iowa": "အိုင်အိုဝါ", + "geo-jakarta": "ဂျာကာတာ", + "geo-jurong-west": "အနောက်ဂျူရုန်း", + "geo-las-vegas": "လာစ်ဗေးဂက်စ်", + "geo-london": "လန်ဒန်", + "geo-los-angeles": "လော့စ်အိန်ဂျလိစ်", + "geo-melbourne": "မဲလ်ဘုန်း", + "geo-montreal": "မွန်ထရီလ်", + "geo-mumbai": "မွမ်ဘိုင်း", + "geo-new-york-city": "နယူးယောက်", + "geo-northern-virginia": "မြောက်ဗာဂျီးနီးယား", + "geo-oregon": "အော်ရီဂွန်", + "geo-osaka": "အိုဆာကာ", + "geo-salt-lake-city": "ဆော့လိပ်က်စီးတီး", + "geo-san-francisco": "ဆန်ဖရန်စစ္စကို", + "geo-sao-paulo": "စုံပေါင်လို", + "geo-seoul": "ဆိုးလ်", + "geo-sg": "စင်ကာပူ", + "geo-south-carolina": "တောင်ကာရိုလိုင်းနား", + "geo-st-ghislain": "စိန့်ရီးစ်လန်", + "geo-sydney": "ဆစ်ဒနီ", + "geo-tokyo": "တိုကျို", + "geo-toronto": "တိုရွန်တို", + "geo-warsaw": "ဝါဆော", + "geo-zurich": "ဇူးရစ်ခ်", + "key": "ကီး {keyId}", + "manual-server-assign-firewall": "Firewall စည်းမျဉ်း သတ်မှတ်ပါ", + "manual-server-assign-group": "‘လုံခြုံရေးအုပ်စု’ သတ်မှတ်ခြင်း", + "manual-server-create-firewall": "Firewall စည်းမျဉ်း ပြုလုပ်ပါ", + "manual-server-create-group": "‘လုံခြုံရေးအုပ်စု’ တစ်ခု ပြုလုပ်ပါ", + "manual-server-description": "ဤအဆင့်များက {cloudProvider} Linux ဆာဗာတွင် Outline ထည့်သွင်းရန် သင့်ကို ကူညီပါမည်။", + "manual-server-firewall": "သင့် firewall ကို စီစဉ်သတ်မှတ်ခြင်း", + "manual-server-install-paste": "သင့်ထည့်သွင်းမှုမှ ထွက်လာသည့်အရာကို ဤနေရာတွင်ကူးထည့်ပါ။", + "manual-server-install-run": "သင့်ဆာဗာသို့ ဝင်ရောက်ပြီး ဤကွန်မန်းကို လုပ်ဆောင်ပါ။", + "manual-server-instructions": "ညွှန်ကြားချက်များ", + "manual-server-show-me": "နေရာကို ပြရန်", + "manual-server-title": "အောက်ရှိ ညွှန်ကြားချက်များအတိုင်း လုပ်ဆောင်ပါ", + "metrics-description": "သင်နှင့် သင့်ဆာဗာကို မျှဝေသုံးသူတို့အတွက် Outline ၏ စိတ်ချရမှုနှင့် စွမ်းဆောင်ရည် ပိုကောင်းအောင်ကူညီရန် အမည်မသိအောင်ပြုလုပ်ထားသော မက်ထရစ်များကို မျှဝေပါ။ {openLink}ပိုမိုလေ့လာရန်။{closeLink}", + "metrics-share": "မက်ထရစ်များ မျှဝေရန်", + "metrics-skip": "ကျော်ရန်", + "metrics-title": "မက်ထရစ်များ မျှဝေခြင်း", + "nav-about": "အကြောင်း", + "nav-data-collection": "ဒေတာစုဆောင်းခြင်း", + "nav-feedback": "အကြံပြုချက်", + "nav-help": "အကူအညီ", + "nav-licenses": "လိုင်စင်များ", + "nav-privacy": "ကိုယ်ရေးအချက်အလက်လုံခြုံမှု", + "nav-terms": "စည်းမျဉ်းများ", + "no-data-limit": "မရှိ", + "notification-app-update": "‘Outline မန်နေဂျာ’ ၏ အပ်ဒိတ်လုပ်ထားသော ဗားရှင်းကို ဒေါင်းလုဒ်လုပ်လိုက်သည်။ အပလီကေးရှင်းကို ပြန်စသည့်အခါ ၎င်းကို ထည့်သွင်းပါမည်။", + "notification-feedback-thanks": "ပိုမိုကောင်းမွန်အောင် ကူညီသည့်အတွက် ကျေးဇူးတင်ပါသည်။ သင့်ထံမှ ကြားသိလိုပါသည်။", + "notification-key-added": "ကီးထည့်လိုက်သည်", + "notification-key-removed": "ကီးကို ဖယ်ရှားလိုက်သည်", + "notification-server-destroyed": "ဆာဗာကို ဖျက်ပြီးပြီ", + "notification-server-exists": "ဆာဗာကို ထည့်ပြီးဖြစ်သည်", + "notification-server-removed": "ဆာဗာကို ဖယ်ရှားပြီးပြီ", + "oauth-account-active": "သင်၏ DigitalOcean အကောင့်ကို စတင်လိုက်သည်။", + "oauth-account-active-tag": "အကောင့် စတင်လိုက်ပါပြီ။ ဆာဗာတည်နေရာများ ဖွင့်နေသည်...", + "oauth-activate-account": "သင်၏ DigitalOcean အကောင့်ကို စတင်ပါ။", + "oauth-billing": "သင့်ငွေတောင်းခံမှု အချက်အလက်များကို digitalocean.com တွင် ထည့်သွင်းပြီးသည့်အခါ အက်ပ်သို့ ပြန်သွားပါ။", + "oauth-billing-tag": "ငွေတောင်းခံမှု အချက်အလက်များ ထည့်ပါ...", + "oauth-connect-description": "သင့်အကောင့်သုံးခြင်းဖြင့် Outline က ဆာဗာပြုလုပ်ခြင်းနှင့် ချိတ်ဆက်ခြင်းကို လွယ်ကူစေပါသည်။", + "oauth-connect-tag": "သင့်အကောင့်နှင့် ချိတ်ဆက်ရန် စောင့်ဆိုင်းနေသည်...", + "oauth-connect-title": "လက်မှတ်ထိုးဝင်ပါ (သို့) DigitalOcean ဖြင့် အကောင့်ဖွင့်ပါ။", + "oauth-sign-out": "ထွက်ရန်", + "oauth-verify": "သင့်ဝင်စာတွင် DigitalOcean မှ အီးမေးလ်ကို ရှာပါ၊ သင့်အကောင့်ကို အတည်ပြုရန် ၎င်းတွင်ပါသော လင့်ခ်ကိုနှိပ်ပါ။", + "oauth-verify-tag": "သင့်အီးမေးလ်ကို အတည်ပြုရန်...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "စိတ်ကြိုက် ဒေတာကန့်သတ်ချက် သတ်မှတ်ရန်", + "per-key-data-limit-dialog-title": "ဒေတာကန့်သတ်ချက် - {keyName}", + "region-best-value": "အကောင်းဆုံးတန်ဖိုး", + "region-description": "၎င်းက သင့်အင်တာနက်အသုံးပြုမှု ရရှိသည့်နေရာ ဖြစ်သည်။", + "region-setup": "Outline ကို စနစ်ထည့်သွင်းရန်", + "region-title": "သင့်ဆာဗာ၏ တည်နေရာကို ရွေးပါ။", + "remove": "ဖယ်ရှားရန်", + "retry": "ထပ်စမ်းကြည့်ရန်", + "save": "သိမ်းရန်", + "saved": "သိမ်းပြီးပြီ", + "saving": "သိမ်းနေသည်…", + "server-access": "ဆာဗာသုံးခွင့်", + "server-access-key-new": "ကီးအသစ်ထည့်ရန်", + "server-access-key-rename": "အမည်ပြောင်းရန်", + "server-access-keys": "အသုံးပြုခွင့်ကီးများ", + "server-connections": "ချိတ်ဆက်မှုများ", + "server-data-transfer": "လွှဲပြောင်းထားသော ဒေတာ/ ပြီးခဲ့သော ရက် ၃၀", + "server-data-used": "သုံးထားသော ခွင့်ပြုပမာဏ / ပြီးခဲ့သော ရက် ၃၀", + "server-destroy": "ဆာဗာကို ဖျက်ရန်", + "server-help-access-key-description": "မိတ်ဆွေများနှင့် အသုံးပြုခွင့်ကီးများကို မျှဝေခြင်းဖြင့် ၎င်းတို့က သင်၏ Outline ဆာဗာကို ချိတ်ဆက်နိုင်ပါသည်။ ၎င်းတို့၏စက်ပစ္စည်းအားလုံးတွင် အသုံးပြုခွင့်ကီးတစ်ခုတည်းကို သုံးနိုင်သည်။", + "server-help-access-key-next": "ရှေ့သို့", + "server-help-access-key-title": "ကီးများ ပြုလုပ်ခြင်း၊ သုံးခွင့် မျှဝေခြင်း", + "server-help-connection-description": "သင်၏ Outline ဆာဗာသို့ သင့်ကိုယ်ပိုင်အသုံးပြုခွင့်ကီး သုံးပြီး Outline ကလိုင်းယင့်အက်ပ် ထည့်သွင်းရန် ဤနေရာကိုနှိပ်ပါ။", + "server-help-connection-ok": "ရပါပြီ။", + "server-help-connection-title": "သင့်ကို ချိတ်ဆက်မထားရသေးပါ။", + "server-keys": "ကီးများ", + "server-my-access-key": "ကျွန်ုပ်၏ အသုံးပြုခွင့်ကီး", + "server-name": "Outline ဆာဗာ {serverLocation}", + "server-remove": "ဆာဗာကို ဖယ်ရှားရန်", + "server-settings": "ဆက်တင်များ", + "server-unreachable": "ဆာဗာကို ချိတ်ဆက်၍မရပါ", + "server-unreachable-description": "ဤဆာဗာနှင့် ချိတ်ဆက်ရာတွင် ပြဿနာရှိနေသည်။", + "server-unreachable-managed-description": "ထပ်စမ်းကြည့်ပါ (သို့) ဤဆာဗာကို အပလီကေးရှင်းမှ ဖယ်ရှားပါ။", + "server-unreachable-manual-description": "ထပ်စမ်းကြည့်ပါ (သို့) ဤဆာဗာနှင့် ပကတိအသွင်ဆာဗာပင်ရင်းကို ဖျက်ပါ။", + "server-usage": "သုံးစွဲမှု (ပြီးခဲ့သော ရက် ၃၀)", + "servers-add": "ဆာဗာထည့်ရန်", + "servers-digitalocean": "DigitalOcean ဆာဗာများ", + "servers-gcp": "Google Cloud Platform ဆာဗာများ", + "servers-manual": "ဆာဗာများ", + "settings-access-key-port": "အသုံးပြုခွင့်ကီးအသစ်များ အတွက် ပို့တ်", + "settings-metrics-header": "အမည်ဖော်ပြမထားသော မက်ထရစ်များ မျှဝေခြင်း", + "settings-server-api-url": "စီမံခန့်ခွဲမှု API URL", + "settings-server-cost": "လစဉ် ကုန်ကျစရိတ်", + "settings-server-creation": "ပြုလုပ်ထားသည်", + "settings-server-hostname": "ဆာဗာအမည်", + "settings-server-id": "ဆာဗာ ID", + "settings-server-info": "ဆာဗာအချက်အလက်", + "settings-server-location": "ဆာဗာတည်နေရာ", + "settings-server-name": "အမည်", + "settings-server-rename": "သင့်ဆာဗာအတွက် အမည်အသစ် သတ်မှတ်ပါ။ ယင်းသို့ချိတ်ဆက်ရန် သင်ဖိတ်ကြားထားသော အသုံးပြုသူများ၏ စက်များပေါ် သက်ရောက်မည်မဟုတ်ပါ။", + "settings-server-version": "ဆာဗာဗားရှင်း", + "settings-transfer-limit": "ဒေတာလွှဲပြောင်းမှု ခွင့်ပြုပမာဏ", + "setup-action": "စနစ်ထည့်သွင်းရန်", + "setup-advanced": "အဆင့်မြင့်", + "setup-anywhere": "မည်သည့်နေရာမှမဆို Outline ကို စနစ်ထည့်သွင်းခြင်း", + "setup-cancel": "အချိန်မရွေး ပယ်ဖျက်နိုင်သည်", + "setup-create": "ဆာဗာပြုလုပ်ရန်", + "setup-description": "ဆာဗာ မရှိဘူးလား။ DigitalOcean ဖြင့် အကောင့်ဖွင့်ပါ။", + "setup-do-cost": "တစ်လလျှင် US$6 သာ", + "setup-do-create": "၁ TB ဒေတာလွှဲပြောင်းမှုအတွက် နောက်ထပ် ရက် ၃၀ လျှင် US$6 နှုန်းဖြင့် သင်၏ DigitalOcean အကောင့်သုံး၍ ဆာဗာအသစ်ပြုလုပ်ပါ။", + "setup-do-data": "၁ TB ဒေတာလွှဲပြောင်းမှု ခွင့်ပြုချက်", + "setup-do-description": "၎င်းက မိနစ်အနည်းငယ် ကြာနိုင်သည်။ ဤဆာဗာကို အချိန်မရွေး ဖျက်နိုင်သည်။", + "setup-do-easiest": "အလွယ်ကူဆုံး စနစ်ထည့်သွင်းမှု လုပ်ငန်းစဉ်", + "setup-do-title": "Outline ကို စနစ်ထည့်သွင်းခြင်း။", + "setup-firewall-instructions": "Firewall ညွှန်ကြားချက်များ", + "setup-gcp-create": "သင်၏ Google အကောင့်ဖြင့် ဆာဗာအသစ်ပြုလုပ်ပါ။ နေရာနှင့် အသုံးပြုမှုအလိုက် ဈေးနှုန်းများ ကွဲပြားနိုင်သည်။", + "setup-gcp-easy": "လွယ်ကူသော စနစ်ထည့်သွင်းမှု လုပ်ငန်းစဉ်", + "setup-gcp-free-tier": "{openLinkFreeTier}အခမဲ့အဆင့်{closeLink} ဖြင့် သင်၏ပထမဆုံးဆာဗာသည် {openLinkIpPrice}US$3/လ{closeLink} မှ စတင်ပါမည်", + "setup-gcp-free-trial": "အသုံးပြုသူအသစ်များအတွက် {openLinkFreeTrial}ရက် ၉၀ စာ အခမဲ့အစမ်း{closeLink}", + "setup-gcp-promo": "Google Cloud အတွက် အလိုအလျောက် Outline ဆာဗာပြုလုပ်မှု လုပ်ငန်းစဉ်အသစ်ကို စမ်းကြည့်ရန်", + "setup-recommended": "အကြံပြုထားသည်", + "setup-simple-commands": "ရိုးရှင်းသော ထည့်သွင်းမှုကွန်မန်းများ", + "setup-step-by-step": "တစ်ဆင့်ချင်းစီ စနစ်ထည့်သွင်းမှု လမ်းညွှန်", + "setup-tested": "VULTR၊ Linode နှင့် Liquid Web တို့တွင် စမ်းသပ်ပြီးပြီ", + "setup-title": "Outline စနစ်ထည့်သွင်းရန် cloud ဝန်ဆောင်မှုကို ရွေးပါ။", + "share-description": "ဤဖိတ်ကြားမှုကို မိတ္တူကူးပြီး သင်ယုံကြည်သော ဆက်သွယ်ရေးတူးလ်မှ ပို့ပါ။ {openLink}အကူအညီ လိုပါသလား။{closeLink}", + "share-invite-access-key-copied": "ဝင်ခွင့်ကီးကို ကလစ်ဘုတ်သို့ မိတ္တူကူးလိုက်ပါပြီ", + "share-invite-copied": "ဖိတ်ကြားချက်ကို ကလစ်ဘုတ်သို့ မိတ္တူကူးလိုက်ပါပြီ", + "share-invite-copy": "ဖိတ်ကြားချက်ကို မိတ္တူကူးရန်", + "share-invite-copy-access-key": "ဝင်ခွင့်ကီး မိတ္တူကူးရန်", + "share-invite-html": "ဤဆာဗာသုံး၍ လွတ်လပ်သော အင်တာနက်ကို လုံခြုံစွာဝင်ပါ-

၁) သင့်စက်အတွက် Outline အက်ပ်ကို ဒေါင်းလုဒ်လုပ်ပြီး ထည့်သွင်းပါ-

- iOS- https://itunes.apple.com/app/outline-app/id1356177741
- MacOS- https://itunes.apple.com/app/outline-app/id1356178125
- Windows- https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux- https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android- https://play.google.com/store/apps/details?id=org.outline.android.client
- Android အခြားလင့်ခ်- https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

၂) ss:// နှင့် စတင်သော ဝင်ခွင့်ကီးကို ရရှိပါမည်။ ၎င်းကို ရရှိပါက ဤဝင်ခွင့်ကီးကို မိတ္တူကူးပါ။

၃) Outline ကလိုင်းယင့်အက်ပ် ဖွင့်ပါ။ သင်၏ဝင်ခွင့်ကီးကို အလိုအလျောက်တွေ့ပါက \"ချိတ်ဆက်ရန်\" ကို တို့ပြီး ဆက်လုပ်ပါ။ သင်၏ဝင်ခွင့်ကီးကို အလိုအလျောက်မတွေ့ပါက ၎င်းကို အကွက်ထဲတွင် ကူးထည့်ပြီးနောက် \"ချိတ်ဆက်ရန်\" ကို တို့ပြီး ဆက်လုပ်ပါ။

သင်သည် လွတ်လပ်သော အင်တာနက်ကို သုံးရန် အသင့်ဖြစ်ပါပြီ။ ဆာဗာနှင့် ချိတ်ဆက်ပြီးကြောင်း သေချာစေရန် Google Search တွင် \"ကျွန်ုပ်၏ ip က ဘာလဲ\" ကို ရှာကြည့်ပါ။ Google တွင် ပြထားသော IP လိပ်စာသည် Outline ကလိုင်းယင့်ရှိ IP လိပ်စာနှင့် တူညီရပါမည်။

Outline အကြောင်း ဤနေရာတွင် ပိုမိုလေ့လာပါ- https://getoutline.org/", + "share-invite-instructions": "GitHub တွင် ကျွန်ုပ်တို့ ဖိတ်ကြားမှုလမ်းညွှန်ချက်များအတိုင်း လုပ်ဆောင်ပါ-", + "share-invite-trouble": "ဖိတ်ကြားမှုလင့်ခ်သို့ ဝင်ရာတွင် အခက်အခဲရှိနေသလား။", + "share-title": "အသုံးပြုခွင့်ကို မျှဝေခြင်း", + "survey-data-limits-title": "ဒေတာကန့်သတ်ချက်များ ပိုမိုကောင်းမွန်စေနည်းကို ကျွန်ုပ်တို့ နားလည်စေရန် ကူညီပါ", + "survey-decline": "ငြင်းပယ်ရန်", + "survey-disclaimer": "ရှေ့ဆက်ရန်ကိုနှိပ်ခြင်းဖြင့် Google Forms ရှိ စစ်တမ်းတိုသို့ သင့်ကို ပို့လိုက်ပါမည်။ Outline နှင့် ချိတ်ဆက်ထားစဉ် စစ်တမ်းကိုဖြေဆိုရန် အကြံပြုပါသည်။", + "survey-go-to-survey": "စစ်တမ်းသို့ သွားရန်", + "terms-of-service": "ကျွန်ုပ်သည် {openLink}Outline ဝန်ဆောင်မှု စည်းမျဉ်းများ{closeLink} ကို ဖတ်ရှုပြီး နားလည်ပါသည်" +} diff --git a/server_manager/messages/ne.json b/server_manager/messages/ne.json new file mode 100644 index 0000000000..88e0796ec6 --- /dev/null +++ b/server_manager/messages/ne.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline भनेको Jigsaw ले विकास गरेको खुला स्रोतको परियोजना हो। यसले समाचार सङ्गठन र पत्रकारहरूका निम्ति इन्टरनेट प्रयोग गर्ने सुरक्षित तरिका उपलब्ध गराउँछ।

Shadowsocks ले Outline सञ्चालन गर्छ र यो उत्पादन अझै विकासको क्रममा छ। तपाईं GitHub मा गई यसको कोडमा योगदान गर्न सक्नुहुन्छ। यसै गरी तपाईं हामीले हाम्रा सेवा अन्य प्लेटफर्महरूमा विस्तार गर्दा र नयाँ सुविधाहरू उपलब्ध गराउँदा सूचना प्राप्त गर्न चाहनुहुन्छ भने RedditMedium मा हामीलाई फलो गर्न सक्नुहुन्छ।", + "about-version": "संस्करण {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} का सत्रहरूको स्क्रिनमा जानुहोस्।", + "aws-lightsail-firewall-1": "तपाईं जुन सत्रमा Outline होस्ट गर्न चाहनुहुन्छ त्यो सत्रमा क्लिक गर्नुहोस्।", + "aws-lightsail-firewall-2": "'नेटवर्किङ' (Networking) ट्याबमा जानुहोस्।", + "aws-lightsail-firewall-3": "'फायरवाल' (Firewall) खण्डमा रहेको 'अर्को हाल्नुहोस्' (Add another) मा क्लिक गर्नुहोस्।", + "aws-lightsail-firewall-4": "'एप्लिकेसन' (Application) को मान 'सबै TCP+UDP' (All TCP+UDP) बनाउनुहोस्।", + "aws-lightsail-firewall-5": "'सेभ गर्नुहोस्' (Save) मा क्लिक गर्नुहोस्।", + "cancel": "रद्द गर्नुहोस्", + "close": "बन्द गर्नुहोस्", + "confirmation-server-destroy": "अहिलेका सबै प्रयोगकर्ताहरू यो सेवा गुमाउने छन्। यो कार्य अन्डू गर्न मिल्दैन।", + "confirmation-server-destroy-title": "सर्भर मेटाउने हो?", + "confirmation-server-remove": "तपाईंले यसो गर्नुभयो भने Outline म्यानेजरबाट तपाईंको सर्भर हट्छ तर प्रयोगकर्ताहरूको प्रोक्सी एक्सेस भने ब्लक हुँदैन। यसो गरेपछि पनि तपाईंले आफ्नो होस्ट मेसिनबाट उक्त Outline सर्भर म्यानुअ‌ल रूपमा मेटाउनु पर्ने हुन्छ।", + "confirmation-server-remove-title": "सर्भर हटाउने हो?", + "data-limit": "डेटाको सीमा", + "data-limit-per-key": "प्रति की डेटाको सीमा", + "data-limits": "डेटाका सीमा", + "data-limits-description": "यो सर्भरमा एक्सेस की प्रयोग गरी डेटा ट्रान्स्फर गर्न सकिने अवधिको सीमा ३० दिन तोक्नुहोस्।", + "data-limits-dialog-text": "यो सर्भरमा एक्सेस की प्रयोग गरी ट्रान्स्फर गर्न सकिने डेटाको सीमा तोक्न सेटिङ ट्याबमा जानुहोस्।", + "data-limits-dialog-title": "डेटाको सीमा ननाघ्नुहोस्", + "data-limits-disclaimer": "तपाईंले हाल मेट्रिकहरू रिपोर्ट गरिराख्नुभएकाले डेटाको सीमा तोक्ने सुविधाको प्रयोगसम्बन्धी तथ्याङ्क समावेश गरिने छ। यससम्बन्धी थप विवरणका लागि कृपया {openLink}डेटा सङ्क‌लनसम्बन्धी नीति{closeLink} हेर्नुहोस्।", + "data-limits-usage": "{total} मध्ये {used} प्रयोग भएको छ", + "destroy": "मेटाउनुहोस्", + "digitalocean-disconnect-account": "DigitalOcean खाता डिस्कनेक्ट गर्नुहोस्", + "digitalocean-unreachable": "तपाईंको नेटवर्कमा भएको फायरवाल वा digitalocean.com मा देखिएको कनेक्सनसम्बन्धी अस्थायी समस्याका कारण यसो भएको हुन सक्छ।", + "disabled": "अफ गरिएको", + "disconnect": "डिस्कनेक्ट गर्नुहोस्", + "done": "सम्पन्न भयो", + "enabled": "अन गरिएको", + "error-connectivity": "हामीले तपाईंको DigitalOcean खातामा कनेक्ट गर्न सकिरहेका छैनौँ। DigitalOcean मा वा तपाईंको इन्टरनेट कनेक्सनमा कहिलेकाहीँ कुनै अस्थायी समस्या आउँदा यस्तो हुन्छ। पछि फेरि प्रयास गर्दा पनि यो समस्या देखियो भने DigitalOcean मा फेरि लग इन गर्दा उक्त समस्या समाधान हुन्छ।", + "error-connectivity-title": "कनेक्सनसम्बन्धी समस्या आयो", + "error-do-account-info": "DigitalOcean खातासम्बन्धी जानकारी प्राप्त गर्न सकिएन", + "error-do-auth": "DigitalOcean खातामा लग इन गर्न सकिएन", + "error-do-limit": "तपाईंको DigitalOcean खातामा प्रयोग गर्न मिल्ने जति अर्थात् {num} वटा ड्रप‌लेट प्रयोग गरिसकिएको छ। तपाईं https://cloud.digitalocean.com/account/team/droplet_limit_increase मा गई ड्रपलेटको सीमा बढाइदिन अनुरोध गर्न सक्नुहुन्छ", + "error-do-regions": "उपलब्ध क्षेत्रहरूको सूची प्राप्त गर्न सकिएन", + "error-do-warning": "DigitalOcean को चेतावनी: \"{message}\"", + "error-feedback": "प्रतिक्रिया पेस गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्।", + "error-gcp-auth": "Google Cloud Platform खातामा लग इन गर्न सकिएन", + "error-hostname-invalid": "यो अनिवार्य रूपमा कुनै IP एड्रेस वा वैध होस्टनेम हुनु पर्छ।", + "error-key-add": "की हाल्न सकिएन", + "error-key-remove": "की हटाउन सकिएन", + "error-key-rename": "कीको नाम बदल्न सकिएन", + "error-keys-get": "कीहरू लोड गर्न सकिएन", + "error-keys-port-bad-input": "पोर्टका ठाउँमा 1 र 65,535 का बिचको पूर्ण अङ्क हाल्नु पर्छ।", + "error-keys-port-in-use": "सर्भरमा यो पोर्ट पहिल्यैदेखि प्रयोग गरिँदै छ।", + "error-licenses": "लाइसेन्सहरू लोड गर्न सकिएन।", + "error-metrics": "मेट्रिक रिपोर्ट गर्ने सुविधा अन गर्ने क्रममा त्रुटि भयो", + "error-network": "नेटवर्कसम्बन्धी कुनै त्रुटि भयो।", + "error-not-saved": "सेभ गर्न सकिएन", + "error-remove-data-limit": "डेटाको डिफल्ट सीमा अफ गर्न सकिएन", + "error-remove-per-key-limit": "यो एक्सेस कीबाट डेटाको सीमा हटाउन सकिएन", + "error-server-creation": "तपाईंको Outline सर्भर बनाउने क्रममा कुनै त्रुटि भयो।", + "error-server-destroy": "सर्भर मेटाउन सकिएन", + "error-server-removed": "तपाईंको DigitalOcean खातामा अब {serverName} छैन।", + "error-server-rename": "सर्भरको नाम बदल्न सकिएन", + "error-server-unreachable": "तपाईंको Outline सर्भर सही तरिकाले इन्स्टल गरिएको छ तर हामीले उक्त सर्भरमा कनेक्ट गर्न सकेनौँ। तपाईंको सर्भरका फायरवालसम्बन्धी नियमले सर्भरमा आउने कनेक्सनहरू ब्लक गरिरहेका हुनाले यसो भएको हुन सक्ने प्रबल सम्भावना छ। कृपया ती नियमहरूको समीक्षा गर्नुहोस् र सर्भरका 1024 देखि 65535 सम्मका पोर्टहरूमा आउने TCP कनेक्सनहरूलाई अनुमति दिनुहोस्।", + "error-server-unreachable-title": "तपाईंको Outline सर्भरमा कनेक्ट गर्न सकिएन", + "error-servers-removed": "तपाईंको DigitalOcean खातामा अब {serverNames} छैन।", + "error-set-data-limit": "डेटाको डिफल्ट सीमा तोक्न सकिएन", + "error-set-per-key-limit": "यो एक्सेस कीका हकमा डेटाको सीमा तोक्न सकिएन", + "error-unexpected": "कुनै अनपेक्षित त्रुटि भयो।", + "experimental": "परीक्षणका क्रममा रहेको", + "experiments": "परीक्षणहरू", + "experiments-description": "नयाँ सुविधाहरू रिलिज गरिनुअघि नै ती सुविधा चलाएर हेर्नुहोस् र हामीलाई आफ्नो प्रतिक्रिया दिनुहोस्।", + "experiments-disclaimer": "परीक्षणहरू भनेका विकासको क्रममा रहेका सुविधाहरू हुन् र यस्ता सुविधा परिवर्तन गरिन वा एपबाट हटाइन सक्छन्। तपाईं हाल मेट्रिकहरू प्रयोग गर्दै हुनुहुन्छ भने त्यसमा परीक्षणका क्रममा रहेका सुविधाको प्रयोगसम्बन्धी तथ्याङ्क समावेश गरिने छ। यससम्बन्धी थप विवरणका लागि कृपया {openLink}डेटा सङ्क‌लनसम्बन्धी नीति{closeLink} हेर्नुहोस्।", + "experiments-feedback": "सुझावहरू छन्? {openLink}यहाँ प्रतिक्रिया पेस गर्नुहोस्।{closeLink}", + "feedback-cloud-provider": "क्लाउड प्रदायक चयन गर्नुहोस्", + "feedback-cloud-provider-error": "कृपया कुनै क्लाउड प्रदायक चयन गर्नुहोस्।", + "feedback-connection": "मेरो सर्भरमा कनेक्ट गर्न सकिनँ", + "feedback-connection-others": "अरूले मेरो सर्भरमा कनेक्ट गर्न सक्दैनन्", + "feedback-disclaimer": "हाम्रो टोलीले अङ्ग्रेजी भाषाका प्रतिक्रियाको मात्र जवाफ दिन सक्छ भन्ने कुरा ख्याल गर्नुहोला।", + "feedback-email": "इमेल ठेगाना (ऐच्छिक)", + "feedback-error": "कृपया प्रतिक्रिया लेख्नुहोस्।", + "feedback-explanation-install": "तपाईंको सर्भरमा Outline इन्स्टल गर्न खोज्ने क्रममा कुनै त्रुटि भयो। तपाईंले यो समस्याको समाधान पत्ता लगाउन सक्नुभएको छैन भने कृपया हामीलाई प्रतिक्रिया पठाउनुहोस् र त्यसमा आफ्नो इमेल‌ ठेगाना उल्लेख गर्नुहोस् (ऐच्छिक)। तपाईंले इमेल ठेगाना उपलब्ध गराउनुभयो भने हामी तपाईंलाई सम्पर्क गर्न सक्छौँ।", + "feedback-general": "सामान्य प्रतिक्रिया", + "feedback-install": "Outline इन्स्टल गर्न मुस्किल भइरहेको छ", + "feedback-label": "तपाईंको प्रतिक्रिया", + "feedback-management": "मेरो सर्भरको व्यवस्थापन गर्न मुस्किल भइरहेको छ", + "feedback-other": "अन्य", + "feedback-privacy": "तपाईंको प्रतिक्रिया, इमेल ठेगाना (उपलब्ध गराउनुभएको खण्डमा) र {openLink}गोपनीयता नीति{closeLink}मा उल्लेख गरिएका थप जानकारी Outline टोलीलाई पठाइने छ।", + "feedback-submit": "पेस गर्नुहोस्", + "feedback-suggestion": "सुझावहरू", + "feedback-title-generic": "प्रतिक्रिया दिनुहोस्", + "feedback-title-install": "Outline सर्भर इन्स्टल गर्न सकिएन", + "gcp-billing-action": "अर्को", + "gcp-billing-body": "{openLink}Google क्लाउडमा कुनै बिलिङ खाता हाल्नुहोस्{closeLink}", + "gcp-billing-description": "तपाईं अघि बढ्न चाहनुहुन्छ भने {openLink}क्लाउड कन्सोलको बिलिङ पेज{closeLink}मा जानुहोस् र कुनै खाता हाल्नुहोस्।", + "gcp-billing-error": "बिलिङसम्बन्धी जानकारी प्राप्त गर्न सकिएन", + "gcp-billing-error-zero": "अघि बढ्नुअघि तपाईंले अनिवार्य रूपमा बिलिङ खाता हाल्नु पर्छ।", + "gcp-click-create": "'सिर्जना गर्नुहोस्' (Create) मा क्लिक गर्नुहोस्।", + "gcp-create-new-project": "{openLink}नयाँ Google क्लाउड परियोजना बनाउनुहोस्{closeLink}।", + "gcp-create-new-vm": "{openLink}VM को नयाँ सत्र बनाउनुहोस्{closeLink}।", + "gcp-create-project": "Google क्लाउड परियोजना बनाउनुहोस्", + "gcp-create-server": "आफ्नो Google क्लाउड परियोजना बनाउनुहोस्", + "gcp-create-vm": "VM को सत्र बनाउनुहोस्", + "gcp-disconnect-account": "Google Cloud Platform खाता डिस्कनेक्ट गर्नुहोस्", + "gcp-firewall-create-0": "आफ्नो Compute Engine परियोजनामा {openLink}फायरवालसम्बन्धी नयाँ नियम हाल्नुहोस्{closeLink}।", + "gcp-firewall-create-1": "'नाम' (Name) फिल्डमा 'outline' टाइप गर्नुहोस्।", + "gcp-firewall-create-2": "'गन्तव्य ट्यागहरू' (Target tags) फिल्डमा 'आउटलाइन' (outline) टाइप गर्नुहोस्।", + "gcp-firewall-create-3": "'स्रोत IP का दायरा' (Source IP ranges) फिल्डमा '0.0.0.0/0' टाइप गर्नुहोस्।", + "gcp-firewall-create-4": "'प्रोटोकोल तथा पोर्टहरू' (Protocols and ports) का मुनिपट्टि 'सबैलाई अनुमति दिनुहोस्' (Allow all) चयन गर्नुहोस्।", + "gcp-name-your-project": "'परियोजनाको नाम' (Project name) फिल्डमा आफ्नो परियोजनाको नाम हाल्नुहोस्।", + "gcp-project-setup-error": "तपाईंको Google क्लाउड परियोजना सेटअप गर्ने क्रममा कुनै त्रुटि भयो", + "gcp-select-machine-type": "'मेसिनको प्रकार' (Machine type) का मुनिपट्टि 'f1-micro' चयन गर्नुहोस्", + "gcp-select-networking": "'व्यवस्थापन, सुरक्षा, डिस्कहरू, नेटवर्किङ, सोल टेनेन्सी' (Management, security, disks, networking, sole tenancy) मा र त्यसपछि 'नेटवर्किङ' (Networking) मा क्लिक गर्नुहोस्", + "gcp-select-region": "'क्षेत्र' (Region) का मुनिपट्टि सर्भरका प्रयोगकर्ताहरू बसोबास गर्ने क्षेत्रभन्दा नजिकैको क्षेत्र चयन गर्नुहोस्।", + "gcp-type-network-tag": "'नेटवर्क ट्यागहरू' (Network tags) फिल्डमा 'आउटलाइन' (outline) टाइप गर्नुहोस्", + "gcp-type-outline-server": "'नाम' (Name) फिल्डमा 'outline-server' टाइप गर्नुहोस्।", + "geo-amsterdam": "एम्स्टर्डम", + "geo-bangalore": "बैङ्गलोर", + "geo-changhua-county": "चाङहुआ काउन्टी", + "geo-delhi": "दिल्ली", + "geo-eemshaven": "एम्सहेभन", + "geo-frankfurt": "फ्र्याङ्कफर्ट", + "geo-hamina": "हामिना", + "geo-hk": "हङकङ", + "geo-iowa": "आयोवा", + "geo-jakarta": "जकार्ता", + "geo-jurong-west": "जुरोङ वेस्ट", + "geo-las-vegas": "लास भेगास", + "geo-london": "लन्डन", + "geo-los-angeles": "लस एन्जलस", + "geo-melbourne": "मेलबर्न", + "geo-montreal": "मन्ट्रियल", + "geo-mumbai": "मुम्बई", + "geo-new-york-city": "न्युयोर्क", + "geo-northern-virginia": "नर्दर्न भर्जिनिया", + "geo-oregon": "ओरेगन", + "geo-osaka": "ओसाका", + "geo-salt-lake-city": "साल्ट लेक सिटी", + "geo-san-francisco": "सान फ्रान्सिस्को", + "geo-sao-paulo": "साओ पाउलो", + "geo-seoul": "सोल", + "geo-sg": "सिङ्गापुर", + "geo-south-carolina": "साउथ क्यारोलाइना", + "geo-st-ghislain": "सेन्ट जिस्लेन", + "geo-sydney": "सिड्नी", + "geo-tokyo": "टोकियो", + "geo-toronto": "टोरोन्टो", + "geo-warsaw": "वार्सा", + "geo-zurich": "ज्युरिक", + "key": "की {keyId}", + "manual-server-assign-firewall": "फायरवालसम्बन्धी नियम तोक्नुहोस्", + "manual-server-assign-group": "सुरक्षा समूह तोक्नुहोस्", + "manual-server-create-firewall": "फायरवालसम्बन्धी नियम बनाउनुहोस्", + "manual-server-create-group": "सुरक्षा समूह बनाउनुहोस्", + "manual-server-description": "यी चरणहरूले तपाईंलाई {cloudProvider} को Linux सर्भरमा Outline इन्स्टल गर्न सघाउने छन्।", + "manual-server-firewall": "आफ्नो फायरवाल कन्फिगर गर्नुहोस्", + "manual-server-install-paste": "इन्स्टल गर्ने प्रक्रियाको आउटपुट स्क्रिप्ट पेस्ट गर्नुहोस्।", + "manual-server-install-run": "आफ्नो सर्भरमा लग इन गर्नुहोस् र यो कमान्ड चलाउनुहोस्।", + "manual-server-instructions": "निर्देशनहरू", + "manual-server-show-me": "मलाई ठाउँ देखाउनुहोस्", + "manual-server-title": "तलका निर्देशनहरूको पालना गर्नुहोस्", + "metrics-description": "तपाईं र तपाईंले आफ्नो सर्भर सेयर गर्ने मान्छेल्हरूका निम्ति Outline को विश्वसनीयता र पर्फर्मेन्स सुधार गर्न अज्ञातकरण गरिएका मेट्रिकहरू सेयर गर्नुहोस्। {openLink}थप जान्नुहोस्।{closeLink}", + "metrics-share": "मेट्रिक सेयर गर्नुहोस्", + "metrics-skip": "स्किप गर्नुहोस्", + "metrics-title": "मेट्रिक सेयर गर्ने कार्य", + "nav-about": "जानकारी", + "nav-data-collection": "डेटा सङ्कलनसम्बन्धी नीति", + "nav-feedback": "प्रतिक्रिया", + "nav-help": "मद्दत", + "nav-licenses": "लाइसेन्सहरू", + "nav-privacy": "गोपनीयता", + "nav-terms": "सर्तहरू", + "no-data-limit": "सीमा तोकिएको छैन", + "notification-app-update": "Outline म्यानेजरको अपडेट गरिएको संस्करण डाउनलोड गरिएको छ। तपाईंले एप रिस्टार्ट गर्दा उक्त संस्करण इन्स्टल गरिने छ।", + "notification-feedback-thanks": "हाम्रो सेवाको गुणस्तर सुधार्न मद्दत गर्नुभएकोमा धन्यवाद! हामी तपाईंको प्रतिक्रिया जान्न चाहन्छौँ।", + "notification-key-added": "की हालिएको छ", + "notification-key-removed": "की हटाइएको छ", + "notification-server-destroyed": "सर्भर मेटाइएको छ", + "notification-server-exists": "यो सर्भर हालिसकिएको छ", + "notification-server-removed": "सर्भर हटाइएको छ", + "oauth-account-active": "तपाईंको DigitalOcean खाता एक्टिभेट गरिएको छ।", + "oauth-account-active-tag": "खाता एक्टिभेट गरियो! सर्भरका लोकेसनहरू लोड गरिँदै छ...", + "oauth-activate-account": "आफ्नो DigitalOcean खाता एक्टिभेट गर्नुहोस्।", + "oauth-billing": "digitalocean.com मा आफ्नो बिलिङसम्बन्धी जानकारी हाल्नुहोस् र उक्त काम गरिसकेपछि यो एपमा फर्कनुहोस्।", + "oauth-billing-tag": "बिलिङसम्बन्धी जानकारी हाल्नुहोस्...", + "oauth-connect-description": "Outline ले तपाईंको खाता प्रयोग गरी सर्भर बनाउने र कनेक्ट गर्ने प्रक्रिया सहज बनाउँछ।", + "oauth-connect-tag": "आफ्नो खाता कनेक्ट गर्नुहोस्...", + "oauth-connect-title": "DigitalOcean मा साइन इन गर्नुहोस् वा त्यसमा खाता बनाउनुहोस्।", + "oauth-sign-out": "साइन आउट गर्नुहोस्", + "oauth-verify": "आफ्नो इनबक्समा DigitalOcean बाट प्राप्त भएको इमेल हेर्नुहोस् र तपाईंको खाता पुष्टि गर्न त्यसमा भएको लिंकमा क्लिक गर्नुहोस्।", + "oauth-verify-tag": "आफ्नो इमेलको पुष्टि गर्नुहोस्...", + "okay": "ठिक छ", + "per-key-data-limit-dialog-set-custom": "डेटाको कस्टम सीमा तोक्नुहोस्", + "per-key-data-limit-dialog-title": "डेटाको सीमा - {keyName}", + "region-best-value": "सबैभन्दा राम्रो विकल्प", + "region-description": "तपाईं यो स्थानमा रहेको सर्भरबाट इन्टरनेट प्रयोग गर्नु हुने छ।", + "region-setup": "Outline सेटअप गर्नुहोस्", + "region-title": "आफ्नो सर्भरको लोकेसन चयन गर्नुहोस्।", + "remove": "हटाउनुहोस्", + "retry": "फेरि प्रयास गर्नुहोस्", + "save": "सेभ गर्नुहोस्", + "saved": "सेभ गरिएको छ", + "saving": "सेभ गरिँदै छ...", + "server-access": "सर्भर एक्सेस", + "server-access-key-new": "नयाँ की हाल्नुहोस्", + "server-access-key-rename": "नाम बदल्नुहोस्", + "server-access-keys": "एक्सेस कीहरू", + "server-connections": "कनेक्सनहरू", + "server-data-transfer": "ट्रान्स्फर गरिएको डेटा / विगत ३० दिनमा", + "server-data-used": "ट्रान्स्फर गरिएको डेटाको प्रतिशत / विगत ३० दिनमा", + "server-destroy": "सर्भर मेटाउनुहोस्", + "server-help-access-key-description": "तपाईंका साथीहरू तपाईंको Outline सर्भरमा कनेक्ट गर्न सकून् भन्नाका लागि उनीहरूलाई एक्सेस की दिनुहोस्। उनीहरू आफ्ना सबै डिभाइसहरूमा एउटै एक्सेस कि प्रयोग गर्न सक्छन्।", + "server-help-access-key-next": "अर्को", + "server-help-access-key-title": "की बनाउनुहोस्, अरूलाई पनि प्रयोग गर्न दिनुहोस्", + "server-help-connection-description": "तपाईंको Outline सर्भरको व्यक्तिगत एक्सेस की प्रयोग गरी Outline क्लाइन्ट एप इन्स्टल गर्न यहाँ क्लिक गर्नुहोस्।", + "server-help-connection-ok": "ठीक छ, बुझेँ!", + "server-help-connection-title": "तपाईं अहिलेसम्म कनेक्ट हुनुभएको छैन!", + "server-keys": "कीहरू", + "server-my-access-key": "मेरो एक्सेस की", + "server-name": "Outline सर्भर {serverLocation}", + "server-remove": "सर्भर हटाउनुहोस्", + "server-settings": "सेटिङ", + "server-unreachable": "सर्भरमा कनेक्ट गर्न सकिँदैन", + "server-unreachable-description": "यो सर्भरमा कनेक्ट गर्ने क्रममा समस्याहरू आए।", + "server-unreachable-managed-description": "फेरि प्रयास गर्नुहोस् वा एपबाट यो सर्भर हटाउनुहोस्।", + "server-unreachable-manual-description": "फेरि प्रयास गर्नुहोस् वा यो सर्भर र भर्चुअल होस्ट मेटाउनुहोस्।", + "server-usage": "प्रयोग (विगत ३० दिनमा)", + "servers-add": "सर्भर हाल्नुहोस्", + "servers-digitalocean": "DigitalOcean का सर्भरहरू", + "servers-gcp": "Google Cloud Platform का सर्भरहरू", + "servers-manual": "सर्भरहरू", + "settings-access-key-port": "नयाँ एक्सेस कीहरूको पोर्ट", + "settings-metrics-header": "अज्ञातकरण गरिएका मेट्रिक सेयर गर्नुहोस्", + "settings-server-api-url": "Management API को URL", + "settings-server-cost": "मासिक शुल्क", + "settings-server-creation": "सिर्जना गरिएको मिति", + "settings-server-hostname": "होस्टनेम", + "settings-server-id": "सर्भरको आइडी", + "settings-server-info": "सर्भरसम्बन्धी जानकारी", + "settings-server-location": "सर्भरको लोकेसन", + "settings-server-name": "नाम", + "settings-server-rename": "आफ्नो सर्भरको नयाँ नाम राख्नुहोस्। तपाईंले यो सर्भरमा कनेक्ट गर्ने निम्तो दिनुभएका प्रयोगकर्ताहरूका डिभाइसमा भने सर्भरको पुरानै नाम देखिने छ भन्ने कुरा ख्याल गर्नुहोस्।", + "settings-server-version": "सर्भरको संस्करण", + "settings-transfer-limit": "ट्रान्स्फर गर्न मिल्ने डेटा", + "setup-action": "सेटअप गर्नुहोस्", + "setup-advanced": "उन्नत", + "setup-anywhere": "जुनसुकै ठाउँमा Outline सेटअप गर्नुहोस्", + "setup-cancel": "जुनसुकै बेला रद्द गर्नुहोस्", + "setup-create": "सर्भर बनाउनुहोस्", + "setup-description": "सर्भर छैन? DigitalOcean मा खाता बनाउनुहोस्।", + "setup-do-cost": "प्रति महिना $६ अमेरिकी डलर मात्र", + "setup-do-create": "३० दिनसम्म १ टि.बि. डेटा ट्रान्स्फर गरेबापत थप $६ तिर्ने गरी आफ्नो DigitalOcean खाता प्रयोग गरेर नयाँ सर्भर बनाउनुहोस्।", + "setup-do-data": "१ टि.बि. डेटा ट्रान्स्फर गर्न मिल्छ", + "setup-do-description": "यो प्रक्रिया पूरा हुन निकै बेर लाग्न सक्छ। तपाईं जुनसुकै बेला यो सर्भर मेटाउन सक्नुहुन्छ।", + "setup-do-easiest": "सेटअप गर्ने सबैभन्दा सरल प्रक्रिया", + "setup-do-title": "Outline सेटअप गरिँदै छ।", + "setup-firewall-instructions": "फायरवालसम्बन्धी निर्देशनहरू", + "setup-gcp-create": "आफ्नो Google खाता प्रयोग गरेर नयाँ सर्भर बनाउनुहोस्। यसको शुल्क लोकेसन र प्रयोगअनुसार फरक पर्छ।", + "setup-gcp-easy": "सेटअप गर्ने सरल प्रक्रिया", + "setup-gcp-free-tier": "तपाईंले {openLinkFreeTier}निःशुल्क टियर{closeLink} योजना लिनुभयो भने तपाईंको पहिलो सर्भरको सबैभन्दा सस्तो शुल्क {openLinkIpPrice}प्रति महिना $३ अमेरिकी डलर{closeLink} पर्छ", + "setup-gcp-free-trial": "नयाँ प्रयोगकर्ताहरू {openLinkFreeTrial}९० दिने निःशुल्क ट्रायल{closeLink} प्रयोग गर्न सक्छन्", + "setup-gcp-promo": "Google क्लाउडको स्वतः Outline सर्भर बनाउने नयाँ प्रक्रिया प्रयोग गरी हेर्नुहोस्", + "setup-recommended": "सिफारिस गरिएको", + "setup-simple-commands": "इन्स्टल गर्ने सरल कमान्डहरू", + "setup-step-by-step": "सेटअप गर्ने चरणबद्ध गाइड", + "setup-tested": "VULTR, Linode र Liquid Web मा परीक्षण गरिएको", + "setup-title": "Outline सेटअप गर्न कुनै क्लाउड सेवा छनौट गर्नुहोस्।", + "share-description": "यो निम्तो कपी गर्नुहोस् र आफूले भरोसा गर्ने माध्यमबाट पठाउनुहोस्। {openLink}मद्दत चाहिन्छ?{closeLink}", + "share-invite-access-key-copied": "एक्सेस की कपी गरी क्लिकबोर्डमा पेस्ट गरिएको छ", + "share-invite-copied": "निम्तो कपी गरी क्लिकबोर्डमा पेस्ट गरिएको छ", + "share-invite-copy": "निम्तो कपी गर्नुहोस्", + "share-invite-copy-access-key": "एक्सेस की कपी गर्नुहोस्", + "share-invite-html": "खुला इन्टरनेट सुरक्षित रूपमा प्रयोग गर्न यो सर्भर प्रयोग गर्नुहोस्:

1) आफ्नो डिभाइसमा Outline एप डाउनलोड र इन्स्टल गर्नुहोस्:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android को वैकल्पिक लिंक: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) तपाईं ss:// बाट सुरु हुने एक्सेस की प्राप्त गर्नु हुने छ। एक्सेस की प्राप्त गरेपछि उक्त की कपी गर्नुहोस्।

३) Outline क्लाइन्ट एप खोल्नुहोस्। तपाईंको एक्सेस की स्वतः पत्ता लागेका खण्डमा \"कनेक्ट गर्नुहोस्\" मा ट्याप गरी अघि बढ्नुहोस्। तपाईंको एक्सेस की स्वतः पत्ता नलागेका खण्डमा भने एक्सेस की फिल्डमा उक्त की पेस्ट गर्नुहोस्, त्यसपछि \"कनेक्ट गर्नुहोस्\" मा ट्याप गरी अघि बढ्नुहोस्।

तपाईं अब खुला इन्टरनेट प्रयोग गर्न सक्नुहुन्छ! तपाईं सर्भरमा कनेक्ट हुनुभएको छ भन्ने कुरा सुनिश्चित गर्न Google Search मा \"मेरो IP के हो\" खोजी हेर्नुहोस्। Google मा देखाइएको IP एड्रेस र Outline क्लाइन्टमा देखाइएको IP एड्रेस एउटै हुनु पर्छ।

Outline का बारेमा थप जान्न यहाँ जानुहोस्: https://getoutline.org/", + "share-invite-instructions": "हामीले GitHub मा उपलब्ध गराएको निम्तोसम्बन्धी निर्देशनहरूको पालना गर्नुहोस्:", + "share-invite-trouble": "निम्तोको लिंक प्रयोग गर्ने क्रममा समस्या आयो?", + "share-title": "एक्सेस सेयर गर्नुहोस्", + "survey-data-limits-title": "डेटाको सीमा तोक्ने सुविधाको गुणस्तर सुधार गर्ने तरिका बताउनुहोस्", + "survey-decline": "अस्वीकार गर्नुहोस्", + "survey-disclaimer": "तपाईंले \"जारी राख्नुहोस्\" मा क्लिक गर्नुभयो भने तपाईंलाई Google Forms को छोटो सर्वेक्षणमा पठाइने छ। हामी तपाईंलाई Outline मा कनेक्ट भइरहेका बेला उक्त सर्वेक्षणमा भाग लिने सिफारिस गर्छौँ।", + "survey-go-to-survey": "सर्वेक्षणमा जानुहोस्", + "terms-of-service": "मैले {openLink}Outline को सेवाका सर्तहरू{closeLink} पढेको/की र बुझेको/की छु" +} diff --git a/server_manager/messages/nl.json b/server_manager/messages/nl.json new file mode 100644 index 0000000000..4b8f2cea1e --- /dev/null +++ b/server_manager/messages/nl.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline is een opensource-project van Jigsaw waarmee nieuwsorganisaties en journalisten veiliger toegang hebben tot internet.

Outline wordt aangeboden door Shadowsocks en bevindt zich nog in een vroege fase. Je kunt bijdragen aan de code op GitHub en ons volgen op Reddit en Medium voor meer informatie over wanneer we meer platforms en functies toevoegen.", + "about-version": "Versie {version}", + "aws-lightsail-firewall-0": "Ga naar het instantiescherm van {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Klik op de instantie waarop je Outline wilt hosten.", + "aws-lightsail-firewall-2": "Ga naar het tabblad 'Netwerken' (Networking).", + "aws-lightsail-firewall-3": "Klik in het gedeelte 'Firewall' op 'Nog een toevoegen' (Add another).", + "aws-lightsail-firewall-4": "Stel de waarde 'App' (Application) in op 'Alle TCP+UDP' (All TCP+UDP).", + "aws-lightsail-firewall-5": "Klik op 'Opslaan' (Save).", + "cancel": "Annuleren", + "close": "Sluiten", + "confirmation-server-destroy": "Bestaande gebruikers raken de toegang kwijt. Deze actie kan niet ongedaan worden gemaakt.", + "confirmation-server-destroy-title": "Server vernietigen?", + "confirmation-server-remove": "Hiermee wordt de server verwijderd uit de Outline Manager, maar wordt de proxytoegang van gebruikers niet geblokkeerd. Je moet de Outline-server nog steeds handmatig verwijderen van je hostapparaat.", + "confirmation-server-remove-title": "Server verwijderen?", + "data-limit": "Gegevenslimiet", + "data-limit-per-key": "Gegevenslimiet per sleutel", + "data-limits": "Gegevenslimieten", + "data-limits-description": "Stel de limiet voor gegevensoverdracht voor toegangssleutels op deze server in op dertig dagen.", + "data-limits-dialog-text": "Ga naar het tabblad Instellingen om een limiet voor gegevensoverdracht voor toegangssleutels op deze server in te stellen.", + "data-limits-dialog-title": "Voorkom overmatig gebruik van gegevens", + "data-limits-disclaimer": "Omdat je momenteel statistieken rapporteert, wordt gebruik van de functie voor gegevenslimieten daarin meegenomen. Bekijk het {openLink}beleid voor gegevens verzamelen{closeLink} voor meer informatie.", + "data-limits-usage": "{used} van {total} gebruikt", + "destroy": "Vernietigen", + "digitalocean-disconnect-account": "Verbinding met DigitalOcean-account verbreken", + "digitalocean-unreachable": "Deze fout kan worden veroorzaakt door een firewall in je netwerk of tijdelijke verbindingsproblemen met digitalocean.com.", + "disabled": "Uitgezet", + "disconnect": "Verbinding verbreken", + "done": "Klaar", + "enabled": "Aangezet", + "error-connectivity": "Er is een probleem opgetreden bij het maken van verbinding met je DigitalOcean-account. Dit kan een tijdelijk probleem zijn met DigitalOcean of je internetverbinding. Als opnieuw proberen niet werkt, zou het probleem moeten worden opgelost als je opnieuw inlogt bij DigitalOcean.", + "error-connectivity-title": "Verbindingsprobleem", + "error-do-account-info": "De gegevens van het DigitalOcean-account kunnen niet worden opgehaald", + "error-do-auth": "Verificatie met DigitalOcean mislukt", + "error-do-limit": "Je DigitalOcean-account heeft de limiet van {num} droplets bereikt. Je kunt een verhoging aanvragen op https://cloud.digitalocean.com/account/team/droplet_limit_increase.", + "error-do-regions": "De lijst met beschikbare regio's kan niet worden opgehaald", + "error-do-warning": "DigitalOcean-waarschuwing: {message}", + "error-feedback": "Je feedback kan niet worden verzonden. Probeer het opnieuw.", + "error-gcp-auth": "Verificatie met Google Cloud Platform mislukt", + "error-hostname-invalid": "Moet een IP-adres of geldige hostnaam zijn.", + "error-key-add": "De sleutel kan niet worden toegevoegd", + "error-key-remove": "De sleutel kan niet worden verwijderd", + "error-key-rename": "De naam van de sleutel kan niet worden gewijzigd", + "error-keys-get": "De sleutels kunnen niet worden geladen", + "error-keys-port-bad-input": "De poort moet een geheel getal zijn tussen 1 en 65.535.", + "error-keys-port-in-use": "Deze poort wordt al gebruikt op de server.", + "error-licenses": "De licenties kunnen niet worden geladen.", + "error-metrics": "Fout: bij aanzetten van statistieken", + "error-network": "Er is een netwerkfout opgetreden.", + "error-not-saved": "Niet opgeslagen", + "error-remove-data-limit": "De standaard gegevenslimiet kan niet worden uitgezet", + "error-remove-per-key-limit": "De gegevenslimiet kan niet worden verwijderd van deze toegangssleutel", + "error-server-creation": "Er is een fout opgetreden bij het maken van de Outline-server.", + "error-server-destroy": "De server kan niet worden vernietigd", + "error-server-removed": "{serverName} bevindt zich niet meer in je DigitalOcean-account.", + "error-server-rename": "De naam van de server kan niet worden gewijzigd", + "error-server-unreachable": "De Outline-server is juist geïnstalleerd, maar we kunnen er geen verbinding mee maken. Dit komt waarschijnlijk doordat de firewallregels van je server binnenkomende verbindingen blokkeren. Controleer je firewallregels en zorg dat binnenkomende TCP-verbindingen op poorten 1024 t/m 65535 zijn toegestaan.", + "error-server-unreachable-title": "Er kan geen verbinding worden gemaakt met je Outline-server", + "error-servers-removed": "{serverNames} bevindt zich niet meer in je DigitalOcean-account.", + "error-set-data-limit": "De standaard gegevenslimiet kan niet worden ingesteld", + "error-set-per-key-limit": "Er kan geen gegevenslimiet worden ingesteld voor deze toegangssleutel", + "error-unexpected": "Er is een onverwachte fout opgetreden.", + "experimental": "Experimenteel", + "experiments": "Experimenten", + "experiments-description": "Test nieuwe functies voordat deze worden vrijgegeven en geef ons feedback.", + "experiments-disclaimer": "Experimenten zijn nog in ontwikkeling en kunnen worden gewijzigd of verwijderd uit de app. Als je momenteel statistische gegevens naar ons stuurt, worden gegevens uit experimentele functies daarin meegenomen. Bekijk het {openLink}beleid voor gegevens verzamelen{closeLink} voor meer informatie.", + "experiments-feedback": "Heb je suggesties? {openLink}Verzend hier je feedback.{closeLink}", + "feedback-cloud-provider": "Selecteer een cloudprovider", + "feedback-cloud-provider-error": "Selecteer een cloudprovider.", + "feedback-connection": "Ik kan geen verbinding maken met de server", + "feedback-connection-others": "Anderen kunnen geen verbinding maken met de server", + "feedback-disclaimer": "Ons team kan feedback alleen in het Engels beantwoorden.", + "feedback-email": "E-mailadres (optioneel)", + "feedback-error": "Voer feedback in.", + "feedback-explanation-install": "Er is een fout opgetreden bij de installatie van Outline op je server. Als je dit probleem niet kunt oplossen, kun je ons feedback sturen en daarin je e-mailadres opgeven (optioneel) zodat we contact met je kunnen opnemen.", + "feedback-general": "Algemene feedback", + "feedback-install": "Problemen met de installatie van Outline", + "feedback-label": "Je feedback", + "feedback-management": "Ik ondervind problemen met het beheer van de server", + "feedback-other": "Anders", + "feedback-privacy": "Je feedback, je e-mailadres (als je dit hebt opgegeven) en aanvullende gegevens die in het {openLink}privacybeleid{closeLink} staan, worden verzonden naar Team Outline.", + "feedback-submit": "Verzenden", + "feedback-suggestion": "Suggesties", + "feedback-title-generic": "Feedback sturen", + "feedback-title-install": "Installatie van Outline-server mislukt", + "gcp-billing-action": "Volgende", + "gcp-billing-body": "Wachten totdat je {openLink}een factureringsaccount hebt toegevoegd in Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Open de factureringspagina in de Cloud Console{closeLink} en voeg een account toe om door te gaan.", + "gcp-billing-error": "Factureringsgegevens kunnen niet worden opgehaald", + "gcp-billing-error-zero": "Je moet een factureringsaccount toevoegen voordat je doorgaat.", + "gcp-click-create": "Klik op 'Maken' (Create).", + "gcp-create-new-project": "{openLink}Een nieuw Google Cloud-project maken{closeLink}.", + "gcp-create-new-vm": "{openLink}Een nieuwe VM-instantie maken{closeLink}.", + "gcp-create-project": "Een Google Cloud-project maken", + "gcp-create-server": "Een Google Cloud-project maken", + "gcp-create-vm": "Een VM-instantie maken", + "gcp-disconnect-account": "Google Cloud Platform-account ontkoppelen", + "gcp-firewall-create-0": "{openLink}Voeg een nieuwe firewallregel toe{closeLink} aan je Compute Engine-project.", + "gcp-firewall-create-1": "Typ 'outline' in het veld 'Naam' (Name).", + "gcp-firewall-create-2": "Typ 'outline' in het veld 'Doeltags' (Target tags).", + "gcp-firewall-create-3": "Typ '0.0.0.0/0' in het veld 'Bron-IP-bereik' (Source IP ranges).", + "gcp-firewall-create-4": "Selecteer 'Alles toestaan' (Allow all) onder 'Protocollen en poorten' (Protocols and ports).", + "gcp-name-your-project": "Geef het project een naam in het veld 'Naam project' (Project name).", + "gcp-project-setup-error": "Er is een fout opgetreden bij het instellen van het Google Cloud-project", + "gcp-select-machine-type": "Selecteer 'f1-micro' onder 'Machinetype' (Machine type)", + "gcp-select-networking": "Klik op 'Beheer, beveiliging, schijven, netwerken, enkelvoudige tenancy' (Management, security, disks, networking, sole tenancy) en klik vervolgens op 'Netwerken' (Networking)", + "gcp-select-region": "Selecteer onder 'Regio' (Region) een regio in de buurt van de gebruikers van de server.", + "gcp-type-network-tag": "Typ 'outline' in het veld 'Netwerktags' (Network tags)", + "gcp-type-outline-server": "Typ 'outline-server' in het veld 'Naam' (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua County", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londen", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Noord-Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Warschau", + "geo-zurich": "Zürich", + "key": "Sleutel {keyId}", + "manual-server-assign-firewall": "Firewallregel toewijzen", + "manual-server-assign-group": "Beveiligingsgroep toewijzen", + "manual-server-create-firewall": "Een firewallregel maken", + "manual-server-create-group": "Een beveiligingsgroep maken", + "manual-server-description": "Met deze stappen kun je Outline installeren op een Linux-server van {cloudProvider}.", + "manual-server-firewall": "De firewall configureren", + "manual-server-install-paste": "Plak hier de installatieuitvoer.", + "manual-server-install-run": "Log in op je server en voer deze opdracht uit.", + "manual-server-instructions": "Instructies", + "manual-server-show-me": "Laat het me zien", + "manual-server-title": "Volg de instructies hieronder", + "metrics-description": "Deel anonieme statistieken om ons te helpen de betrouwbaarheid en prestaties van Outline te verbeteren, voor jou en anderen waarmee je je server deelt. {openLink}Meer informatie{closeLink}", + "metrics-share": "Statistieken delen", + "metrics-skip": "Overslaan", + "metrics-title": "Statistieken delen", + "nav-about": "Over", + "nav-data-collection": "Gegevens verzamelen", + "nav-feedback": "Feedback", + "nav-help": "Help", + "nav-licenses": "Licenties", + "nav-privacy": "Privacy", + "nav-terms": "Voorwaarden", + "no-data-limit": "Geen", + "notification-app-update": "Er is een geüpdatete versie van de Outline Manager gedownload. Deze versie wordt geïnstalleerd wanneer je de app opnieuw opstart.", + "notification-feedback-thanks": "Bedankt dat je ons helpt ons product te verbeteren. We zijn erg blij met je feedback.", + "notification-key-added": "Sleutel toegevoegd", + "notification-key-removed": "Sleutel verwijderd", + "notification-server-destroyed": "Server vernietigd", + "notification-server-exists": "Deze server is al toegevoegd", + "notification-server-removed": "Server verwijderd", + "oauth-account-active": "Je DigitalOcean-account is geactiveerd.", + "oauth-account-active-tag": "Account geactiveerd. Serverlocaties laden ...", + "oauth-activate-account": "Activeer je DigitalOcean-account.", + "oauth-billing": "Voer je factureringsgegevens in op digitalocean.com en ga daarna terug naar de app.", + "oauth-billing-tag": "Voer je factureringsgegevens in ...", + "oauth-connect-description": "Met je account kun je eenvoudig via Outline een server maken en er verbinding mee maken.", + "oauth-connect-tag": "Wachten op verbinding met je account ...", + "oauth-connect-title": "Log in of maak een account bij DigitalOcean.", + "oauth-sign-out": "Uitloggen", + "oauth-verify": "Zoek in je inbox de e-mail van DigitalOcean en klik op de link in de e-mail om je account te bevestigen.", + "oauth-verify-tag": "Bevestig je e-mailadres ...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Een aangepaste datalimiet instellen", + "per-key-data-limit-dialog-title": "Gegevenslimiet: {keyName}", + "region-best-value": "Beste prijs-kwaliteitsverhouding", + "region-description": "Vanaf hier ben je verbonden met het internet.", + "region-setup": "Outline instellen", + "region-title": "Selecteer de locatie van je server.", + "remove": "Verwijderen", + "retry": "Opnieuw proberen", + "save": "Opslaan", + "saved": "Opgeslagen", + "saving": "Opslaan...", + "server-access": "Servertoegang", + "server-access-key-new": "Nieuwe sleutel toevoegen", + "server-access-key-rename": "Naam wijzigen", + "server-access-keys": "Toegangssleutels", + "server-connections": "Verbindingen", + "server-data-transfer": "Overgezette gegevens/afgelopen dertig dagen", + "server-data-used": "Gebruikte toegestane hoeveelheid/afgelopen dertig dagen", + "server-destroy": "Server vernietigen", + "server-help-access-key-description": "Deel toegangssleutels met vrienden, zodat zij verbinding kunnen maken met je Outline-server. Ze kunnen dezelfde sleutel gebruiken op al hun apparaten.", + "server-help-access-key-next": "Volgende", + "server-help-access-key-title": "Sleutels maken, toegang delen", + "server-help-connection-description": "Klik hier om de Outline-client-app te installeren met je persoonlijke toegangssleutel voor je Outline-server.", + "server-help-connection-ok": "OK", + "server-help-connection-title": "Je hebt nog geen verbinding.", + "server-keys": "Sleutels", + "server-my-access-key": "Mijn toegangssleutel", + "server-name": "Outline-server {serverLocation}", + "server-remove": "Server verwijderen", + "server-settings": "Instellingen", + "server-unreachable": "De server kan niet worden bereikt", + "server-unreachable-description": "Er is een probleem opgetreden bij het maken van verbinding met deze server.", + "server-unreachable-managed-description": "Probeer het opnieuw of verwijder deze server uit de app.", + "server-unreachable-manual-description": "Probeer het opnieuw of vernietig deze server en de virtuele host.", + "server-usage": "Gebruik (afgelopen dertig dagen)", + "servers-add": "Server toevoegen", + "servers-digitalocean": "DigitalOcean-servers", + "servers-gcp": "Google Cloud Platform-servers", + "servers-manual": "Servers", + "settings-access-key-port": "Poort voor nieuwe toegangssleutels", + "settings-metrics-header": "Anonieme statistieken delen", + "settings-server-api-url": "Management API-URL", + "settings-server-cost": "Maandelijkse kosten", + "settings-server-creation": "Gemaakt", + "settings-server-hostname": "Hostnaam", + "settings-server-id": "Server-ID", + "settings-server-info": "Servergegevens", + "settings-server-location": "Serverlocatie", + "settings-server-name": "Naam", + "settings-server-rename": "Stel een nieuwe naam in voor je server. Deze naamswijziging wordt niet weergegeven op de apparaten van de gebruikers die je hebt uitgenodigd om verbinding te maken met je server.", + "settings-server-version": "Serverversie", + "settings-transfer-limit": "Toegestane hoeveelheid overgezette gegevens", + "setup-action": "Instellen", + "setup-advanced": "Geavanceerd", + "setup-anywhere": "Outline overal installeren", + "setup-cancel": "Altijd opzegbaar", + "setup-create": "Server maken", + "setup-description": "Heb je geen server? Maak een account bij DigitalOcean.", + "setup-do-cost": "Slechts $ 6 per maand", + "setup-do-create": "Maak een nieuwe server met je DigitalOcean-account voor $ 6 per 30 dagen extra, voor 1 TB aan gegevensoverdracht.", + "setup-do-data": "1 TB aan toegestane gegevensoverdracht", + "setup-do-description": "Dit kan een paar minuten duren. Je kunt deze server altijd vernietigen.", + "setup-do-easiest": "Eenvoudigste installatieproces", + "setup-do-title": "Outline instellen.", + "setup-firewall-instructions": "Instructies voor de firewall", + "setup-gcp-create": "Maak een nieuwe server met je Google-account. De kosten hangen af van je locatie en gebruik.", + "setup-gcp-easy": "Makkelijk installatieproces", + "setup-gcp-free-tier": "Met {openLinkFreeTier}Free Tier{closeLink}, heb je al een eerste server vanaf {openLinkIpPrice}$ 3 per maand{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Kosteloze proefperiode van 90 dagen{closeLink} voor nieuwe gebruikers", + "setup-gcp-promo": "Probeer het nieuwe automatische proces om een Outline-server te maken voor Google Cloud", + "setup-recommended": "Aanbevolen", + "setup-simple-commands": "Eenvoudige installatieopdrachten", + "setup-step-by-step": "Stapsgewijze installatiegids", + "setup-tested": "Getest op VULTR, Linode en Liquid Web", + "setup-title": "Kies een cloudservice om Outline in te stellen.", + "share-description": "Kopieer de uitnodiging en verstuur deze via een communicatietool die je vertrouwt. {openLink}Hulp nodig?{closeLink}", + "share-invite-access-key-copied": "Toegangssleutel gekopieerd naar klembord", + "share-invite-copied": "Uitnodiging gekopieerd naar klembord", + "share-invite-copy": "Uitnodiging kopiëren", + "share-invite-copy-access-key": "Toegangssleutel kopiëren", + "share-invite-html": "Gebruik deze server om beveiligd toegang te krijgen tot het open internet:

1) Download en installeer de Outline-app voor je apparaat:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Alternatieve Android-link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Je krijgt een toegangssleutel die begint met ss://. Kopieer deze.

3) Open de Outline-client-app. Als de toegangssleutel automatisch wordt gedetecteerd, tik je op Verbinden en ga je verder. Als de toegangssleutel niet automatisch wordt gedetecteerd, plak je deze in het veld. Tik dan op Verbinden en ga verder.

Je kunt nu het open internet gebruiken. Als je wilt zien of de verbinding met de server is geslaagd, probeer je in Google Zoeken te zoeken naar 'what is my ip'. Het IP-adres dat je in Google ziet, moet overeenkomen met het IP-adres in de Outline-client.

Meer informatie over Outline: https://getoutline.org/", + "share-invite-instructions": "Volg de instructies voor uitnodigingen op GitHub:", + "share-invite-trouble": "Krijg je geen toegang via de uitnodigingslink?", + "share-title": "Toegang delen", + "survey-data-limits-title": "Laat ons weten hoe we de gegevenslimieten kunnen verbeteren", + "survey-decline": "Weigeren", + "survey-disclaimer": "Als je op Doorgaan klikt, ga je naar een korte enquête in Google Formulieren. We raden je aan de enquête in te vullen terwijl je verbinding hebt met Outline.", + "survey-go-to-survey": "Ga naar enquête", + "terms-of-service": "Ik heb de {openLink}Servicevoorwaarden van Outline{closeLink} gelezen en begrepen" +} diff --git a/server_manager/messages/no.json b/server_manager/messages/no.json new file mode 100644 index 0000000000..57e1b4a293 --- /dev/null +++ b/server_manager/messages/no.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline er et prosjekt med åpen kildekode og er opprettet av Jigsaw for å gi nyhetsorganisasjoner og journalister mulighet til å bruke Internett på en tryggere måte.

Outline drives av Shadowsocks og er fortsatt på et tidlig stadium. Du kan bidra med koding ved å gå til GitHub, og du kan følge oss på Reddit og Medium for å bli varslet når vi utvider til flere plattformer og legger til nye funksjoner.", + "about-version": "Versjon {version}", + "aws-lightsail-firewall-0": "Naviger til skjermbildet med {openLink}Amazon Lightsail{closeLink}-forekomster.", + "aws-lightsail-firewall-1": "Klikk på forekomsten du vil bruke som vert for Outline.", + "aws-lightsail-firewall-2": "Naviger til «Nettverk»-fanen (Networking).", + "aws-lightsail-firewall-3": "Klikk på «Legg til én til» (Add another) i «Brannmur»-delen (Firewall).", + "aws-lightsail-firewall-4": "Angi verdien for «Program» (Application) som «Alle TCP+UDP» (All TCP+UDP).", + "aws-lightsail-firewall-5": "Klikk på «Lagre» (Save).", + "cancel": "Avbryt", + "close": "Lukk", + "confirmation-server-destroy": "Eksisterende brukere mister tilgangen. Denne handlingen kan ikke angres.", + "confirmation-server-destroy-title": "Vil du slette tjeneren?", + "confirmation-server-remove": "Denne handlingen fjerner tjeneren din fra Outline-administratoren, men blokkerer ikke proxy-tilgang for brukerne. Du må fortsatt slette Outline-tjeneren manuelt fra vertsmaskinen din.", + "confirmation-server-remove-title": "Vil du fjerne tjeneren?", + "data-limit": "Datagrense", + "data-limit-per-key": "Datagrense per nøkkel", + "data-limits": "Datagrenser", + "data-limits-description": "Angi en grense for overføring av data over 30 dager for tilgangsnøkler på denne tjeneren.", + "data-limits-dialog-text": "Gå til Innstillinger-fanen for å angi en grense for overføring av data over 30 dager for tilgangsnøkler på denne tjeneren.", + "data-limits-dialog-title": "Unngå å overskride datagrensene", + "data-limits-disclaimer": "Siden du rapporterer statistikk nå, tas bruk av funksjonen for datagrenser med. Du finner mer informasjon i {openLink}retningslinjene for innsamling av data{closeLink}.", + "data-limits-usage": "{used} av {total} er brukt", + "destroy": "Slett", + "digitalocean-disconnect-account": "Koble fra DigitalOcean-kontoen", + "digitalocean-unreachable": "Denne feilen kan skyldes en brannmur på nettverket ditt eller midlertidige tilkoblingsproblemer med digitalocean.com.", + "disabled": "Slått av", + "disconnect": "Koble fra", + "done": "Ferdig", + "enabled": "Slått på", + "error-connectivity": "Vi har problemer med å koble til DigitalOcean-kontoen din. Dette er av og til et midlertidig problem med DigitalOcean eller internettilkoblingen din. Hvis det ikke fungerer å prøve på nytt, bør det fikse problemet hvis du logger på DigitalOcean på nytt.", + "error-connectivity-title": "Tilkoblingsproblem", + "error-do-account-info": "Kunne ikke hente DigitalOcean-kontoinformasjonen", + "error-do-auth": "Autentisering med DigitalOcean mislyktes", + "error-do-limit": "DigitalOcean-kontoen din har nådd grensen på {num} Droplets (virtuelle maskiner). Du kan be om å øke grensen på https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Kunne ikke hente listen over tilgjengelige regioner", + "error-do-warning": "DigitalOcean-advarsel: «{message}»", + "error-feedback": "Kunne ikke sende inn tilbakemeldingen. Prøv på nytt.", + "error-gcp-auth": "Autentiseringen med Google Cloud Platform mislyktes", + "error-hostname-invalid": "Må være en IP-adresse eller et gyldig vertsnavn.", + "error-key-add": "Kunne ikke legge til nøkkelen", + "error-key-remove": "Kunne ikke fjerne nøkkelen", + "error-key-rename": "Kunne ikke gi nøkkelen nytt navn", + "error-keys-get": "Kunne ikke laste inn nøklene", + "error-keys-port-bad-input": "Porten må være et heltall mellom 1 og 65 535.", + "error-keys-port-in-use": "Porten er allerede i bruk på tjeneren.", + "error-licenses": "Kunne ikke laste inn lisensene.", + "error-metrics": "Kunne ikke aktivere rapportering av verdier", + "error-network": "Det oppsto en nettverksfeil.", + "error-not-saved": "Ikke lagret", + "error-remove-data-limit": "Kunne ikke deaktivere standarddatagrensen", + "error-remove-per-key-limit": "Kunne ikke fjerne datagrensen fra denne tilgangsnøkkelen", + "error-server-creation": "Det oppsto en feil da Outline-tjeneren din skulle opprettes.", + "error-server-destroy": "Kunne ikke slette tjeneren", + "error-server-removed": "{serverName} finnes ikke lenger i DigitalOcean-kontoen din.", + "error-server-rename": "Kunne ikke gi tjeneren nytt navn", + "error-server-unreachable": "Outline-tjeneren din ble installert riktig, men vi kan ikke koble til den. Dette er sannsynligvis fordi brannmurreglene for tjeneren din blokkerer innkommende tilkoblinger. Gå gjennom dem og pass på at du tillater innkommende TCP-tilkoblinger på porter fra 1024 til 65535.", + "error-server-unreachable-title": "Kan ikke koble til Outline-tjeneren din", + "error-servers-removed": "{serverNames} finnes ikke lenger i DigitalOcean-kontoen din.", + "error-set-data-limit": "Kunne ikke angi standarddatagrense", + "error-set-per-key-limit": "Kunne ikke angi en datagrense for denne tilgangsnøkkelen", + "error-unexpected": "Det oppsto en uventet feil.", + "experimental": "På forsøksstadiet", + "experiments": "Eksperimenter", + "experiments-description": "Test nye funksjoner før de blir publisert, og gi oss tilbakemeldinger.", + "experiments-disclaimer": "Eksperimenter er under utvikling og kan endres eller fjernes fra appen. Hvis du rapporterer statistikk, tas bruk av eksperimentene med i verdiene. Du finner mer informasjon i {openLink}retningslinjene for innsamling av data{closeLink}.", + "experiments-feedback": "Har du noen forslag? {openLink}Send inn tilbakemeldinger her.{closeLink}", + "feedback-cloud-provider": "Velg nettskyleverandør", + "feedback-cloud-provider-error": "Velg en nettskyleverandør.", + "feedback-connection": "Kan ikke koble til tjeneren min", + "feedback-connection-others": "Andre kan ikke koble til tjeneren min", + "feedback-disclaimer": "Vær oppmerksom på at teamet vårt bare kan svare på tilbakemeldinger på engelsk.", + "feedback-email": "E-postadresse (valgfritt)", + "feedback-error": "Skriv inn tilbakemeldingen.", + "feedback-explanation-install": "Det oppsto en feil under forsøket på å installere Outline på tjeneren din. Hvis du ikke har klart å finne en løsning, bør du overveie å sende oss tilbakemelding og oppgi e-postadressen din (dette er valgfritt) slik at vi kan svare deg.", + "feedback-general": "Generell tilbakemelding", + "feedback-install": "Jeg har problemer med å installere Outline", + "feedback-label": "Tilbakemeldingen din", + "feedback-management": "Jeg har problemer med administrering av tjeneren min", + "feedback-other": "Annen", + "feedback-privacy": "Tilbakemeldingen din, e-postadressen din (om den er oppgitt) og ekstra informasjon som er omtalt i {openLink}personvernreglene{closeLink}, blir sendt til Outline-teamet.", + "feedback-submit": "Send inn", + "feedback-suggestion": "Forslag", + "feedback-title-generic": "Send tilbakemelding", + "feedback-title-install": "Installeringen av Outline-tjeneren mislyktes", + "gcp-billing-action": "Neste", + "gcp-billing-body": "Venter på at du {openLink}legger til en faktureringskonto i Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Åpne faktureringssiden i Cloud Console{closeLink} og legg til en konto for å gå videre.", + "gcp-billing-error": "Kan ikke hente faktureringsinformasjonen", + "gcp-billing-error-zero": "Du må legge til en faktureringskonto før du kan gå videre.", + "gcp-click-create": "Klikk på «Opprett» (Create).", + "gcp-create-new-project": "{openLink}Opprett et nytt Google Cloud-prosjekt{closeLink}.", + "gcp-create-new-vm": "{openLink}Opprett en ny VM-forekomst{closeLink}.", + "gcp-create-project": "Opprett et Google Cloud-prosjekt", + "gcp-create-server": "Opprett Google Cloud-prosjektet ditt", + "gcp-create-vm": "Opprett en VM-forekomst", + "gcp-disconnect-account": "Koble fra Google Cloud Platform-kontoen", + "gcp-firewall-create-0": "{openLink}Legg til en ny brannmurregel{closeLink} i Compute Engine-prosjektet ditt.", + "gcp-firewall-create-1": "Skriv «outline» i «Navn»-feltet (Name).", + "gcp-firewall-create-2": "Skriv «outline» i «Måletiketter»-feltet (Target tags).", + "gcp-firewall-create-3": "Skriv «0.0.0.0/0» i «IP-områder for kilden»-feltet (Source IP ranges).", + "gcp-firewall-create-4": "Velg «Tillat alle» (Allow all) under «Protokoller og porter» (Protocols and ports).", + "gcp-name-your-project": "Gi prosjektet ditt et navn i «Prosjektnavn»-feltet (Project name).", + "gcp-project-setup-error": "Det oppsto en feil under konfigureringen av Google Cloud-prosjektet ditt", + "gcp-select-machine-type": "Velg «f1-micro» under «Maskintype» (Machine type)", + "gcp-select-networking": "Klikk på «Administrering, sikkerhet, disker, nettverk, eneeie» (Management, security, disks, networking, sole tenancy), og deretter på «Nettverk» (Networking)", + "gcp-select-region": "Velg en region nær der brukerne av tjeneren skal være, under «Region» (Region).", + "gcp-type-network-tag": "Skriv «outline» i «Nettverksetiketter»-feltet (Network tags)", + "gcp-type-outline-server": "Skriv «outline-server» i «Navn»-feltet (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua fylke", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Fredrikshamn", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Nord-Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "Sør-Carolina", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warszawa", + "geo-zurich": "Zürich", + "key": "Nøkkel {keyId}", + "manual-server-assign-firewall": "Tilordne brannmurregel", + "manual-server-assign-group": "Tilordne sikkerhetsgruppe", + "manual-server-create-firewall": "Opprett en brannmurregel", + "manual-server-create-group": "Opprett en sikkerhetsgruppe", + "manual-server-description": "Denne veiledningen hjelper deg med å installere Outline på en Linux-tjener fra {cloudProvider}.", + "manual-server-firewall": "Konfigurer brannmuren din", + "manual-server-install-paste": "Lim inn installeringsutdataene dine her.", + "manual-server-install-run": "Logg på tjeneren din og kjør denne kommandoen.", + "manual-server-instructions": "Veiledning", + "manual-server-show-me": "Vis meg hvor", + "manual-server-title": "Følg veiledningen nedenfor", + "metrics-description": "Del anonymiserte verdier for å bidra til å forbedre Outlines pålitelighet og ytelse, for deg og dem du deler tjeneren med. {openLink}Finn ut mer.{closeLink}", + "metrics-share": "Del verdier", + "metrics-skip": "Hopp over", + "metrics-title": "Deling av verdier", + "nav-about": "Info", + "nav-data-collection": "Innsamling av data", + "nav-feedback": "Tilbakemelding", + "nav-help": "Hjelp", + "nav-licenses": "Lisenser", + "nav-privacy": "Personvern", + "nav-terms": "Vilkår", + "no-data-limit": "Ingen", + "notification-app-update": "En oppdatert versjon av Outline-administrator er lastet ned. Den blir installert når du starter appen på nytt.", + "notification-feedback-thanks": "Takk for at du hjelper oss å bli bedre! Vi setter stor pris på å høre fra deg.", + "notification-key-added": "Nøkkelen er lagt til", + "notification-key-removed": "Nøkkelen er fjernet", + "notification-server-destroyed": "Tjeneren er slettet", + "notification-server-exists": "Tjeneren er allerede lagt til", + "notification-server-removed": "Tjeneren er fjernet", + "oauth-account-active": "DigitalOcean-kontoen din er aktivert.", + "oauth-account-active-tag": "Kontoen er aktivert. Laster inn tjenerplasseringer …", + "oauth-activate-account": "Aktiver DigitalOcean-kontoen din", + "oauth-billing": "Skriv inn faktureringsinformasjonen din på digitalocean.com og kom tilbake til appen når du er ferdig.", + "oauth-billing-tag": "Skriv inn faktureringsinformasjon", + "oauth-connect-description": "Med kontoen din blir det enkelt å opprette en tjener i Outline og koble deg til.", + "oauth-connect-tag": "Venter på å koble til kontoen din …", + "oauth-connect-title": "Logg på eller opprett en konto med DigitalOcean.", + "oauth-sign-out": "Logg av", + "oauth-verify": "Sjekk innboksen din etter en e-post fra DigitalOcean, og klikk på linken i den for å bekrefte kontoen din.", + "oauth-verify-tag": "Bekreft e-postadressen din", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Angi en egendefinert datagrense", + "per-key-data-limit-dialog-title": "Datagrense – {keyName}", + "region-best-value": "Mest for pengene", + "region-description": "Dette er stedet internettopplevelsen din skal komme fra.", + "region-setup": "Konfigurer Outline", + "region-title": "Velg plasseringen til tjeneren din.", + "remove": "Fjern", + "retry": "Prøv på nytt", + "save": "Lagre", + "saved": "Lagret", + "saving": "Lagrer …", + "server-access": "Tjenertilgang", + "server-access-key-new": "Legg til en ny nøkkel", + "server-access-key-rename": "Gi nytt navn", + "server-access-keys": "Tilgangsnøkler", + "server-connections": "Tilkoblinger", + "server-data-transfer": "Data overført / siste 30 dager", + "server-data-used": "Kvote brukt / siste 30 dager", + "server-destroy": "Slett tjeneren", + "server-help-access-key-description": "Del tilgangsnøkler med venner slik at de kan koble seg til Outline-tjeneren din. De kan bruke samme tilgangsnøkkel på alle enhetene sine.", + "server-help-access-key-next": "Neste", + "server-help-access-key-title": "Opprett nøkler og del tilgang", + "server-help-connection-description": "Klikk her for å installere Outline-klientappen ved å bruke den personlige tilgangsnøkkelen din til Outline-tjeneren din.", + "server-help-connection-ok": "OK, skjønner!", + "server-help-connection-title": "Du er ikke tilkoblet ennå.", + "server-keys": "Nøkler", + "server-my-access-key": "Min tilgangsnøkkel", + "server-name": "Outline-tjener {serverLocation}", + "server-remove": "Fjern tjeneren", + "server-settings": "Innstillinger", + "server-unreachable": "Kan ikke nå tjeneren", + "server-unreachable-description": "Vi har problemer med å koble til denne tjeneren.", + "server-unreachable-managed-description": "Prøv på nytt eller fjern denne tjeneren fra programmet.", + "server-unreachable-manual-description": "Prøv på nytt eller slett denne tjeneren og den virtuelle verten.", + "server-usage": "Bruk (siste 30 dager)", + "servers-add": "Legg til en tjener", + "servers-digitalocean": "DigitalOcean-tjenere", + "servers-gcp": "Google Cloud Platform-tjenere", + "servers-manual": "Tjenere", + "settings-access-key-port": "Port for nye tilgangsnøkler", + "settings-metrics-header": "Del anonyme verdier", + "settings-server-api-url": "Nettadresse til Management API", + "settings-server-cost": "Månedlig pris", + "settings-server-creation": "Opprettet", + "settings-server-hostname": "Vertsnavn", + "settings-server-id": "Tjener-ID", + "settings-server-info": "Tjenerinformasjon", + "settings-server-location": "Tjenerens plassering", + "settings-server-name": "Navn", + "settings-server-rename": "Angi et nytt navn på tjeneren din. Vær oppmerksom på at dette ikke gjenspeiles på enhetene til brukerne du har invitert til å koble seg til tjeneren.", + "settings-server-version": "Tjenerversjon", + "settings-transfer-limit": "Dataoverføringskvote", + "setup-action": "Konfigurer", + "setup-advanced": "Avansert", + "setup-anywhere": "Konfigurer Outline hvor som helst", + "setup-cancel": "Du kan si opp når som helst", + "setup-create": "Opprett tjeneren", + "setup-description": "Har du ikke noen tjener? Opprett en konto med DigitalOcean.", + "setup-do-cost": "Bare USD 6 per måned", + "setup-do-create": "Opprett en ny tjener med DigitalOcean-kontoen din for USD 6 ekstra – for 30 dager med 1 TB dataoverføring.", + "setup-do-data": "Dataoverføringskvote på 1 TB", + "setup-do-description": "Dette kan ta noen minutter. Du kan slette denne tjeneren når som helst.", + "setup-do-easiest": "Den enkleste konfigureringsprosessen", + "setup-do-title": "Konfigurerer Outline.", + "setup-firewall-instructions": "Brannmurveiledning", + "setup-gcp-create": "Opprett en ny tjener med Google-kontoen din. Kostnadene varierer avhengig av sted og bruk.", + "setup-gcp-easy": "Enkel konfigureringsprosess", + "setup-gcp-free-tier": "Med {openLinkFreeTier}Free Tier{closeLink} koster den første tjeneren din fra {openLinkIpPrice}3 USD per måned{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 dagers kostnadsfri prøveperiode{closeLink} for nye brukere", + "setup-gcp-promo": "Prøv den nye automatiske opprettingsprosessen for Outline-tjenere for Google Cloud", + "setup-recommended": "Anbefalt", + "setup-simple-commands": "Enkle installeringskommandoer", + "setup-step-by-step": "Trinnvis veiledning for konfigurering", + "setup-tested": "Testet på VULTR, Linode og Liquid Web", + "setup-title": "Velg en nettskytjeneste for å konfigurere Outline.", + "share-description": "Kopiér denne invitasjonen og send den fra et kommunikasjonsverktøy du vet er pålitelig. {openLink}Trenger du hjelp?{closeLink}", + "share-invite-access-key-copied": "Tilgangsnøkkelen er kopiert til utklippstavlen", + "share-invite-copied": "Kopierte invitasjonen til utklippstavlen", + "share-invite-copy": "Kopiér invitasjonen", + "share-invite-copy-access-key": "Kopiér tilgangsnøkkelen", + "share-invite-html": "Bruk denne tjeneren til å få trygg tilgang til det åpne internettet:

1) Last ned og installer Outline-appen for enheten din:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Android-alternativ link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Du får en tilgangsnøkkel som starter med ss://. Når du mottar den, kopierer du denne tilgangsnøkkelen.

3) Åpne Outline-klientappen. Hvis tilgangsnøkkelen din oppdages automatisk, trykker du på «Koble til» for å fortsette. Hvis tilgangsnøkkelen din ikke oppdages automatisk, kan du lime den inn i feltet og trykke på «Koble til» for å fortsette.

Du er nå klar til å bruke det åpne internettet. For å være sikker på at du har koblet til tjeneren, kan du prøve å søke etter «hva er IP-adressen min» på Google Søk. IP-adressen som vises i Google, skal samsvare med IP-adressen i Outline-klienten.

Finn ut mer om Outline her: https://getoutline.org/", + "share-invite-instructions": "Følg invitasjonsveiledningen vår på GitHub:", + "share-invite-trouble": "Har du problemer med å åpne invitasjonslinken?", + "share-title": "Del tilgang", + "survey-data-limits-title": "Hjelp oss med å forstå hvordan vi kan forbedre funksjonen for datagrenser", + "survey-decline": "Avslå", + "survey-disclaimer": "Når du klikker på Fortsett, åpnes en kort spørreundersøkelse i Google Skjemaer. Vi anbefaler at du svarer på undersøkelsen mens du er tilkoblet Outline.", + "survey-go-to-survey": "Gå til undersøkelsen", + "terms-of-service": "Jeg har lest og forstått {openLink}vilkårene for bruk av Outline{closeLink}" +} diff --git a/server_manager/messages/pl.json b/server_manager/messages/pl.json new file mode 100644 index 0000000000..56ad3cb223 --- /dev/null +++ b/server_manager/messages/pl.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline to projekt open source tworzony przez Jigsaw, by zapewnić dziennikarzom i organizacjom medialnym bezpieczniejszy dostęp do internetu.

Outline wykorzystuje technologię Shadowsocks i jest jeszcze na wczesnym etapie rozwoju. Kod źródłowy jest dostępny w serwisie GitHub. Informacje o projekcie (nowych platformach, nowych funkcjach itd.) można śledzić w serwisach RedditMedium.", + "about-version": "Wersja {version}", + "aws-lightsail-firewall-0": "Przejdź do ekranu z wystąpieniami {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Kliknij wystąpienie, w którym będzie hostowany serwer Outline.", + "aws-lightsail-firewall-2": "Przejdź do karty „Sieci” (Networking).", + "aws-lightsail-firewall-3": "W sekcji „Zapora sieciowa” (Firewall) kliknij „Dodaj kolejną” (Add another).", + "aws-lightsail-firewall-4": "W polu „Aplikacja” (Application) ustaw wartość „Wszystkie TCP+UDP” (All TCP+UDP).", + "aws-lightsail-firewall-5": "Kliknij „Zapisz” (Save).", + "cancel": "Anuluj", + "close": "Zamknij", + "confirmation-server-destroy": "Istniejący użytkownicy stracą dostęp. Nie można tego cofnąć.", + "confirmation-server-destroy-title": "Zlikwidować serwer?", + "confirmation-server-remove": "Spowoduje to usunięcie serwera z aplikacji Outline Manager, ale nie zablokuje użytkownikom dostępu do serwera proxy. Oprócz tego musisz jeszcze ręcznie usunąć serwer Outline ze swojego hosta.", + "confirmation-server-remove-title": "Usunąć serwer?", + "data-limit": "Limit danych", + "data-limit-per-key": "Limit danych na klucz", + "data-limits": "Limity danych", + "data-limits-description": "Ustaw 30-dniowy limit przenoszenia danych dla kluczy dostępu na tym serwerze.", + "data-limits-dialog-text": "Otwórz kartę Ustawienia, by określić limit przenoszenia danych dla kluczy dostępu na tym serwerze.", + "data-limits-dialog-title": "Unikaj przekraczania limitu danych", + "data-limits-disclaimer": "Ponieważ obecnie raportujesz dane, zostaną w nich uwzględnione informacje o funkcji ograniczania użycia danych. Aby dowiedzieć się więcej na ten temat, poznaj {openLink}zasady zbierania danych{closeLink}.", + "data-limits-usage": "Użyto {used} z {total}", + "destroy": "Zlikwiduj", + "digitalocean-disconnect-account": "Odłącz konto DigitalOcean", + "digitalocean-unreachable": "Ten błąd może być spowodowany przez zaporę w Twojej sieci albo tymczasowe problemy z połączeniem z serwerem digitalocean.com", + "disabled": "Wyłączono", + "disconnect": "Odłącz", + "done": "Gotowe", + "enabled": "Włączono", + "error-connectivity": "Mamy problem z nawiązaniem połączenia z Twoim kontem w DigitalOcean. Może to być tymczasowy problem z DigitalOcean lub z Twoim połączeniem internetowym. Jeśli problem nie ustąpi, może pomóc ponowne zalogowanie się w DigitalOcean.", + "error-connectivity-title": "Problem z połączeniem", + "error-do-account-info": "Nie udało się uzyskać informacji o koncie DigitalOcean", + "error-do-auth": "Błąd uwierzytelniania w DigitalOcean", + "error-do-limit": "Twoje konto DigitalOcean osiągnęło limit {num} maszyn wirtualnych Droplet. Możesz poprosić o zwiększenie limitu na https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Nie udało się pobrać listy dostępnych regionów", + "error-do-warning": "Ostrzeżenie DigitalOcean: „{message}”", + "error-feedback": "Nie udało się przesłać opinii. Spróbuj ponownie.", + "error-gcp-auth": "Nie udało się przeprowadzić uwierzytelniania w Google Cloud Platform", + "error-hostname-invalid": "Musisz podać adres IP lub prawidłową nazwę hosta.", + "error-key-add": "Nie udało się dodać klucza", + "error-key-remove": "Nie udało się usunąć klucza", + "error-key-rename": "Nie udało się zmienić nazwy klucza", + "error-keys-get": "Nie udało się załadować kluczy", + "error-keys-port-bad-input": "Numer portu musi być liczbą całkowitą między 1 a 65 535.", + "error-keys-port-in-use": "Port jest już używany na serwerze.", + "error-licenses": "Nie udało się załadować licencji.", + "error-metrics": "Błąd podczas włączania lub wyłączania wskaźników", + "error-network": "Wystąpił błąd sieci.", + "error-not-saved": "Nie zapisano", + "error-remove-data-limit": "Nie udało się wyłączyć domyślnego limitu danych", + "error-remove-per-key-limit": "Nie udało się usunąć limitu danych z tego klucza dostępu", + "error-server-creation": "Podczas tworzenia serwera Outline wystąpił błąd.", + "error-server-destroy": "Nie udało się zlikwidować serwera", + "error-server-removed": "Serwera {serverName} nie ma już na Twoim koncie DigitalOcean.", + "error-server-rename": "Nie udało się zmienić nazwy serwera", + "error-server-unreachable": "Twój serwer Outline został poprawnie zainstalowany, ale nie możemy się z nim połączyć. Najprawdopodobniej reguły zapory sieciowej Twojego serwera blokują połączenia przychodzące. Sprawdź te reguły i upewnij się, że połączenia przychodzące TCP na portach 1024–65535 są dozwolone.", + "error-server-unreachable-title": "Nie można nawiązać połączenia z Twoim serwerem Outline", + "error-servers-removed": "Serwerów {serverNames} nie ma już na Twoim koncie DigitalOcean.", + "error-set-data-limit": "Nie udało się ustawić domyślnego limitu danych", + "error-set-per-key-limit": "Nie udało się ustawić limitu danych dla tego klucza dostępu", + "error-unexpected": "Wystąpił nieoczekiwany błąd.", + "experimental": "Eksperymentalna", + "experiments": "Eksperymenty", + "experiments-description": "Testuj nowe funkcje przed ich udostępnieniem i przekazuj nam opinie na ich temat.", + "experiments-disclaimer": "Eksperymenty znajdują się w fazie opracowywania i mogą ulec zmianie lub zostać usunięte z aplikacji. Jeśli obecnie raportujesz dane, zostaną w nich uwzględnione informacje o użyciu funkcji eksperymentalnych. Aby dowiedzieć się więcej na ten temat, poznaj {openLink}zasady zbierania danych{closeLink}.", + "experiments-feedback": "Masz propozycje? {openLink}Prześlij je tutaj{closeLink}", + "feedback-cloud-provider": "Wybierz dostawcę chmury", + "feedback-cloud-provider-error": "Wybierz dostawcę chmury.", + "feedback-connection": "Nie mogę połączyć się z moim serwerem", + "feedback-connection-others": "Inni nie mogą połączyć się z moim serwerem", + "feedback-disclaimer": "Nasz zespół jest w stanie odpowiadać tylko na opinie w języku angielskim.", + "feedback-email": "Adres e-mail (opcjonalnie)", + "feedback-error": "Wpisz swoją opinię.", + "feedback-explanation-install": "Podczas instalowania aplikacji Outline na serwerze wystąpił błąd. Jeśli nie udało Ci się znaleźć rozwiązania, możesz przesłać nam opinię i podać swój adres e-mail (opcjonalnie), który umożliwi nam kontakt z Tobą.", + "feedback-general": "Opinia ogólna", + "feedback-install": "Problem z instalacją Outline", + "feedback-label": "Twoja opinia", + "feedback-management": "Mam problem z zarządzaniem serwerem", + "feedback-other": "Inny", + "feedback-privacy": "Twoja opinia, adres e-mail (jeśli go podasz) oraz dodatkowe informacje wskazane w {openLink}polityce prywatności{closeLink} zostaną wysłane do zespołu Outline.", + "feedback-submit": "Prześlij", + "feedback-suggestion": "Sugestie", + "feedback-title-generic": "Prześlij opinię", + "feedback-title-install": "Nie udało się zainstalować serwera Outline", + "gcp-billing-action": "Dalej", + "gcp-billing-body": "Czekam na {openLink}dodanie konta rozliczeniowego w Google Cloud{closeLink}", + "gcp-billing-description": "Aby przejść dalej, {openLink}otwórz stronę płatności w Cloud Console{closeLink} i dodaj konto.", + "gcp-billing-error": "Nie można pobrać informacji rozliczeniowych", + "gcp-billing-error-zero": "Zanim przejdziesz dalej, musisz dodać konto rozliczeniowe.", + "gcp-click-create": "Kliknij „Create” (Utwórz).", + "gcp-create-new-project": "{openLink}Tworzenie nowego projektu Google Cloud{closeLink}", + "gcp-create-new-vm": "{openLink}Tworzenie nowego wystąpienia maszyny wirtualnej{closeLink}", + "gcp-create-project": "Tworzenie projektu Google Cloud", + "gcp-create-server": "Tworzenie projektu Google Cloud", + "gcp-create-vm": "Tworzenie wystąpienia maszyny wirtualnej", + "gcp-disconnect-account": "Odłącz konto Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Dodaj nową regułę zapory sieciowej{closeLink} do swojego projektu Compute Engine.", + "gcp-firewall-create-1": "Wpisz „outline” w polu „Name” (Nazwa).", + "gcp-firewall-create-2": "Wpisz „outline” w polu „Target tags” (Tagi docelowe).", + "gcp-firewall-create-3": "Wpisz „0.0.0.0/0” w polu „Source IP ranges” (Zakresy źródłowych adresów IP).", + "gcp-firewall-create-4": "Wybierz „Allow all” (Zezwól na wszystkie) w polu „Protocols and ports” (Protokoły i porty).", + "gcp-name-your-project": "Nadaj projektowi nazwę i wpisz ją w polu „Nazwa projektu” (Project name).", + "gcp-project-setup-error": "Podczas konfigurowania projektu Google Cloud wystąpił błąd", + "gcp-select-machine-type": "W sekcji „Typ maszyny” (Machine type) wybierz „f1-micro”.", + "gcp-select-networking": "Kliknij „Zarządzanie, zabezpieczenia, dyski, sieć, jedyny najemca” (Management, security, disks, networking, sole tenancy), a następnie „Sieci” (Networking).", + "gcp-select-region": "W sekcji „Region” wybierz region w pobliżu lokalizacji użytkowników serwera.", + "gcp-type-network-tag": "W polu „Tagi sieci” (Network tags) wpisz „outline”.", + "gcp-type-outline-server": "W polu „Nazwa” (Name) wpisz „outline-server”.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bengaluru", + "geo-changhua-county": "Powiat Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Dżakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londyn", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbaj", + "geo-new-york-city": "Nowy Jork", + "geo-northern-virginia": "Północna Wirginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seul", + "geo-sg": "Singapur", + "geo-south-carolina": "Karolina Południowa", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Warszawa", + "geo-zurich": "Zurych", + "key": "Klucz {keyId}", + "manual-server-assign-firewall": "Przypisz regułę zapory sieciowej", + "manual-server-assign-group": "Przypisz grupę zabezpieczeń", + "manual-server-create-firewall": "Utwórz regułę zapory sieciowej", + "manual-server-create-group": "Utwórz grupę zabezpieczeń", + "manual-server-description": "Te kroki pomogą Ci zainstalować Outline na serwerze z Linuksem, który udostępnia {cloudProvider}.", + "manual-server-firewall": "Skonfiguruj zaporę sieciową", + "manual-server-install-paste": "Wklej tu dane wyjściowe skryptu instalacyjnego.", + "manual-server-install-run": "Zaloguj się na serwerze i uruchom to polecenie.", + "manual-server-instructions": "Instrukcje", + "manual-server-show-me": "Pokaż mi", + "manual-server-title": "Wykonaj poniższe instrukcje", + "metrics-description": "Udostępniaj zanonimizowane dane, by pomóc w zwiększaniu niezawodności i wydajności Outline. Skorzystasz na tym Ty i osoby, którym udostępniasz serwer. {openLink}Więcej informacji{closeLink}", + "metrics-share": "Udostępniaj dane", + "metrics-skip": "Pomiń", + "metrics-title": "Udostępnianie danych", + "nav-about": "Informacje o aplikacji", + "nav-data-collection": "Zbieranie danych", + "nav-feedback": "Opinia", + "nav-help": "Pomoc", + "nav-licenses": "Licencje", + "nav-privacy": "Prywatność", + "nav-terms": "Warunki", + "no-data-limit": "Brak", + "notification-app-update": "Pobrano aktualizację aplikacji Outline Manager. Zostanie ona zainstalowana po ponownym uruchomieniu tej aplikacji.", + "notification-feedback-thanks": "Dziękujemy za pomoc w ulepszaniu aplikacji. Cieszy nas każda opinia.", + "notification-key-added": "Dodano klucz", + "notification-key-removed": "Klucz został usunięty", + "notification-server-destroyed": "Serwer został zlikwidowany", + "notification-server-exists": "Serwer został już dodany", + "notification-server-removed": "Serwer został usunięty", + "oauth-account-active": "Twoje konto DigitalOcean zostało aktywowane.", + "oauth-account-active-tag": "Konto zostało aktywowane. Wczytuję lokalizacje serwerów...", + "oauth-activate-account": "Aktywuj swoje konto DigitalOcean", + "oauth-billing": "Podaj informacje rozliczeniowe w digitalocean.com, a następnie wróć do aplikacji.", + "oauth-billing-tag": "Podaj informacje rozliczeniowe...", + "oauth-connect-description": "Dostęp do Twojego konta ułatwia Outline utworzenie serwera i nawiązanie połączenia.", + "oauth-connect-tag": "Czekam na połączenie Twojego konta...", + "oauth-connect-title": "Zaloguj się lub utwórz konto w DigitalOcean.", + "oauth-sign-out": "Wyloguj się", + "oauth-verify": "Znajdź w skrzynce odbiorczej wiadomość e-mail od DigitalOcean i kliknij znajdujący się w niej link, by potwierdzić swoje konto.", + "oauth-verify-tag": "Potwierdź swój adres e-mail...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Ustaw niestandardowy limit danych", + "per-key-data-limit-dialog-title": "Limit danych – {keyName}", + "region-best-value": "Najlepsza oferta", + "region-description": "Wybór miejsca wpływa na to, co będzie dla Ciebie dostępne w internecie.", + "region-setup": "Zainstaluj Outline", + "region-title": "Wybierz lokalizację serwera.", + "remove": "Usuń", + "retry": "Spróbuj ponownie", + "save": "Zapisz", + "saved": "Zapisano", + "saving": "Zapisuję…", + "server-access": "Dostęp do serwera", + "server-access-key-new": "Dodaj nowy klucz", + "server-access-key-rename": "Zmień nazwę", + "server-access-keys": "Klucze dostępu", + "server-connections": "Połączenia", + "server-data-transfer": "Dane przesłane w ciągu ostatnich 30 dni", + "server-data-used": "Limit wykorzystany w ciągu ostatnich 30 dni", + "server-destroy": "Zlikwiduj serwer", + "server-help-access-key-description": "Udostępnij klucze dostępu znajomym, by mogli połączyć się z Twoim serwerem Outline. Mogą używać tego samego klucza dostępu na wszystkich swoich urządzeniach.", + "server-help-access-key-next": "Dalej", + "server-help-access-key-title": "Utwórz klucze i przyznaj dostęp", + "server-help-connection-description": "Kliknij tutaj, by zainstalować aplikację klienta Outline, używając własnego klucza dostępu do serwera Outline.", + "server-help-connection-ok": "OK", + "server-help-connection-title": "Jeszcze nie masz połączenia", + "server-keys": "Klucze", + "server-my-access-key": "Mój klucz dostępu", + "server-name": "Serwer Outline: {serverLocation}", + "server-remove": "Usuń serwer", + "server-settings": "Ustawienia", + "server-unreachable": "Serwer nieosiągalny", + "server-unreachable-description": "Mamy problem z nawiązaniem połączenia z tym serwerem.", + "server-unreachable-managed-description": "Spróbuj ponownie lub usuń ten serwer z aplikacji.", + "server-unreachable-manual-description": "Spróbuj ponownie lub zlikwiduj ten serwer i hosta wirtualnego.", + "server-usage": "Użycie (ostatnie 30 dni)", + "servers-add": "Dodaj serwer", + "servers-digitalocean": "Serwery DigitalOcean", + "servers-gcp": "Serwery Google Cloud Platform", + "servers-manual": "Serwery", + "settings-access-key-port": "Port dla nowych kluczy dostępu", + "settings-metrics-header": "Udostępniaj anonimowe dane", + "settings-server-api-url": "URL interfejsu API zarządzania", + "settings-server-cost": "Koszt miesięczny", + "settings-server-creation": "Czas utworzenia", + "settings-server-hostname": "Nazwa hosta", + "settings-server-id": "Identyfikator serwera", + "settings-server-info": "Informacje o serwerze", + "settings-server-location": "Lokalizacja serwera", + "settings-server-name": "Nazwa", + "settings-server-rename": "Ustaw nową nazwę serwera. Uwaga: nie będzie ona widoczna na urządzeniach użytkowników zaproszonych do połączenia się z serwerem.", + "settings-server-version": "Wersja serwera", + "settings-transfer-limit": "Limit transferu danych", + "setup-action": "Zainstaluj", + "setup-advanced": "Zaawansowane", + "setup-anywhere": "Outline możesz zainstalować wszędzie", + "setup-cancel": "Możesz anulować w dowolnej chwili", + "setup-create": "Utwórz serwer", + "setup-description": "Nie masz serwera? Utwórz konto w DigitalOcean.", + "setup-do-cost": "Tylko 6 USD miesięcznie", + "setup-do-create": "Utwórz na swoim koncie DigitalOcean nowy serwer za dodatkowe 6 USD/30 dni, aby zyskać 1 TB transferu danych.", + "setup-do-data": "1 TB limitu transferu danych", + "setup-do-description": "Może to potrwać kilka minut. W dowolnej chwili możesz zlikwidować ten serwer.", + "setup-do-easiest": "Najprostsza procedura instalacji", + "setup-do-title": "Instalowanie Outline", + "setup-firewall-instructions": "Instrukcje dotyczące zapory sieciowej", + "setup-gcp-create": "Utwórz nowy serwer, używając swojego konta Google. Koszt zależy od lokalizacji i użycia.", + "setup-gcp-easy": "Łatwy proces konfiguracji", + "setup-gcp-free-tier": "Na {openLinkFreeTier}poziomie bezpłatnym{closeLink} pierwszy serwer udostępniamy już za {openLinkIpPrice}3 USD/miesiąc{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90-dniowy bezpłatny okres próbny{closeLink} dla nowych użytkowników", + "setup-gcp-promo": "Wypróbuj nowy proces automatycznego tworzenia serwera Outline dla Google Cloud", + "setup-recommended": "Zalecane", + "setup-simple-commands": "Proste polecenia instalacyjne", + "setup-step-by-step": "Instrukcja instalacji krok po kroku", + "setup-tested": "Przetestowano w VULTR, Linode i Liquid Web", + "setup-title": "Wybierz usługę chmurową, w której chcesz zainstalować Outline.", + "share-description": "Skopiuj to zaproszenie i wyślij je za pomocą narzędzia do komunikacji, do którego masz zaufanie. {openLink}Potrzebujesz pomocy?{closeLink}", + "share-invite-access-key-copied": "Klucz dostępu został skopiowany do schowka", + "share-invite-copied": "Zaproszenie skopiowane do schowka", + "share-invite-copy": "Skopiuj zaproszenie", + "share-invite-copy-access-key": "Skopiuj klucz dostępu", + "share-invite-html": "Użyj tego serwera, aby bezpiecznie uzyskać otwarty dostęp do internetu:

1) Pobierz i zainstaluj aplikację Outline na swoje urządzenie:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– alternatywny link na Androida: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Otrzymasz klucz dostępu rozpoczynający się od ss://. Gdy otrzymasz klucz dostępu, skopiuj go.

3) Otwórz klienta Outline. Jeśli klucz dostępu zostanie wykryty automatycznie, kliknij „Połącz” i kontynuuj. Jeśli klucz dostępu nie zostanie wykryty automatycznie, wklej go w polu, a następnie kliknij „Połącz” i kontynuuj.

Możesz już korzystać z otwartego dostępu do internetu. Aby sprawdzić, czy udało Ci się połączyć z serwerem, w wyszukiwarce Google wpisz frazę „what is my ip”. Adres IP widoczny w Google powinien odpowiadać adresowi IP klienta Outline.

Więcej informacji o Outline znajdziesz tutaj: https://getoutline.org/", + "share-invite-instructions": "Wykonaj instrukcje dotyczące zaproszenia w GitHub:", + "share-invite-trouble": "Masz problem z dostępem do linku z zaproszeniem?", + "share-title": "Udostępnij dostęp", + "survey-data-limits-title": "Pomóż nam zrozumieć, jak ulepszyć limity danych", + "survey-decline": "Zamknij", + "survey-disclaimer": "Gdy przejdziesz dalej, wyświetli się krótka ankieta w Formularzach Google. Zalecamy wypełnienie ankiety po połączeniu z Outline.", + "survey-go-to-survey": "Otwórz ankietę", + "terms-of-service": "Znam i rozumiem {openLink}Warunki korzystania z Outline{closeLink}" +} diff --git a/server_manager/messages/pt-BR.json b/server_manager/messages/pt-BR.json new file mode 100644 index 0000000000..0e6f431fcc --- /dev/null +++ b/server_manager/messages/pt-BR.json @@ -0,0 +1,275 @@ +{ + "about-outline": "O Outline é um projeto de código aberto criado pela Jigsaw para proporcionar aos jornalistas e às agências de notícias uma forma mais segura de acessar a Internet.

O Outline usa a tecnologia Shadowsocks e ainda está nas etapas iniciais de desenvolvimento. Você pode contribuir para o código no GitHub e nos seguir no Reddit e no Medium para saber quando o produto chegar a outras plataformas e receber novos recursos.", + "about-version": "Versão {version}", + "aws-lightsail-firewall-0": "Acesse a tela com as instâncias do {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Clique na instância onde você quer hospedar o Outline.", + "aws-lightsail-firewall-2": "Acesse a guia \"Rede\" (Networking).", + "aws-lightsail-firewall-3": "Na seção \"Firewall\", clique em \"Adicionar outro\" (Add another).", + "aws-lightsail-firewall-4": "Defina o valor de \"Aplicativo\" (Application) como \"Todos: TCP+UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Clique em \"Salvar\" (Save).", + "cancel": "Cancelar", + "close": "Fechar", + "confirmation-server-destroy": "Os usuários atuais perderão o acesso. Esta ação não pode ser desfeita.", + "confirmation-server-destroy-title": "Destruir o servidor?", + "confirmation-server-remove": "Esta ação remove seu servidor do Outline Manager, mas não bloqueia o acesso ao proxy para os usuários. Você ainda precisará excluir manualmente o servidor do Outline da máquina do host.", + "confirmation-server-remove-title": "Remover o servidor?", + "data-limit": "Limite de dados", + "data-limit-per-key": "Limite de dados por chave", + "data-limits": "Limites de dados", + "data-limits-description": "Defina um limite de transferência de dados de 30 dias para as chaves de acesso neste servidor.", + "data-limits-dialog-text": "Acesse a guia \"Configurações\" para definir um limite de transferência de dados para as chaves de acesso neste servidor.", + "data-limits-dialog-title": "Evitar excedentes de dados", + "data-limits-disclaimer": "Como você está gerando um relatório de métricas no momento, o uso do recurso de limites de dados será incluído. Consulte a {openLink}política de coleta de dados{closeLink} para saber mais detalhes.", + "data-limits-usage": "{used} de {total} usados", + "destroy": "Destruir", + "digitalocean-disconnect-account": "Desconectar a conta da DigitalOcean", + "digitalocean-unreachable": "Este erro pode ocorrer devido a um firewall na sua rede ou a problemas de conectividade temporários com o site digitalocean.com.", + "disabled": "Desativar", + "disconnect": "Desconectar", + "done": "Concluído", + "enabled": "Ativar", + "error-connectivity": "Estamos com dificuldade de conexão com sua conta da DigitalOcean. Isso pode ser um problema temporário da DigitalOcean ou da sua conexão com a Internet. Se a nova tentativa não funcionar, faça login na DigitalOcean novamente para corrigir o problema.", + "error-connectivity-title": "Problema de conexão", + "error-do-account-info": "Ocorreu uma falha ao acessar as informações da conta da DigitalOcean.", + "error-do-auth": "Ocorreu uma falha na autenticação com a DigitalOcean.", + "error-do-limit": "Sua conta da DigitalOcean atingiu o limite de {num} droplets. Você pode mudar a opção de tamanho em https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Ocorreu uma falha ao acessar a lista de regiões disponíveis.", + "error-do-warning": "Aviso da DigitalOcean: \"{message}\"", + "error-feedback": "Ocorreu uma falha ao enviar feedback. Tente novamente.", + "error-gcp-auth": "Falha na autenticação com o Google Cloud Platform.", + "error-hostname-invalid": "Precisa ser um endereço IP ou o nome do host válido.", + "error-key-add": "Ocorreu uma falha ao adicionar a chave.", + "error-key-remove": "Ocorreu uma falha ao remover a chave.", + "error-key-rename": "Ocorreu uma falha ao renomear a chave.", + "error-keys-get": "Não foi possível carregar as chaves.", + "error-keys-port-bad-input": "O número da porta precisa ser um inteiro entre 1 e 65.535.", + "error-keys-port-in-use": "A porta já está em uso no servidor.", + "error-licenses": "Não foi possível carregar as licenças.", + "error-metrics": "Ocorreu um erro ao ativar as métricas.", + "error-network": "Ocorreu um erro de rede.", + "error-not-saved": "Não salvo", + "error-remove-data-limit": "Não foi possível desativar o limite de dados padrão.", + "error-remove-per-key-limit": "Não foi possível remover o limite de dados desta chave de acesso.", + "error-server-creation": "Ocorreu um erro ao criar o servidor do Outline.", + "error-server-destroy": "Ocorreu uma falha ao destruir o servidor.", + "error-server-removed": "O {serverName} não faz mais parte da sua conta da DigitalOcean.", + "error-server-rename": "Ocorreu uma falha ao renomear o servidor.", + "error-server-unreachable": "Seu servidor do Outline foi instalado, mas não é possível estabelecer conexão com ele. Provavelmente isso está ocorrendo porque as regras de firewall dele estão bloqueando as conexões de entrada. Revise as regras e permita as conexões TCP de entrada nas portas 1.024 a 65.535.", + "error-server-unreachable-title": "Não foi possível estabelecer conexão com seu servidor do Outline.", + "error-servers-removed": "Os {serverNames} não fazem mais parte da sua conta da DigitalOcean.", + "error-set-data-limit": "Não foi possível definir o limite de dados padrão.", + "error-set-per-key-limit": "Não foi possível definir um limite de dados para esta chave de acesso.", + "error-unexpected": "Ocorreu um erro inesperado.", + "experimental": "Experimental", + "experiments": "Experimentos", + "experiments-description": "Teste novos recursos e envie seu feedback antes do lançamento.", + "experiments-disclaimer": "Os experimentos estão em desenvolvimento e talvez sejam alterados ou removidos do app. Se você estiver reportando métricas no momento, o uso dos recursos experimentais será incluído. Consulte a {openLink}política de coleta de dados{closeLink} para saber mais detalhes.", + "experiments-feedback": "Você tem sugestões? {openLink}Envie seu feedback aqui{closeLink}.", + "feedback-cloud-provider": "Selecionar o provedor de nuvem", + "feedback-cloud-provider-error": "Selecione um provedor de nuvem.", + "feedback-connection": "Não consigo me conectar ao meu servidor", + "feedback-connection-others": "Outras pessoas estão sem conexão com meu servidor", + "feedback-disclaimer": "A equipe de suporte só responde a feedbacks em inglês.", + "feedback-email": "Endereço de e-mail (opcional)", + "feedback-error": "Digite o feedback.", + "feedback-explanation-install": "Ocorreu um erro durante a tentativa de instalação do Outline no seu servidor. Se você não descobrir a solução, envie um feedback e informe seu endereço de e-mail (opcional) para que possamos entrar em contato.", + "feedback-general": "Feedback geral", + "feedback-install": "Está com problemas para instalar o Outline?", + "feedback-label": "Seu feedback", + "feedback-management": "Estou com problemas para gerenciar o servidor", + "feedback-other": "Outro", + "feedback-privacy": "Seu feedback, endereço de e-mail (caso você tenha fornecido) e as informações adicionais mencionadas na {openLink}Política de Privacidade{closeLink} serão enviados para a equipe do Outline.", + "feedback-submit": "Enviar", + "feedback-suggestion": "Sugestões", + "feedback-title-generic": "Enviar feedback", + "feedback-title-install": "Ocorreu uma falha na instalação do servidor do Outline.", + "gcp-billing-action": "Próxima", + "gcp-billing-body": "Aguardando você {openLink}adicionar uma conta de faturamento no Google Cloud{closeLink}.", + "gcp-billing-description": "{openLink}Abra a página de faturamento do Console do Cloud{closeLink} e adicione uma conta para continuar.", + "gcp-billing-error": "Não foi possível recuperar as informações de faturamento.", + "gcp-billing-error-zero": "Você precisa adicionar uma conta de faturamento antes de continuar.", + "gcp-click-create": "Clique em \"Criar\" (Create).", + "gcp-create-new-project": "{openLink}Criar um novo projeto do Google Cloud{closeLink}", + "gcp-create-new-vm": "{openLink}Criar uma nova instância de VM{closeLink}", + "gcp-create-project": "Criar um projeto do Google Cloud", + "gcp-create-server": "Criar seu projeto do Google Cloud", + "gcp-create-vm": "Criar uma instância de VM", + "gcp-disconnect-account": "Desconectar a conta do Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Adicione uma nova regra de firewall{closeLink} ao seu projeto do Compute Engine.", + "gcp-firewall-create-1": "Digite \"outline\" no campo \"Nome\" (Name).", + "gcp-firewall-create-2": "Digite \"outline\" no campo \"Tags de destino\" (Target tags).", + "gcp-firewall-create-3": "Digite \"0.0.0.0/0\" no campo \"Intervalos de IP de origem\" (Source IP ranges).", + "gcp-firewall-create-4": "Em \"Protocolos e portas\" (Protocols and ports), selecione \"Permitir todos\" (Allow all).", + "gcp-name-your-project": "Digite um nome para seu projeto no campo \"Nome do projeto\" (Project name).", + "gcp-project-setup-error": "Ocorreu um erro ao configurar seu projeto do Google Cloud.", + "gcp-select-machine-type": "Selecione \"f1-micro\" em \"Tipo de máquina\" (Machine type).", + "gcp-select-networking": "Clique em \"Gerenciamento, segurança, discos, rede, locatário único\" (Management, security, disks, networking, sole tenancy) e depois em \"Rede\" (Networking)", + "gcp-select-region": "Selecione uma região perto de onde os usuários do servidor estarão em \"Região\" (Region).", + "gcp-type-network-tag": "Digite \"outline\" no campo \"Tags de rede\" (Network tags).", + "gcp-type-outline-server": "Digite \"outline-server\" no campo \"Nome\" (Name).", + "geo-amsterdam": "Amsterdã", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Condado de Changhua", + "geo-delhi": "Délhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jacarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londres", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "Nova York", + "geo-northern-virginia": "Norte da Virgínia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "São Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seul", + "geo-sg": "Cingapura", + "geo-south-carolina": "Carolina do Sul", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tóquio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsóvia", + "geo-zurich": "Zurique", + "key": "Chave {keyId}", + "manual-server-assign-firewall": "Atribuir regra de firewall", + "manual-server-assign-group": "Atribuir grupo de segurança", + "manual-server-create-firewall": "Criar uma regra de firewall", + "manual-server-create-group": "Criar um grupo de segurança", + "manual-server-description": "Estas etapas facilitam a instalação do Outline em um {cloudProvider} servidor Linux.", + "manual-server-firewall": "Configurar seu firewall", + "manual-server-install-paste": "Cole o resultado da instalação aqui.", + "manual-server-install-run": "Faça login no servidor e execute este comando.", + "manual-server-instructions": "Instruções", + "manual-server-show-me": "Mostrar onde", + "manual-server-title": "Siga as instruções abaixo", + "metrics-description": "Compartilhe métricas anonimizadas para melhorar a confiabilidade e o desempenho do Outline para você e outras pessoas que usam seu servidor. {openLink}Saiba mais.{closeLink}", + "metrics-share": "Compartilhar métricas", + "metrics-skip": "Pular", + "metrics-title": "Compartilhamento de métricas", + "nav-about": "Sobre", + "nav-data-collection": "Coleta de dados", + "nav-feedback": "Feedback", + "nav-help": "Ajuda", + "nav-licenses": "Licenças", + "nav-privacy": "Privacidade", + "nav-terms": "Termos", + "no-data-limit": "Sem limite", + "notification-app-update": "Foi feito o download de uma versão atualizada do Outline Manager. Ela será instalada quando você reiniciar o aplicativo.", + "notification-feedback-thanks": "Agradecemos seu feedback para melhorar o Outline.", + "notification-key-added": "Chave adicionada", + "notification-key-removed": "Chave removida", + "notification-server-destroyed": "Servidor destruído", + "notification-server-exists": "O servidor já foi adicionado", + "notification-server-removed": "Servidor removido", + "oauth-account-active": "Sua conta da DigitalOcean foi ativada.", + "oauth-account-active-tag": "A conta foi ativada. Carregando locais do servidor...", + "oauth-activate-account": "Ativar sua conta da DigitalOcean", + "oauth-billing": "Digite suas informações de faturamento em digitalocean.com e retorne ao app quando terminar.", + "oauth-billing-tag": "Digite as informações de faturamento...", + "oauth-connect-description": "Quando o Outline tem acesso à sua conta, é fácil criar um servidor e se conectar.", + "oauth-connect-tag": "Aguardando para conectar sua conta...", + "oauth-connect-title": "Faça login ou crie uma conta com a DigitalOcean.", + "oauth-sign-out": "Sair", + "oauth-verify": "Verifique se você recebeu um e-mail da DigitalOcean e clique no link incluído para confirmar sua conta.", + "oauth-verify-tag": "Confirme seu e-mail...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Definir um limite de dados personalizado", + "per-key-data-limit-dialog-title": "Limite de dados: {keyName}", + "region-best-value": "Melhor custo-benefício", + "region-description": "Esse local proporcionará seu acesso à Internet.", + "region-setup": "Configurar o Outline", + "region-title": "Selecione o local do seu servidor.", + "remove": "Remover", + "retry": "Tentar novamente", + "save": "Salvar", + "saved": "Salvo", + "saving": "Salvando...", + "server-access": "Acesso ao servidor", + "server-access-key-new": "Adicionar nova chave", + "server-access-key-rename": "Renomear", + "server-access-keys": "Chaves de acesso", + "server-connections": "Conexões", + "server-data-transfer": "Dados transferidos / últimos 30 dias", + "server-data-used": "Limite usado / últimos 30 dias", + "server-destroy": "Destruir o servidor", + "server-help-access-key-description": "Compartilhe as chaves de acesso com os amigos para eles se conectarem ao seu servidor do Outline. Eles podem usar a mesma chave de acesso em todos os dispositivos.", + "server-help-access-key-next": "Próxima", + "server-help-access-key-title": "Crie chaves, compartilhe o acesso", + "server-help-connection-description": "Clique aqui para instalar o app cliente do Outline usando sua chave de acesso pessoal com o servidor do Outline.", + "server-help-connection-ok": "Ok.", + "server-help-connection-title": "Não há conexão ainda.", + "server-keys": "Chaves", + "server-my-access-key": "Minha chave de acesso", + "server-name": "Servidor do Outline {serverLocation}", + "server-remove": "Remover o servidor", + "server-settings": "Configurações", + "server-unreachable": "Sem acesso ao servidor", + "server-unreachable-description": "Estamos com problemas de conexão com este servidor.", + "server-unreachable-managed-description": "Tente novamente ou remova este servidor do aplicativo.", + "server-unreachable-manual-description": "Tente novamente ou destrua este servidor e o host virtual.", + "server-usage": "Uso (últimos 30 dias)", + "servers-add": "Adicionar servidor", + "servers-digitalocean": "Servidores da DigitalOcean", + "servers-gcp": "Servidores do Google Cloud Platform", + "servers-manual": "Servidores", + "settings-access-key-port": "Porta para as novas chaves de acesso", + "settings-metrics-header": "Compartilhar métricas anônimas", + "settings-server-api-url": "URL da API de gerenciamento", + "settings-server-cost": "Custo mensal", + "settings-server-creation": "Criado em", + "settings-server-hostname": "Nome do host", + "settings-server-id": "Código do servidor", + "settings-server-info": "Informações do servidor", + "settings-server-location": "Local do servidor", + "settings-server-name": "Nome", + "settings-server-rename": "Defina um novo nome para o servidor. Observe que ele não aparecerá nos dispositivos dos usuários que você convidou para se conectar.", + "settings-server-version": "Versão do servidor", + "settings-transfer-limit": "Limite de transferência de dados", + "setup-action": "Configurar", + "setup-advanced": "Avançadas", + "setup-anywhere": "Configure o Outline em qualquer lugar", + "setup-cancel": "Cancelamento a qualquer hora", + "setup-create": "Criar servidor", + "setup-description": "Não tem um servidor? Crie uma conta com a DigitalOcean.", + "setup-do-cost": "Apenas USD 6 por mês", + "setup-do-create": "Com mais US$ 6, você cria um novo servidor com sua conta da DigitalOcean por 30 dias com transferência de dados de 1 TB.", + "setup-do-data": "Transferência de dados de até 1 TB", + "setup-do-description": "Isso pode demorar alguns minutos. Você pode destruir este servidor a qualquer momento.", + "setup-do-easiest": "Processo de configuração mais fácil", + "setup-do-title": "Configuração do Outline.", + "setup-firewall-instructions": "Instruções de firewall", + "setup-gcp-create": "Crie um servidor com sua Conta do Google. Os custos variam de acordo com o uso e o local.", + "setup-gcp-easy": "Processo de configuração fácil", + "setup-gcp-free-tier": "Com o {openLinkFreeTier}Nível gratuito{closeLink}, seu primeiro servidor custa apenas {openLinkIpPrice}US$ 3/mês{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Teste gratuito de 90 dias{closeLink} para novos usuários", + "setup-gcp-promo": "Conheça o novo processo automático de criação de servidor do Outline para o Google Cloud.", + "setup-recommended": "Recomendado", + "setup-simple-commands": "Comandos de instalação simples", + "setup-step-by-step": "Guia de configuração passo a passo", + "setup-tested": "Testado no VULTR, no Linode e no Liquid Web", + "setup-title": "Escolha um serviço de nuvem para configurar o Outline.", + "share-description": "Copie e envie este convite em uma ferramenta de comunicação confiável. {openLink}Precisa de ajuda?{closeLink}", + "share-invite-access-key-copied": "Chave de acesso copiada para a área de transferência", + "share-invite-copied": "Convite copiado para a área de transferência", + "share-invite-copy": "Copiar convite", + "share-invite-copy-access-key": "Copiar chave de acesso", + "share-invite-html": "Use este servidor para acessar a Internet aberta com segurança:

1) Faça o download e instale o app Outline no seu dispositivo:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Link alternativo para Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Você vai receber uma chave de acesso que começa com ss://. Assim que receber, copie a chave de acesso.

3) Abra o app cliente do Outline. Caso sua chave de acesso seja detectada automaticamente, toque em \"Conectar\" e continue. Se ela não for detectada automaticamente, cole a chave de acesso no campo, toque em \"Conectar\" e continue.

Você já pode usar a Internet aberta. Para garantir que você se conectou ao servidor, tente pesquisar \"qual é meu IP\" na Pesquisa Google. O endereço IP mostrado no Google deve corresponder ao endereço que aparece no app cliente do Outline.

Para mais informações sobre o Outline, acesse: https://getoutline.org/", + "share-invite-instructions": "Siga as instruções do convite no GitHub:", + "share-invite-trouble": "Está com problemas para acessar o link de convite?", + "share-title": "Compartilhar acesso", + "survey-data-limits-title": "Ajude-nos a melhorar os limites de dados", + "survey-decline": "Recusar", + "survey-disclaimer": "Após clicar em \"Continuar\", você verá uma breve pesquisa no Formulários Google. Recomendamos que você se conecte com o Outline antes de respondê-la.", + "survey-go-to-survey": "Acesse a pesquisa", + "terms-of-service": "Li e entendi os {openLink}Termos de Serviço do Outline{closeLink}" +} diff --git a/server_manager/messages/pt-PT.json b/server_manager/messages/pt-PT.json new file mode 100644 index 0000000000..a550e4e358 --- /dev/null +++ b/server_manager/messages/pt-PT.json @@ -0,0 +1,275 @@ +{ + "about-outline": "O Outline é um projeto de código aberto criado pela Jigsaw para disponibilizar às novas organizações e aos jornalistas uma forma mais segura de aceder à Internet.

O Outline é baseado na tecnologia do Shadowsocks e ainda é um produto de fase inicial. Pode contribuir para o código em GitHub, e seguir-nos no Reddit e no Medium para ficar a saber quando expandirmos para mais plataformas e adicionarmos novas funcionalidades.", + "about-version": "Versão {version}", + "aws-lightsail-firewall-0": "Navegue para o ecrã de instâncias do {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Clique na instância na qual quer alojar o Outline.", + "aws-lightsail-firewall-2": "Navegue para o separador \"Trabalhar em rede\" (Networking).", + "aws-lightsail-firewall-3": "Na secção \"Firewall\", clique em \"Adicionar outra\" (Add another).", + "aws-lightsail-firewall-4": "Defina o valor \"Aplicação\" (Application) como \"Todos TCP+UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Clique em \"Guardar\".", + "cancel": "Cancelar", + "close": "Fechar", + "confirmation-server-destroy": "Os utilizadores existentes vão deixar de ter acesso. Não é possível anular esta ação.", + "confirmation-server-destroy-title": "Quer destruir o servidor?", + "confirmation-server-remove": "Esta ação remove o seu servidor do Gestor Outline, mas não bloqueia o acesso dos utilizadores ao proxy. Ainda necessita de eliminar manualmente o servidor do Outline do computador anfitrião.", + "confirmation-server-remove-title": "Remover o servidor?", + "data-limit": "Limite de dados", + "data-limit-per-key": "Limite de dados por chave", + "data-limits": "Limites de dados", + "data-limits-description": "Defina um limite máximo de transferência de dados para 30 dias para as chaves de acesso neste servidor.", + "data-limits-dialog-text": "Aceda ao separador Definições para definir um limite de transferência de dados para as chaves de acesso neste servidor.", + "data-limits-dialog-title": "Evite utilizações excessivas de dados", + "data-limits-disclaimer": "Como está a comunicar métricas, a utilização da funcionalidade de limite de dados será incluída. Consulte a {openLink}Política de Recolha de Dados{closeLink} para obter mais detalhes.", + "data-limits-usage": "{used} de {total} utilizado(s)", + "destroy": "Destruir", + "digitalocean-disconnect-account": "Desassocie a conta do DigitalOcean", + "digitalocean-unreachable": "Este erro pode dever-se a uma firewall na sua rede ou a problemas de conetividade temporários com digitalocean.com.", + "disabled": "Desativadas", + "disconnect": "Desligar", + "done": "Concluído", + "enabled": "Ativadas", + "error-connectivity": "Estamos com dificuldades em associar a sua conta do DigitalOcean. Por vezes, trata-se de um problema temporário do DigitalOcean ou da sua ligação à Internet. Se tentar novamente não funcionar, voltar a iniciar sessão no DigitalOcean deverá solucionar o problema.", + "error-connectivity-title": "Problema de ligação", + "error-do-account-info": "Falha ao obter as informações da conta do DigitalOcean.", + "error-do-auth": "Falha ao efetuar a autenticação no DigitalOcean.", + "error-do-limit": "A sua conta do DigitalOcean atingiu o respetivo limite de {num} Droplets. Pode pedir um aumento em https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Falha ao obter a lista de regiões disponíveis.", + "error-do-warning": "Aviso do DigitalOcean: \"{message}\"", + "error-feedback": "Falha ao enviar comentários. Tente novamente.", + "error-gcp-auth": "Falha na autenticação com a Google Cloud Platform", + "error-hostname-invalid": "Tem de ser um endereço IP ou um nome de anfitrião válido.", + "error-key-add": "Falha ao adicionar uma chave.", + "error-key-remove": "Falha ao remover a chave.", + "error-key-rename": "Falha ao mudar o nome da chave.", + "error-keys-get": "Não foi possível carregar as chaves.", + "error-keys-port-bad-input": "A porta tem de ser um número inteiro entre 1 e 65.535.", + "error-keys-port-in-use": "A porta já está a ser utilizada no servidor.", + "error-licenses": "Não foi possível carregar as licenças.", + "error-metrics": "Erro ao ativar as métricas.", + "error-network": "Ocorreu um erro de rede.", + "error-not-saved": "Não foi guardada.", + "error-remove-data-limit": "Não foi possível desativar o limite de dados predefinido", + "error-remove-per-key-limit": "Não foi possível remover o limite de dados desta token de acesso", + "error-server-creation": "Ocorreu um erro ao criar o seu servidor do Outline.", + "error-server-destroy": "Falha ao destruir o servidor.", + "error-server-removed": "O servidor {serverName} já não existe na sua conta do DigitalOcean.", + "error-server-rename": "Falha ao mudar o nome do servidor.", + "error-server-unreachable": "O seu servidor do Outline foi instalado corretamente, mas não conseguimos ligar ao mesmo. É muito provável que as regras de firewall do servidor estejam a bloquear ligações recebidas. Reveja-as e certifique-se de que permite ligações TCP recebidas nas portas de 1024 a 65535.", + "error-server-unreachable-title": "Não é possível ligar ao seu servidor do Outline", + "error-servers-removed": "Os servidores {serverNames} já não existem na sua conta do DigitalOcean.", + "error-set-data-limit": "Não foi possível predefinir o limite de dados", + "error-set-per-key-limit": "Não foi possível definir o limite de dados para esta token de acesso", + "error-unexpected": "Ocorreu um erro inesperado.", + "experimental": "Experimental", + "experiments": "Experiências", + "experiments-description": "Teste funcionalidades novas e envie-nos comentários antes de serem lançadas.", + "experiments-disclaimer": "As Experiências estão em fase de desenvolvimento e podem ser alteradas ou removidas da app. Se atualmente comunica métricas, a utilização das funcionalidades experimentais será incluída. Consulte a {openLink}Política de Recolha de Dados{closeLink} para obter mais detalhes.", + "experiments-feedback": "Tem sugestões? {openLink}Envie comentários aqui.{closeLink}", + "feedback-cloud-provider": "Selecione o fornecedor de nuvem", + "feedback-cloud-provider-error": "Selecione um fornecedor de nuvem.", + "feedback-connection": "Não consigo ligar-me ao meu servidor", + "feedback-connection-others": "Outros utilizadores não conseguem ligar-se ao meu servidor", + "feedback-disclaimer": "Tenha em atenção que a nossa equipa apenas poderá responder a comentários em inglês.", + "feedback-email": "Endereço de email (opcional)", + "feedback-error": "Introduza os comentários.", + "feedback-explanation-install": "Ocorreu um erro ao tentar instalar o Outline no seu servidor. Se não conseguiu encontrar uma solução, considere enviar-nos comentários e indicar-nos o seu endereço de email (opcional) para que possamos entrar em contacto consigo.", + "feedback-general": "Feedback geral", + "feedback-install": "Dificuldades em instalar o Outline", + "feedback-label": "Os seus comentários", + "feedback-management": "Dificuldades em gerir o meu servidor", + "feedback-other": "Outro", + "feedback-privacy": "Os seus comentários, o endereço de email (se fornecido) e as informações adicionais referidas na {openLink}Política de Privacidade{closeLink} serão enviados para a equipa do Outline.", + "feedback-submit": "Enviar", + "feedback-suggestion": "Sugestões", + "feedback-title-generic": "Envie comentários", + "feedback-title-install": "Falha ao instalar o servidor do Outline", + "gcp-billing-action": "Seguinte", + "gcp-billing-body": "A aguardar pela {openLink}adição de uma conta de faturação no Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Abra a página de faturação da Cloud Console{closeLink} e adicione uma conta para continuar.", + "gcp-billing-error": "Não é possível obter informações de faturação", + "gcp-billing-error-zero": "Tem de adicionar uma conta de faturação antes de continuar.", + "gcp-click-create": "Clique em \"Criar\" (Create).", + "gcp-create-new-project": "{openLink}Criar um novo projeto do Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Criar uma nova instância de VM{closeLink}.", + "gcp-create-project": "Crie um projeto do Google Cloud", + "gcp-create-server": "Crie o projeto do Google Cloud", + "gcp-create-vm": "Crie uma instância de VM", + "gcp-disconnect-account": "Desassocie a conta da Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Adicione uma nova regra de firewall{closeLink} ao seu projeto do Compute Engine.", + "gcp-firewall-create-1": "Escreva \"outline\" no campo \"Nome\" (Name).", + "gcp-firewall-create-2": "Escreva \"outline'\" no campo \"Etiquetas alvo\" (Target tags).", + "gcp-firewall-create-3": "Escreva \"0.0.0.0/0\" no campo \"Intervalos IP de origem\" (Source IP ranges).", + "gcp-firewall-create-4": "Selecione \"Permitir tudo\" (Allow all) em \"Protocolos e portas\" (Protocols and ports).", + "gcp-name-your-project": "Dê um nome ao projeto no campo \"Nome do projeto\" (Project name).", + "gcp-project-setup-error": "Ocorreu um erro ao configurar o seu projeto do Google Cloud", + "gcp-select-machine-type": "Selecione \"f1-micro\" em \"Tipo de máquina\" (Machine type).", + "gcp-select-networking": "Clique em \"Gestão, segurança, discos, trabalhar em rede, arrendamento único\" (Management, security, disks, networking, sole tenancy) e, em seguida, clique em \"Trabalhar em rede\" (Networking).", + "gcp-select-region": "Selecione uma região perto de onde se encontram os utilizadores do servidor em \"Região\" (Region).", + "gcp-type-network-tag": "Escreva \"outline\" no campo \"Etiquetas de rede\" (Network tags).", + "gcp-type-outline-server": "Escreva \"servidor-outline\" no campo \"Nome\" (Name).", + "geo-amsterdam": "Amesterdão", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Condado de Changhua", + "geo-delhi": "Déli", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jacarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londres", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "Nova Iorque", + "geo-northern-virginia": "Virgínia do Norte", + "geo-oregon": "Óregon", + "geo-osaka": "Osaca", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "São Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seul", + "geo-sg": "Singapura", + "geo-south-carolina": "Carolina do Sul", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tóquio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varsóvia", + "geo-zurich": "Zurique", + "key": "Chave {keyId}", + "manual-server-assign-firewall": "Atribua a regra de firewall", + "manual-server-assign-group": "Atribua o grupo de segurança", + "manual-server-create-firewall": "Crie uma regra de firewall", + "manual-server-create-group": "Crie um grupo de segurança", + "manual-server-description": "Estes passos ajudam a instalar o Outline num servidor Linux de {cloudProvider}", + "manual-server-firewall": "Configure a sua firewall", + "manual-server-install-paste": "Cole o resultado da instalação aqui", + "manual-server-install-run": "Inicie sessão no seu servidor e execute este comando", + "manual-server-instructions": "Instruções", + "manual-server-show-me": "Mostrar-me a localização", + "manual-server-title": "Siga as instruções abaixo", + "metrics-description": "Partilhe métricas anonimizadas para ajudar a melhorar a fiabilidade e o desempenho do Outline, para si e para aqueles com quem partilha o servidor. {openLink}Saiba mais{closeLink}", + "metrics-share": "Partilhar métricas", + "metrics-skip": "Ignorar", + "metrics-title": "Partilha de métricas", + "nav-about": "Acerca de", + "nav-data-collection": "Recolha de dados", + "nav-feedback": "Feedback", + "nav-help": "Ajuda", + "nav-licenses": "Licenças", + "nav-privacy": "Privacidade", + "nav-terms": "Termos", + "no-data-limit": "Nenhum", + "notification-app-update": "Foi transferida uma versão atualizada do Gestor Outline. Será instalada quando reiniciar a aplicação.", + "notification-feedback-thanks": "Obrigado por nos ajudar a melhorar! Agradecemos a sua opinião.", + "notification-key-added": "Chave adicionada", + "notification-key-removed": "Chave removida", + "notification-server-destroyed": "Servidor destruído", + "notification-server-exists": "O servidor já foi adicionado.", + "notification-server-removed": "Servidor removido", + "oauth-account-active": "A sua conta do DigitalOcean foi ativada.", + "oauth-account-active-tag": "A conta foi ativada! A carregar as localizações de servidor…", + "oauth-activate-account": "Ative a sua conta do DigitalOcean", + "oauth-billing": "Introduza as suas informações de faturação em digitalocean.com e volte à aplicação quando tiver terminado.", + "oauth-billing-tag": "Introduza as informações de faturação…", + "oauth-connect-description": "O Outline simplifica a criação de um servidor e a ligação com a sua conta", + "oauth-connect-tag": "A aguardar a associação da sua conta…", + "oauth-connect-title": "Inicie sessão ou crie uma conta no DigitalOcean", + "oauth-sign-out": "Terminar sessão", + "oauth-verify": "Verifique se recebeu um email do DigitalOcean na caixa de entrada e clique no link aí indicado para confirmar a sua conta.", + "oauth-verify-tag": "Confirme o seu email…", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Defina um limite de dados personalizado", + "per-key-data-limit-dialog-title": "Limite de dados - {keyName}", + "region-best-value": "Melhor oferta", + "region-description": "Esta é a localização de origem do seu acesso à Internet.", + "region-setup": "Configurar o Outline", + "region-title": "Selecione a localização do seu servidor", + "remove": "Remover", + "retry": "Tentar novamente", + "save": "Guardar", + "saved": "Guardada", + "saving": "A guardar…", + "server-access": "Acesso ao servidor", + "server-access-key-new": "Adicionar nova chave", + "server-access-key-rename": "Mudar o nome", + "server-access-keys": "Chaves de acesso", + "server-connections": "Ligações", + "server-data-transfer": "Dados transferidos / últimos 30 dias", + "server-data-used": "Limite utilizado / últimos 30 dias", + "server-destroy": "Destruir servidor", + "server-help-access-key-description": "Partilhe chaves de acesso com amigos, para que estes possam ligar-se ao seu servidor do Outline. Podem utilizar a mesma token de acesso em todos os seus dispositivos.", + "server-help-access-key-next": "Seguinte", + "server-help-access-key-title": "Crie chaves e partilhe o acesso", + "server-help-connection-description": "Clique aqui para instalar a aplicação cliente Outline com a sua token de acesso pessoal do servidor do Outline.", + "server-help-connection-ok": "Compreendido", + "server-help-connection-title": "Ainda não está ligado!", + "server-keys": "Chaves", + "server-my-access-key": "A minha chave de acesso", + "server-name": "Servidor {serverLocation} do Outline", + "server-remove": "Remover servidor", + "server-settings": "Definições", + "server-unreachable": "Servidor inacessível", + "server-unreachable-description": "Estamos com dificuldades em ligar a este servidor.", + "server-unreachable-managed-description": "Tente novamente ou remova este servidor da aplicação", + "server-unreachable-manual-description": "Tente novamente ou destrua este servidor e o anfitrião virtual", + "server-usage": "Utilização (últimos 30 dias)", + "servers-add": "Adicionar servidor", + "servers-digitalocean": "Servidores do DigitalOcean", + "servers-gcp": "Servidores da Google Cloud Platform", + "servers-manual": "Servidores", + "settings-access-key-port": "Porta para novas chaves de acesso", + "settings-metrics-header": "Partilhe métricas anónimas", + "settings-server-api-url": "URL da API de gestão", + "settings-server-cost": "Custo mensal", + "settings-server-creation": "Criado", + "settings-server-hostname": "Nome do anfitrião", + "settings-server-id": "ID do servidor", + "settings-server-info": "Informações do servidor", + "settings-server-location": "Localização do servidor", + "settings-server-name": "Nome", + "settings-server-rename": "Defina um novo nome para o seu servidor. Tenha em atenção que esta ação não será refletida nos dispositivos dos utilizadores que convidou a ligarem-se ao mesmo.", + "settings-server-version": "Versão do servidor", + "settings-transfer-limit": "Limite de transferência de dados", + "setup-action": "Configurar", + "setup-advanced": "Avançadas", + "setup-anywhere": "Configure o Outline em qualquer lugar", + "setup-cancel": "Pode cancelar em qualquer altura", + "setup-create": "Criar servidor", + "setup-description": "Não tem um servidor? Crie uma conta no DigitalOcean.", + "setup-do-cost": "Apenas 6 USD por mês", + "setup-do-create": "Crie um novo servidor com a sua conta do DigitalOcean mediante o pagamento de uma taxa adicional de 6 USD/30 dias por 1 TB de transferência de dados.", + "setup-do-data": "Limite de transferência de dados de 1 TB", + "setup-do-description": "Esta ação pode demorar vários minutos. Pode destruir este servidor em qualquer altura.", + "setup-do-easiest": "Processo de configuração mais simples", + "setup-do-title": "A configurar o Outline…", + "setup-firewall-instructions": "Instruções de firewall", + "setup-gcp-create": "Crie um novo servidor com a sua Conta Google. Os custos variam consoante a localização e a utilização.", + "setup-gcp-easy": "Processo de configuração simples", + "setup-gcp-free-tier": "Com o {openLinkFreeTier}Nível gratuito{closeLink}, o primeiro servidor tem um preço de partida de {openLinkIpPrice}3 USD/mês{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Avaliação gratuita de 90 dias{closeLink} para novos utilizadores", + "setup-gcp-promo": "Experimente o novo processo automático de criação de servidor do Outline para o Google Cloud", + "setup-recommended": "Recomendado", + "setup-simple-commands": "Comandos de instalação simples", + "setup-step-by-step": "Guia de configuração passo a passo", + "setup-tested": "Testado em VULTR, Linode e Liquid Web", + "setup-title": "Escolha um serviço na nuvem para configurar o Outline", + "share-description": "Copie este convite e envie-o a partir de uma ferramenta de comunicação da sua confiança. {openLink}Necessita de ajuda?{closeLink}", + "share-invite-access-key-copied": "Chave de acesso copiada para a área de transferência", + "share-invite-copied": "Convite copiado para a área de transferência", + "share-invite-copy": "Copiar convite", + "share-invite-copy-access-key": "Copiar token de acesso", + "share-invite-html": "Use este servidor para aceder de forma segura à Internet aberta:

1) Transfira e instale a app Outline no seu dispositivo:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Link alternativo do Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Vai receber umo token de acesso que começa por ss://. Depois de receber o token de acesso, copie-a.

3) Abra a app cliente Outline. Se o token de acesso for detetada automaticamente, toque em \"Ligar\" e continue. Se o token de acesso não for detetada automaticamente, cole-a no campo e, em seguida, toque em \"Ligar\" e continue.

Tem tudo pronto para usar a Internet aberta! Para garantir que estabeleceu ligação ao servidor com êxito, experimente pesquisar \"qual é o meu IP\" na Pesquisa Google. O endereço IP apresentado no Google deve corresponder ao endereço IP no cliente Outline.

Saiba mais sobre o Outline aqui: https://getoutline.org/", + "share-invite-instructions": "Siga as instruções de convite no GitHub:", + "share-invite-trouble": "Está com dificuldades em aceder ao link do convite?", + "share-title": "Partilhe o acesso", + "survey-data-limits-title": "Ajude-nos a compreender como podemos melhorar os limites de dados", + "survey-decline": "Recusar", + "survey-disclaimer": "Ao clicar em Continuar, será redirecionado para um pequeno inquérito sobre o Google Forms. Recomendamos que responda ao inquérito enquanto está ligado ao Outline.", + "survey-go-to-survey": "Ir para o inquérito", + "terms-of-service": "Li e compreendi os {openLink}Termos de Utilização do Outline{closeLink}" +} diff --git a/server_manager/messages/ro.json b/server_manager/messages/ro.json new file mode 100644 index 0000000000..48b27b4e52 --- /dev/null +++ b/server_manager/messages/ro.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline este un proiect open source creat de Jigsaw pentru a oferi organizațiilor de știri și jurnaliștilor o modalitate mai sigură de accesare a internetului.

Outline este un produs Shadowsocks și se află încă în fază incipientă. Puteți să contribuiți la codificare în GitHub și să ne urmăriți pe Reddit și Medium pentru a afla când ne extindem pe mai multe platforme și adăugăm funcții noi.", + "about-version": "Versiunea {version}", + "aws-lightsail-firewall-0": "Navigați la ecranul cu variante {openLink}Amazon Lightsail{closeLink}", + "aws-lightsail-firewall-1": "Dați clic pe varianta în care doriți să găzduiți Outline.", + "aws-lightsail-firewall-2": "Navigați la fila „Networking”.", + "aws-lightsail-firewall-3": "În secțiunea „Firewall”, dați clic pe „Adăugați altul” (Add another).", + "aws-lightsail-firewall-4": "Setați valoarea „Aplicație” (Application) ca „Toate TCP+UDP” (All TCP+UDP).", + "aws-lightsail-firewall-5": "Dați clic pe „Salvați” (Save).", + "cancel": "Anulați", + "close": "Închideți", + "confirmation-server-destroy": "Utilizatorii existenți nu vor mai avea acces. Acțiunea nu poate fi anulată.", + "confirmation-server-destroy-title": "Distrugeți serverul?", + "confirmation-server-remove": "Acțiunea elimină serverul din Outline Manager, dar nu blochează accesul utilizatorilor prin serverul proxy. Va trebui să ștergeți manual serverul Outline de pe mașina gazdă.", + "confirmation-server-remove-title": "Eliminați serverul?", + "data-limit": "Limită de date", + "data-limit-per-key": "Limită de date pentru fiecare cheie", + "data-limits": "Limite de date", + "data-limits-description": "Setați o limită de transfer de date timp de 30 de zile pentru cheile de acces de pe acest server.", + "data-limits-dialog-text": "Accesați fila Setări pentru a stabili o limită pentru transferul de date aferent cheilor de acces pe acest server.", + "data-limits-dialog-title": "Evitați surplusul de date", + "data-limits-disclaimer": "Deoarece în prezent raportați valori, se va include și utilizarea funcției de limite de date. Consultați {openLink}politica de colectare a datelor{closeLink} pentru a afla mai multe detalii.", + "data-limits-usage": "Se utilizează {used} din {total}", + "destroy": "Distrugeți", + "digitalocean-disconnect-account": "Deconectați contul DigitalOcean", + "digitalocean-unreachable": "Este posibil ca eroarea să fie cauzată de un firewall din rețeaua dvs. sau de probleme temporare de conectare la digitalocean.com.", + "disabled": "Dezactivată", + "disconnect": "Deconectați", + "done": "Gata", + "enabled": "Activată", + "error-connectivity": "Au apărut probleme la conectarea la contul DigitalOcean. Uneori, aceasta este o problemă temporară legată de DigitalOcean sau de conexiunea dvs. la internet. Dacă reîncercați și nu funcționează, conectați-vă din nou la DigitalOcean și problema ar trebui să se rezolve.", + "error-connectivity-title": "Problemă de conexiune", + "error-do-account-info": "Informațiile contului DigitalOcean nu au putut fi preluate.", + "error-do-auth": "Nu s-a realizat autentificarea cu DigitalOcean", + "error-do-limit": "Contul DigitalOcean a atins limita de {num} de Droplets. Puteți solicita o mărire la https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Nu s-a obținut lista cu regiunile disponibile", + "error-do-warning": "Avertisment DigitalOcean: {message}", + "error-feedback": "Nu s-a trimis feedback. Încercați din nou.", + "error-gcp-auth": "Nu s-a realizat autentificarea cu Google Cloud Platform", + "error-hostname-invalid": "Trebuie să fie o adresă IP sau un nume de gazdă valid.", + "error-key-add": "Cheia nu a fost adăugată.", + "error-key-remove": "Cheia nu a fost eliminată.", + "error-key-rename": "Cheia nu a fost redenumită.", + "error-keys-get": "Cheile nu au putut fi încărcate.", + "error-keys-port-bad-input": "Portul trebuie să fie un număr întreg între 1 și 65.535.", + "error-keys-port-in-use": "Portul este deja în uz pe server.", + "error-licenses": "Licențele nu au putut fi încărcate.", + "error-metrics": "Eroare la activarea valorilor", + "error-network": "A apărut o eroare de rețea.", + "error-not-saved": "Nu s-a salvat", + "error-remove-data-limit": "Limita de date prestabilită nu a putut fi dezactivată.", + "error-remove-per-key-limit": "Limita de date pentru această cheie de acces nu a putut fi eliminată.", + "error-server-creation": "A apărut o eroare la crearea serverului Outline.", + "error-server-destroy": "Serverul nu a putut fi distrus", + "error-server-removed": "{serverName} nu mai este prezent în contul DigitalOcean.", + "error-server-rename": "Nu s-a redenumit serverul.", + "error-server-unreachable": "Serverul dvs. Outline a fost instalat corect, dar nu se poate realiza conexiunea la acesta. Cel mai probabil, acest lucru se întâmplă deoarece regulile pentru firewallul serverului blochează conexiunile primite. Examinați regulile și asigurați-vă că sunt permise conexiunile TCP primite pe porturile de la 1024 la 65535.", + "error-server-unreachable-title": "Nu se poate stabili conexiunea la serverul dvs. Outline", + "error-servers-removed": "{serverNames} nu mai sunt prezente în contul DigitalOcean.", + "error-set-data-limit": "Nu s-a putut seta limita de date prestabilită", + "error-set-per-key-limit": "Nu se poate seta o limită pentru datele aferente acestei chei de acces", + "error-unexpected": "A apărut o eroare neașteptată.", + "experimental": "Experimentală", + "experiments": "Experimente", + "experiments-description": "Testați funcții noi și trimiteți-ne feedback înainte de lansarea acestora.", + "experiments-disclaimer": "Experimentele sunt în curs de dezvoltare și este posibil să fie modificate sau eliminate din aplicație. Dacă în prezent raportați valori, se va include și utilizarea funcțiilor experimentale. Consultați {openLink}politica de colectare a datelor{closeLink} pentru a afla mai multe detalii.", + "experiments-feedback": "Aveți sugestii? {openLink}Trimiteți feedback aici.{closeLink}", + "feedback-cloud-provider": "Selectați furnizorul de servicii de cloud", + "feedback-cloud-provider-error": "Selectați un furnizor de servicii de cloud.", + "feedback-connection": "Nu mă pot conecta la serverul meu", + "feedback-connection-others": "Ceilalți nu se pot conecta la serverul meu", + "feedback-disclaimer": "Rețineți că echipa noastră poate răspunde la feedback numai în engleză.", + "feedback-email": "Adresă de e-mail (opțional)", + "feedback-error": "Introduceți feedbackul", + "feedback-explanation-install": "A apărut o eroare la încercarea de instalare a aplicației Outline pe server. Dacă nu ați reușit să găsiți o soluție, puteți să ne trimiteți feedback și să ne comunicați adresa dvs. de e-mail (opțional) pentru a vă putea răspunde.", + "feedback-general": "Feedback general", + "feedback-install": "Am probleme legate de instalarea aplicației Outline", + "feedback-label": "Feedbackul dvs.", + "feedback-management": "Am probleme cu administrarea serverului", + "feedback-other": "Altul", + "feedback-privacy": "Feedbackul, adresa dvs. de e-mail (dacă ați specificat-o) și informațiile suplimentare la care se face referire în {openLink}politica de confidențialitate{closeLink} vor fi trimise echipei Outline.", + "feedback-submit": "Trimiteți", + "feedback-suggestion": "Sugestii", + "feedback-title-generic": "Trimiteți feedback", + "feedback-title-install": "Serverul Outline nu a fost instalat", + "gcp-billing-action": "Înainte", + "gcp-billing-body": "Se așteaptă să {openLink}adăugați un cont de facturare în Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Deschideți pagina de facturare Cloud Console{closeLink} și adăugați un cont pentru a putea continua.", + "gcp-billing-error": "Nu se pot prelua informațiile de facturare.", + "gcp-billing-error-zero": "Trebuie să adăugați un cont de facturare înainte de a continua.", + "gcp-click-create": "Dați clic pe „Creați” (Create).", + "gcp-create-new-project": "{openLink}Creați un proiect în cloud Google nou{closeLink}.", + "gcp-create-new-vm": "{openLink}Creați o variantă VM nouă{closeLink}.", + "gcp-create-project": "Creați un proiect în Google Cloud", + "gcp-create-server": "Creați proiectul în Google Cloud", + "gcp-create-vm": "Creați o variantă VM", + "gcp-disconnect-account": "Deconectați contul Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Adăugați o regulă de firewall nouă{closeLink} în proiectul Compute Engine.", + "gcp-firewall-create-1": "Introduceți „outline” în câmpul „Nume” (Name).", + "gcp-firewall-create-2": "Introduceți „outline” în câmpul „Etichete de rețea” (Target tags).", + "gcp-firewall-create-3": "Introduceți „0.0.0.0/0” în câmpul „Intervale de adrese IP sursă” (Source IP ranges).", + "gcp-firewall-create-4": "Selectați „Permiteți tot” (Allow all) în secțiunea „Protocoale și porturi´ (Protocols and ports).", + "gcp-name-your-project": "Denumiți proiectul în câmpul „Numele proiectului” (Project name).", + "gcp-project-setup-error": "A apărut o eroare la configurarea proiectului dvs. Google Cloud.", + "gcp-select-machine-type": "Selectați „f1-micro” în „Tip de mașină” (Machine type)", + "gcp-select-networking": "Dați clic pe „Gestionare, securitate, discuri, networking, găzduire pentru o singură entitate” (Management, security, disks, networking, sole tenancy), apoi „Networking”", + "gcp-select-region": "Selectați o regiune în apropierea locației în care se află utilizatorii serverului în „Regiune” (Region).", + "gcp-type-network-tag": "Introduceți „outline” în câmpul „Etichete de rețea” (Network tags)", + "gcp-type-outline-server": "Introduceți „outline-server” în câmpul „Nume” (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua County", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londra", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Virginia de Nord", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "Carolina de Sud", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Varșovia", + "geo-zurich": "Zürich", + "key": "Cheia {keyId}", + "manual-server-assign-firewall": "Atribuiți regula de firewall", + "manual-server-assign-group": "Atribuiți un grup de securitate", + "manual-server-create-firewall": "Creați o regulă pentru firewall", + "manual-server-create-group": "Creați un grup de securitate", + "manual-server-description": "Urmați acești pași ca să instalați Outline pe un server Linux de la {cloudProvider}.", + "manual-server-firewall": "Configurați un firewall", + "manual-server-install-paste": "Inserați aici rezultatul instalării.", + "manual-server-install-run": "Conectați-vă la server și rulați comanda.", + "manual-server-instructions": "Instrucțiuni", + "manual-server-show-me": "Arată-mi unde", + "manual-server-title": "Urmați instrucțiunile de mai jos", + "metrics-description": "Trimiteți valori anonimizate pentru a contribui la îmbunătățirea fiabilității și performanței aplicației Outline, pentru dvs. și pentru cei cu care folosiți în comun serverul. {openLink}Aflați mai multe.{closeLink}", + "metrics-share": "Trimiteți valorile", + "metrics-skip": "Omiteți", + "metrics-title": "Trimiterea valorilor", + "nav-about": "Despre", + "nav-data-collection": "Colectare de date", + "nav-feedback": "Feedback", + "nav-help": "Ajutor", + "nav-licenses": "Licențe", + "nav-privacy": "Confidențialitate", + "nav-terms": "Termeni", + "no-data-limit": "Fără", + "notification-app-update": "A fost descărcată o versiune actualizată a aplicației Outline Manager. Aceasta va fi instalată când reporniți aplicația.", + "notification-feedback-thanks": "Vă mulțumim că ne ajutați să îmbunătățim produsul! Opinia dvs. este importantă pentru noi.", + "notification-key-added": "Cheia a fost adăugată", + "notification-key-removed": "Cheia a fost eliminată.", + "notification-server-destroyed": "Serverul a fost distrus", + "notification-server-exists": "Serverul a fost adăugat deja.", + "notification-server-removed": "Serverul a fost eliminat", + "oauth-account-active": "Contul DigitalOcean a fost activat.", + "oauth-account-active-tag": "Contul a fost activat! Se încarcă locațiile serverelor...", + "oauth-activate-account": "Activați contul DigitalOcean.", + "oauth-billing": "Introduceți informațiile de facturare din digitalocean.com și reveniți în aplicație după ce ați terminat.", + "oauth-billing-tag": "Introduceți informațiile de facturare...", + "oauth-connect-description": "Prin intermediul contului dvs., Outline simplifică procesul de creare a unui server și de conectare.", + "oauth-connect-tag": "Se așteaptă conectarea la cont...", + "oauth-connect-title": "Conectați-vă sau creați un cont cu DigitalOcean.", + "oauth-sign-out": "Deconectați-vă", + "oauth-verify": "Căutați în Mesaje primite un e-mail primit de la DigitalOcean și dați clic pe linkul din mesaj pentru a vă confirma contul.", + "oauth-verify-tag": "Confirmați-vă adresa de e-mail...", + "okay": "Am înțeles", + "per-key-data-limit-dialog-set-custom": "Setați o limită de date personalizată", + "per-key-data-limit-dialog-title": "Limită de date – {keyName}", + "region-best-value": "Cea mai rentabilă", + "region-description": "Veți folosi internetul din această locație.", + "region-setup": "Configurați Outline", + "region-title": "Selectați locația serverului.", + "remove": "Eliminați", + "retry": "Reîncercați", + "save": "Salvați", + "saved": "S-a salvat", + "saving": "Se salvează...", + "server-access": "Acces la server", + "server-access-key-new": "Adăugați o cheie nouă", + "server-access-key-rename": "Redenumiți", + "server-access-keys": "Chei de acces", + "server-connections": "Conexiuni", + "server-data-transfer": "Date transferate/ultimele 30 de zile", + "server-data-used": "Volumul de date utilizate/ultimele 30 de zile", + "server-destroy": "Distrugeți serverul", + "server-help-access-key-description": "Trimiteți prietenilor cheile de acces pentru a se putea conecta la serverul dvs. Outline. Ei pot folosi aceeași cheie de acces pe toate dispozitivele.", + "server-help-access-key-next": "Înainte", + "server-help-access-key-title": "Creați chei și permiteți accesul", + "server-help-connection-description": "Dați clic aici pentru a instala aplicația client Outline, folosind cheia dvs. de acces personală la serverul Outline.", + "server-help-connection-ok": "Am înțeles!", + "server-help-connection-title": "Nu v-ați conectat încă!", + "server-keys": "Chei", + "server-my-access-key": "Cheia mea de acces", + "server-name": "Server Outline {serverLocation}", + "server-remove": "Eliminați serverul", + "server-settings": "Setări", + "server-unreachable": "Serverul nu poate fi contactat", + "server-unreachable-description": "Au apărut erori la conectarea la acest server.", + "server-unreachable-managed-description": "Încercați din nou sau eliminați serverul din aplicație.", + "server-unreachable-manual-description": "Încercați din nou sau distrugeți serverul și gazda virtuală.", + "server-usage": "Utilizare (ultimele 30 de zile)", + "servers-add": "Adăugați un server", + "servers-digitalocean": "Servere DigitalOcean", + "servers-gcp": "Servere Google Cloud Platform", + "servers-manual": "Servere", + "settings-access-key-port": "Port pentru chei de acces noi", + "settings-metrics-header": "Trimiteți valorile anonime", + "settings-server-api-url": "Adresa URL a API-ului de administrare", + "settings-server-cost": "Cost lunar", + "settings-server-creation": "Creat", + "settings-server-hostname": "Nume de gazdă", + "settings-server-id": "ID-ul serverului", + "settings-server-info": "Informațiile serverului", + "settings-server-location": "Locația serverului", + "settings-server-name": "Nume", + "settings-server-rename": "Setați un nume nou pentru server. Rețineți că acesta nu va fi reflectat pe dispozitivele utilizatorilor pe care i-ați invitat să se conecteze la server.", + "settings-server-version": "Versiunea serverului", + "settings-transfer-limit": "Volumul de date transferate", + "setup-action": "Configurați", + "setup-advanced": "Avansat", + "setup-anywhere": "Configurați Outline oriunde", + "setup-cancel": "Anulați oricând", + "setup-create": "Creați un server", + "setup-description": "Nu aveți un server? Creați un cont cu DigitalOcean.", + "setup-do-cost": "Doar 6 USD pe lună", + "setup-do-create": "Creați un server nou folosind contul DigitalOcean, la un preț suplimentar de 6 USD/30 zile pentru transfer de date de 1 TB.", + "setup-do-data": "Transfer de date de 1 TB", + "setup-do-description": "Poate dura câteva minute. Puteți distruge oricând serverul.", + "setup-do-easiest": "Cel mai simplu proces de configurare", + "setup-do-title": "Se configurează Outline", + "setup-firewall-instructions": "Instrucțiuni pentru firewall", + "setup-gcp-create": "Creați un server nou folosind contul dvs. Google. Costurile variază în funcție de locație și de gradul de utilizare.", + "setup-gcp-easy": "Proces de configurare simplu", + "setup-gcp-free-tier": "Cu {openLinkFreeTier}Nivel liber{closeLink}, prețul pentru primul dvs. server începe de la {openLinkIpPrice}3 USD/lună{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Încercare gratuită timp de 90 de zile{closeLink} pentru utilizatorii noi", + "setup-gcp-promo": "Încercați noul proces de creare automată a unui server Outline pentru Google Cloud", + "setup-recommended": "Recomandate", + "setup-simple-commands": "Comenzi simple de instalare", + "setup-step-by-step": "Ghid de configurare pas cu pas", + "setup-tested": "Testat pe VULTR, Linode și Liquid Web", + "setup-title": "Alegeți un serviciu cloud pentru a configura Outline.", + "share-description": "Copiați invitația și trimiteți-o dintr-un instrument de comunicare în care aveți încredere. {openLink}Aveți nevoie de ajutor?{closeLink}", + "share-invite-access-key-copied": "Cheia de acces a fost copiată în clipboard", + "share-invite-copied": "Invitația a fost copiată în clipboard", + "share-invite-copy": "Copiați invitația", + "share-invite-copy-access-key": "Copiați cheia de acces", + "share-invite-html": "Folosiți acest server pentru a accesa în siguranță internetul liber.

1) Descărcați și instalați aplicația Outline pentru dispozitiv:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Link alternativ pentru Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Veți primi o cheie de acces care începe cu ss://. După ce o primiți, copiați cheia de acces.

3) Deschideți aplicația client Outline. În cazul în care cheia de acces este detectată automat, atingeți Conectați și continuați. Dacă cheia de acces nu este detectată automat, inserați-o în câmp, apoi atingeți Conectați și continuați.

Sunteți gata să folosiți internetul liber! Pentru a vă asigura că v-ați conectat la server, căutați „care este adresa mea IP” în Căutarea Google. Adresa IP afișată în Google trebuie să corespundă cu adresa IP din clientul Outline.

Aflați mai multe despre Outline aici: https://getoutline.org/", + "share-invite-instructions": "Urmați instrucțiunile din invitație în GitHub:", + "share-invite-trouble": "Aveți probleme la accesarea linkului de invitație?", + "share-title": "Permiteți accesul", + "survey-data-limits-title": "Contribuiți la îmbunătățirea limitelor de date", + "survey-decline": "Refuzați", + "survey-disclaimer": "Dacă dați clic pe Continuați, veți fi direcționat(ă) către un sondaj scurt despre Formulare Google. Vă recomandăm să completați sondajul fiind conectat(ă) la Outline.", + "survey-go-to-survey": "Accesați sondajul", + "terms-of-service": "Am citit și am înțeles {openLink}Termenii și condițiile Outline{closeLink}" +} diff --git a/server_manager/messages/ru.json b/server_manager/messages/ru.json new file mode 100644 index 0000000000..54aacc704a --- /dev/null +++ b/server_manager/messages/ru.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline – это проект Jigsaw по созданию ПО с открытым исходным кодом, цель которого – обеспечить более безопасный доступ к Интернету для новостных агентств и журналистов.

Outline использует технологии Shadowsocks и все ещё находится на ранней стадии разработки. Вы можете внести свои дополнения в код на сайте GitHub, а также подписаться на наши обновления в Reddit и Medium, чтобы узнавать о добавлении новых платформ и функций.", + "about-version": "Версия {version}", + "aws-lightsail-firewall-0": "Перейдите к экрану экземпляров {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Выберите экземпляр для размещения Outline.", + "aws-lightsail-firewall-2": "Перейдите на вкладку \"Сеть\" (Networking).", + "aws-lightsail-firewall-3": "В разделе \"Брандмауэр\" (Firewall) нажмите \"Добавить\" (Add another).", + "aws-lightsail-firewall-4": "Задайте для параметра \"Приложение\" (Application) значение \"Все порты TCP и UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Нажмите \"Сохранить\" (Save).", + "cancel": "Отмена", + "close": "Закрыть", + "confirmation-server-destroy": "Существующие пользователи лишатся доступа. Это действие невозможно отменить.", + "confirmation-server-destroy-title": "Удалить сервер?", + "confirmation-server-remove": "Это действие приведет к удалению вашего сервера из Менеджера Outline, но у пользователей сохранится доступ через прокси-подключение. Для полного удаления нужно вручную удалить сервер Outline с вашего хоста.", + "confirmation-server-remove-title": "Удалить сервер из приложения?", + "data-limit": "Лимит трафика", + "data-limit-per-key": "Лимит трафика для ключей доступа", + "data-limits": "Ограничения на передачу данных", + "data-limits-description": "Настройте 30-дневное обновляемое ограничение на передачу данных для ключей доступа на этом сервере.", + "data-limits-dialog-text": "Откройте вкладку \"Настройки\" и задайте ограничение на передачу данных для ключей доступа на этом сервере.", + "data-limits-dialog-title": "Не допускайте превышения объема данных", + "data-limits-disclaimer": "Использование ограничений на передачу данных будет учитываться при сборе статистики для ваших отчетов. Чтобы получить дополнительные сведения, ознакомьтесь с {openLink}Политикой сбора данных{closeLink}.", + "data-limits-usage": "Использовано: {used} из {total}", + "destroy": "Удалить", + "digitalocean-disconnect-account": "Отключить аккаунт DigitalOcean?", + "digitalocean-unreachable": "Эта ошибка может быть вызвана работой брандмауэра в вашей сети или временным отсутствием связи с сайтом digitalocean.com.", + "disabled": "Отключено", + "disconnect": "Отключить", + "done": "Готово", + "enabled": "Включено", + "error-connectivity": "При подключении к вашему аккаунту DigitalOcean возникли проблемы. Это может быть вызвано как временными неполадками со стороны DigitalOcean, так и нестабильным подключением к Интернету у вас. Если повторные попытки не помогают, выполните вход в сервис DigitalOcean заново.", + "error-connectivity-title": "Ошибка подключения", + "error-do-account-info": "Не удалось получить данные аккаунта DigitalOcean.", + "error-do-auth": "Не удалось выполнить аутентификацию в сервисе DigitalOcean.", + "error-do-limit": "В аккаунте DigitalOcean достигнут лимит количества дроплетов ({num}). Запросить увеличение лимита можно на странице https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Не удалось получить список доступных регионов.", + "error-do-warning": "Уведомление DigitalOcean: \"{message}\"", + "error-feedback": "Не удалось отправить отзыв. Повторите попытку.", + "error-gcp-auth": "Ошибка аутентификации в Google Cloud Platform", + "error-hostname-invalid": "Укажите IP-адрес или действительное имя хоста.", + "error-key-add": "Не удалось добавить ключ.", + "error-key-remove": "Не удалось удалить ключ доступа.", + "error-key-rename": "Не удалось переименовать ключ.", + "error-keys-get": "Не удалось загрузить ключи.", + "error-keys-port-bad-input": "Укажите для порта целое число от 1 до 65 535.", + "error-keys-port-in-use": "Этот порт уже используется на сервере.", + "error-licenses": "Не удалось загрузить лицензии.", + "error-metrics": "Ошибка активации показателей.", + "error-network": "Ошибка сети.", + "error-not-saved": "Произошла ошибка.", + "error-remove-data-limit": "Не удалось отключить лимит трафика по умолчанию.", + "error-remove-per-key-limit": "Не удалось удалить лимит трафика для этого ключа доступа.", + "error-server-creation": "При создании сервера Outline возникла ошибка.", + "error-server-destroy": "Не удалось удалить сервер.", + "error-server-removed": "Серверы {serverName} больше не находятся в вашем аккаунте DigitalOcean.", + "error-server-rename": "Не удалось переименовать сервер.", + "error-server-unreachable": "Ваш сервер Outline успешно установлен, но мы не можем к нему подключиться. Вероятнее всего, это связано с тем, что входящие подключения блокируются правилами брандмауэра, настроенными на вашем сервере. Проверьте настройки и убедитесь, что для диапазона портов с 1024 до 65535 разрешены входящие TCP-подключения.", + "error-server-unreachable-title": "Не удалось подключиться к вашему серверу Outline", + "error-servers-removed": "Серверы {serverNames} больше не находятся в вашем аккаунте DigitalOcean.", + "error-set-data-limit": "Не удалось задать лимит трафика по умолчанию.", + "error-set-per-key-limit": "Не удалось задать лимит трафика для этого ключа доступа.", + "error-unexpected": "Произошла непредвиденная ошибка.", + "experimental": "Экспериментальная функция", + "experiments": "Эксперименты", + "experiments-description": "Попробуйте поработать с новыми функциями, пока они ещё недоступны широкой публике, и поделитесь с нами своим мнением.", + "experiments-disclaimer": "Экспериментальные функции находятся в стадии разработки и могут быть изменены или удалены из приложения. Использование этих функций будет учитываться при сборе статистики для ваших отчетов. Чтобы получить дополнительные сведения, ознакомьтесь с {openLink}Политикой сбора данных{closeLink}.", + "experiments-feedback": "Есть предложения? {openLink}Отправьте нам отзыв{closeLink}.", + "feedback-cloud-provider": "Выберите облачный сервис", + "feedback-cloud-provider-error": "Выберите облачный сервис.", + "feedback-connection": "Не могу подключиться к своему серверу", + "feedback-connection-others": "Другие пользователи не могут подключиться к моему серверу", + "feedback-disclaimer": "Обратите внимание, что служба поддержки может отвечать только на отзывы на английском языке.", + "feedback-email": "Адрес электронной почты (необязательно)", + "feedback-error": "Напишите отзыв.", + "feedback-explanation-install": "При попытке установить Outline на ваш сервер возникла ошибка. Если вам не удалось устранить ошибку самостоятельно, отправьте нам сообщение с описанием ситуации. В сообщении можно указать адрес электронной почты, чтобы мы могли вам ответить.", + "feedback-general": "Общий отзыв", + "feedback-install": "Возникли проблемы при установке Outline", + "feedback-label": "Ваш отзыв", + "feedback-management": "Возникли проблемы при управлении сервером", + "feedback-other": "Другой", + "feedback-privacy": "Команде Outline будет отправлен ваш отзыв, адрес электронной почты (если вы указали его), а также дополнительная информация, оговоренная в {openLink}Политике конфиденциальности{closeLink}.", + "feedback-submit": "Отправить", + "feedback-suggestion": "Предложения", + "feedback-title-generic": "Отправить отзыв", + "feedback-title-install": "Не удалось установить сервер Outline", + "gcp-billing-action": "Далее", + "gcp-billing-body": "{openLink}Добавьте платежный аккаунт{closeLink} для Google Cloud.", + "gcp-billing-description": "{openLink}Откройте страницу оплаты Cloud Console{closeLink} и добавьте платежный аккаунт.", + "gcp-billing-error": "Не удалось получить платежные данные.", + "gcp-billing-error-zero": "Чтобы продолжить, добавьте платежный аккаунт.", + "gcp-click-create": "Нажмите Create (Создать).", + "gcp-create-new-project": "{openLink}Создайте проект Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Создайте экземпляр ВМ{closeLink}.", + "gcp-create-project": "Как создать проект Google Cloud", + "gcp-create-server": "Как создать проект Google Cloud", + "gcp-create-vm": "Как создать экземпляр ВМ", + "gcp-disconnect-account": "Отключение аккаунта Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Добавьте новое правило для брандмауэра{closeLink} в ваш проект Compute Engine.", + "gcp-firewall-create-1": "Введите \"outline\" в поле Name (Название).", + "gcp-firewall-create-2": "Введите \"outline\" в поле Target tags (Теги цели).", + "gcp-firewall-create-3": "Введите \"0.0.0.0/0\" в поле Source IP ranges (Диапазоны IP-адресов источника).", + "gcp-firewall-create-4": "Выберите Allow all (Разрешить все) в разделе Protocols and ports (Протоколы и порты).", + "gcp-name-your-project": "Введите название проекта в поле \"Название проекта\" (Project name).", + "gcp-project-setup-error": "Произошла ошибка. Не удалось настроить проект Google Cloud.", + "gcp-select-machine-type": "В разделе \"Тип машины\" (Machine type) выберите f1-micro.", + "gcp-select-networking": "Нажмите \"Настройка параметров управления, безопасности, дисков, сети и многоклиентского обслуживания\" (Management, security, disks, networking, sole tenancy), а затем выберите \"Сеть\" (Networking).", + "gcp-select-region": "В разделе \"Регион\" (Region) выберите регион, рядом с которым будут находиться пользователи сервера.", + "gcp-type-network-tag": "Введите outline в поле \"Теги сети\" (Network tags).", + "gcp-type-outline-server": "Введите outline-server в поле \"Название\" (Name).", + "geo-amsterdam": "Амстердам", + "geo-bangalore": "Бангалор", + "geo-changhua-county": "Чжанхуа", + "geo-delhi": "Дели", + "geo-eemshaven": "Эмсхавен", + "geo-frankfurt": "Франкфурт", + "geo-hamina": "Хамина", + "geo-hk": "Гонконг", + "geo-iowa": "Айова", + "geo-jakarta": "Джакарта", + "geo-jurong-west": "Джуронг Вест", + "geo-las-vegas": "Лас-Вегас", + "geo-london": "Лондон", + "geo-los-angeles": "Лос-Анджелес", + "geo-melbourne": "Мельбурн", + "geo-montreal": "Монреаль", + "geo-mumbai": "Мумбаи", + "geo-new-york-city": "Нью-Йорк", + "geo-northern-virginia": "Северная Вирджиния", + "geo-oregon": "Орегон", + "geo-osaka": "Осака", + "geo-salt-lake-city": "Солт-Лейк-Сити", + "geo-san-francisco": "Сан-Франциско", + "geo-sao-paulo": "Сан-Паулу", + "geo-seoul": "Сеул", + "geo-sg": "Сингапур", + "geo-south-carolina": "Южная Каролина", + "geo-st-ghislain": "Сен-Гилен", + "geo-sydney": "Сидней", + "geo-tokyo": "Токио", + "geo-toronto": "Торонто", + "geo-warsaw": "Варшава", + "geo-zurich": "Цюрих", + "key": "Ключ {keyId}", + "manual-server-assign-firewall": "Настройте правило брандмауэра", + "manual-server-assign-group": "Назначьте группу безопасности", + "manual-server-create-firewall": "Создайте правило для брандмауэра", + "manual-server-create-group": "Создайте группу безопасности", + "manual-server-description": "Следуя этим пунктам, вы установите Outline на Linux-сервер облачного сервиса {cloudProvider}.", + "manual-server-firewall": "Настройте брандмауэр", + "manual-server-install-paste": "Вставьте сюда информацию, полученную при выполнении скрипта установки.", + "manual-server-install-run": "Зайдите на сервер и выполните эту команду.", + "manual-server-instructions": "Инструкции", + "manual-server-show-me": "Показать", + "manual-server-title": "Следуйте приведенным ниже инструкциям", + "metrics-description": "Откройте доступ к обезличенным показателям для себя и других пользователей вашего сервера Outline, чтобы способствовать повышению его надежности и производительности. {openLink}Подробнее…{closeLink}", + "metrics-share": "Предоставить доступ к показателям", + "metrics-skip": "Пропустить", + "metrics-title": "Предоставление доступа к показателям", + "nav-about": "О приложении", + "nav-data-collection": "Сбор данных", + "nav-feedback": "Отзыв", + "nav-help": "Справка", + "nav-licenses": "Лицензии", + "nav-privacy": "Конфиденциальность", + "nav-terms": "Условия использования", + "no-data-limit": "Лимит не задан", + "notification-app-update": "Обновленная версия Менеджера Outline скачана. Она будет установлена при перезапуске приложения.", + "notification-feedback-thanks": "Благодарим за отзыв! Мы рады получать от вас обратную связь.", + "notification-key-added": "Ключ добавлен", + "notification-key-removed": "Ключ удален.", + "notification-server-destroyed": "Сервер удален", + "notification-server-exists": "Сервер уже добавлен.", + "notification-server-removed": "Сервер удален из приложения.", + "oauth-account-active": "Ваш аккаунт DigitalOcean активирован.", + "oauth-account-active-tag": "Аккаунт активирован! Загрузка местоположений сервера…", + "oauth-activate-account": "Активируйте аккаунт DigitalOcean.", + "oauth-billing": "Укажите свои платежные данные на сайте digitalocean.com, после чего вернитесь в приложение.", + "oauth-billing-tag": "Введите платежные данные…", + "oauth-connect-description": "Использование Outline в вашем аккаунте позволяет упростить создание сервера и подключение к нему.", + "oauth-connect-tag": "Ожидание подключения вашего аккаунта…", + "oauth-connect-title": "Выполните вход или создайте аккаунт DigitalOcean.", + "oauth-sign-out": "Выйти", + "oauth-verify": "Найдите во входящих электронное письмо от DigitalOcean и перейдите по указанной в нем ссылке, чтобы подтвердить ваш аккаунт.", + "oauth-verify-tag": "Подтвердите адрес электронной почты…", + "okay": "ОК", + "per-key-data-limit-dialog-set-custom": "Задать лимит трафика", + "per-key-data-limit-dialog-title": "Лимит трафика – {keyName}", + "region-best-value": "Выгодное предложение", + "region-description": "Именно здесь начинается ваш Интернет.", + "region-setup": "Настроить Outline", + "region-title": "Выберите местоположение сервера.", + "remove": "Удалить", + "retry": "Повторить", + "save": "Сохранить", + "saved": "Готово.", + "saving": "Подождите…", + "server-access": "Доступ к серверу", + "server-access-key-new": "Добавить новый ключ", + "server-access-key-rename": "Переименовать", + "server-access-keys": "Ключи доступа", + "server-connections": "Подключения", + "server-data-transfer": "Переданные данные/последние 30 дней", + "server-data-used": "Использованный объем данных/последние 30 дней", + "server-destroy": "Удалить сервер", + "server-help-access-key-description": "Предоставьте ключи доступа другим пользователям, чтобы они могли подключиться к вашему серверу Outline. Каждый пользователь может использовать один и тот же ключ доступа на всех своих устройствах.", + "server-help-access-key-next": "Далее", + "server-help-access-key-title": "Создайте ключи, предоставьте доступ", + "server-help-connection-description": "Нажмите здесь, чтобы установить клиентское приложение Outline, используя персональные ключи для доступа к серверу Outline.", + "server-help-connection-ok": "Ясно!", + "server-help-connection-title": "Вы ещё не подключены!", + "server-keys": "Ключи", + "server-my-access-key": "Мой ключ доступа", + "server-name": "Сервер Outline, {serverLocation}", + "server-remove": "Удалить сервер из приложения", + "server-settings": "Настройки", + "server-unreachable": "Сервер недоступен", + "server-unreachable-description": "При подключении к этому серверу возникли проблемы.", + "server-unreachable-managed-description": "Попробуйте снова или удалите этот сервер из приложения.", + "server-unreachable-manual-description": "Попробуйте снова или удалите этот сервер вместе с виртуальным хостом.", + "server-usage": "Использование (за последние 30 дней)", + "servers-add": "Добавить сервер", + "servers-digitalocean": "Серверы DigitalOcean", + "servers-gcp": "Серверы Google Cloud Platform", + "servers-manual": "Серверы", + "settings-access-key-port": "Порт для новых ключей доступа", + "settings-metrics-header": "Предоставить доступ к обезличенной статистике", + "settings-server-api-url": "URL для доступа к Management API", + "settings-server-cost": "Ежемесячный платеж", + "settings-server-creation": "Создан", + "settings-server-hostname": "Имя хоста", + "settings-server-id": "Идентификатор сервера", + "settings-server-info": "Информация о сервере", + "settings-server-location": "Местоположение сервера", + "settings-server-name": "Название", + "settings-server-rename": "Укажите новое название для вашего сервера. Имейте в виду, что это не отразится на работе устройств пользователей, которых вы пригласили подключиться к серверу.", + "settings-server-version": "Версия сервера", + "settings-transfer-limit": "Пакет трафика для передачи данных", + "setup-action": "Настроить", + "setup-advanced": "Расширенный", + "setup-anywhere": "Настройте Outline где угодно", + "setup-cancel": "Возможность отмены в любое время", + "setup-create": "Создать сервер", + "setup-description": "Нет сервера? Создайте аккаунт в облачном сервисе DigitalOcean.", + "setup-do-cost": "Всего 6 долларов США в месяц", + "setup-do-create": "Создайте новый сервер в аккаунте DigitalOcean с пакетом трафика на 1 ТБ, доплатив всего 6 долларов США в месяц.", + "setup-do-data": "Пакет трафика для передачи 1 TБ данных", + "setup-do-description": "Это может занять несколько минут. Вы можете удалить этот сервер в любое время.", + "setup-do-easiest": "Чрезвычайно простая настройка", + "setup-do-title": "Настройка Outline.", + "setup-firewall-instructions": "Инструкции по настройке брандмауэра", + "setup-gcp-create": "Создайте новый сервер с помощью аккаунта Google. Цена зависит от местоположения и использования.", + "setup-gcp-easy": "Простая настройка", + "setup-gcp-free-tier": "С {openLinkFreeTier}бесплатным планом{closeLink} стоимость первого сервера составляет от {openLinkIpPrice}3 долл. США в месяц{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Первые 90 дней бесплатно{closeLink} для новых пользователей", + "setup-gcp-promo": "Попробуйте создать сервер автоматически с помощью Outline", + "setup-recommended": "Рекомендуемый", + "setup-simple-commands": "Простые команды для установки", + "setup-step-by-step": "Пошаговое руководство", + "setup-tested": "Протестировано в облачных сервисах VULTR, Linode и Liquid Web", + "setup-title": "Выберите облачный сервис для настройки Outline.", + "share-description": "Скопируйте это приглашение и отправьте его по каналу связи, которому вы доверяете. {openLink}Нужна помощь?{closeLink}", + "share-invite-access-key-copied": "Ключ доступа скопирован в буфер обмена", + "share-invite-copied": "Приглашение скопировано в буфер обмена", + "share-invite-copy": "Копировать приглашение", + "share-invite-copy-access-key": "Копировать ключ доступа", + "share-invite-html": "Чтобы безопасно подключиться к интернету, используйте этот сервер.

1. Скачайте и установите на устройство приложение Outline:

iOS: https://itunes.apple.com/app/outline-app/id1356177741
macOS: https://itunes.apple.com/app/outline-app/id1356178125
Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
Android: https://play.google.com/store/apps/details?id=org.outline.android.client
Дополнительная ссылка для Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2. Получите ключ доступа, который начинается с ss://, а затем скопируйте его.

3. Откройте клиент Outline. Если ваш ключ доступа определился автоматически, нажмите \"Подключиться\". Если этого не произошло, вставьте ключ в поле и нажмите \"Подключиться\".

Теперь у вас есть доступ к свободному интернету. Чтобы убедиться, что вы подключились к серверу, введите в Google Поиске фразу \"Какой у меня IP-адрес\". IP-адрес, указанный в Google, должен совпадать с IP-адресом в клиенте Outline.

Дополнительные сведения можно найти на странице https://getoutline.org/.", + "share-invite-instructions": "Воспользуйтесь нашими инструкциями на GitHub:", + "share-invite-trouble": "Есть проблемы с доступом к пригласительной ссылке?", + "share-title": "Поделитесь доступом", + "survey-data-limits-title": "Помогите нам улучшить передачу данных", + "survey-decline": "Отклонить", + "survey-disclaimer": "Если вы нажмете \"Перейти к опросу\", вы будете перенаправлены на страницу с коротким опросом в Google Формах. Рекомендуем проходить опрос, подключившись к Outline.", + "survey-go-to-survey": "Перейти к опросу", + "terms-of-service": "Я принимаю {openLink}Условия использования Outline{closeLink}." +} diff --git a/server_manager/messages/si.json b/server_manager/messages/si.json new file mode 100644 index 0000000000..c6d9398acd --- /dev/null +++ b/server_manager/messages/si.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline යනු පුවත් සංවිධානවලටත් මාධ්‍යවේදීන්ටත් අන්තර්ජාලයට ප්‍රවේශ වීමට ඉතා ආරක්‍ෂිත මාර්ගයක් ලබා දීමට Jigsaw විසින් සාදන ලද විවෘත මූලාශ්‍ර ව්‍යාපෘතියකි.

Outline හට Shadowsocks විසින් බලගන්වනු ලබන අතර එය තවමත් මුල් වියේ නිෂ්පාදනයකි. ඔබට GitHub මත කේතයට දායක වීමටත්, අපි තවත් වේදිකාවලට දිග හරින විටත් නව විශේෂාංග එක් කරන විටත් දැන ගැනීමට Reddit සහ Medium මත අප අනුගමන කරන්න.", + "about-version": "අනුවාදය {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} නිදර්ශන තිරයට සංචලන වන්න.", + "aws-lightsail-firewall-1": "ඔබට Outline ධාරන කිරීමට අවශ්‍ය නිදර්ශන මත ක්ලික් කරන්න.", + "aws-lightsail-firewall-2": "'ජාලකරණ' පටිත්ත වෙත සංචලන කරන්න.", + "aws-lightsail-firewall-3": "'ගිනි පවුර' කොටස තුළ, 'තව එකක් එක් කරන්න' ක්ලික් කරන්න.", + "aws-lightsail-firewall-4": "'යෙදුම්' අගය 'සියලු TCP+UDP' ලෙස සකසන්න.", + "aws-lightsail-firewall-5": "'සුරකින්න' ක්ලික් කරන්න.", + "cancel": "අවලංගු කරන්න", + "close": "වසන්න", + "confirmation-server-destroy": "පවතින පරිශීලකයින්ට ප්‍රවේශය අහිමි වෙයි. මෙම ක්‍රියාව අස් කළ නොහැක.", + "confirmation-server-destroy-title": "සේවාදායකය මකන්න ද?", + "confirmation-server-remove": "මෙම ක්‍රියාව Outline Manager වෙතින් ඔබේ සේවාදායකය ඉවත් කරයි, නමුත් පරිශීලකයින්ට ප්‍රොක්සි ප්‍රවේශය අවහිර නොකරයි. ඔබට තවමත් ඔබේ ධාරක යන්ත්‍රයෙන් Outline සේවාදායකය හස්තීයව මැකීමට අවශ්‍ය වෙයි.", + "confirmation-server-remove-title": "සේවාදායකය ඉවත් කරන්නද?", + "data-limit": "දත්ත සීමාව", + "data-limit-per-key": "යතුරකට දත්ත සීමාව", + "data-limits": "දත්ත සීමා", + "data-limits-description": "මෙම සේවාදායකය මත ප්‍රවේශ යතුරු සඳහා දින 30 ක පියමං දත්ත මාරු කිරීම් සීමාවක් සකසන්න.", + "data-limits-dialog-text": "මෙම සේවාදායකය මත ප්‍රවේශ යතුරු සඳහා දත්ත මාරු කිරීම් සීමාවක් සැකසීමට සැකසීම් පටිත්තට යන්න.", + "data-limits-dialog-title": "දත්ත අධික වීම් වළක්වන්න", + "data-limits-disclaimer": "ඔබ දැනට මාත්‍රික වාර්තා කරන බැවින්, දත්ත සීමා විශේෂාංගය භාවිත කිරීම ඇතුළු කරනු ලැබේ. වැඩි විස්තර සඳහා {openLink}දත්ත රැස් කිරීම් ප්‍රතිපත්තිය{closeLink} බලන්න.", + "data-limits-usage": "{total} න් {used} ක් භාවිත කරන ලදී", + "destroy": "විනාශ කරන්න", + "digitalocean-disconnect-account": "DigitalOcean ගිණුම විසන්‍ධි කරන්න", + "digitalocean-unreachable": "මෙම දෝෂය ඔබේ ජාලයේ ඇති ගිනි පවුරක් හෝ digitalocean.com සමග ඇති තාවකාලික සබඳතා ගැටලු නිසා වේවි.", + "disabled": "අබලයි", + "disconnect": "විසන්‍ධි කරන්න", + "done": "නිමයි", + "enabled": "සබලයි", + "error-connectivity": "අපට ඔබේ DigitalOcean ගිණුමට සම්බන්‍ධ කිරීමේ ගැටලු තිබේ. මෙය සමහර විට DigitalOcean සමග හෝ ඔබේ අන්තර්ජාල සම්බන්‍ධතාව සමග ඇති තාවකාලික ගැටලුවක් වෙයි. නැවත උත්සාහ කිරීම ක්‍රියා නොකරන්නේ නම්, නැවතත් DigitalOcean හට පුරනය වීම ගැටලුව නිරාකරණ කළ යුතු ය.", + "error-connectivity-title": "සම්බන්‍ධතා ගැටලුව", + "error-do-account-info": "DigitalOcean ගිණුම් තොරතුරු ලබා ගැනීම අසමත් විය", + "error-do-auth": "DigitalOcean මගින් සත්‍යාපනය අසමත් විය", + "error-do-limit": "ඔබේ DigitalOcean ගිණුම බිඳිති {num} යන එහි සීමාවට ළඟා වී ඇත. ඔබට https://cloud.digitalocean.com/account/team/droplet_limit_increase තුළින් වැඩි කිරීමක් ඉල්ලිය හැක", + "error-do-regions": "ලබා ගත හැකි කලාප ලැයිස්තුව ලබා ගැනීම අසමත් විය", + "error-do-warning": "DigitalOcean අවවාදය: \"{message}\"", + "error-feedback": "ප්‍රතිපෝෂණය ඉදිරිපත් කිරීම අසමත් විය. නැවත උත්සාහ කරන්න.", + "error-gcp-auth": "Google Cloud වේදිකාව මගින් සත්‍යාපනය අසමත් විය", + "error-hostname-invalid": "IP ලිපිනයක් හෝ වලංගු ධාරක නාමයක් විය යුතු ම ය.", + "error-key-add": "යතුර එක් කිරීම අසමත් විය", + "error-key-remove": "යතුර ඉවත් කිරීම අසමත් විය", + "error-key-rename": "යතුර යළි නම් කිරීම අසමත් විය", + "error-keys-get": "යතුරු පූරණ කළ නොහැකි විය", + "error-keys-port-bad-input": "තොට 1 සහ 65,535 අතර පූර්ණාංකයක් විය යුතු ම ය.", + "error-keys-port-in-use": "තොට දැනටමත් සේවාදායකය තුළ භාවිත කෙරෙමින් පවතියි.", + "error-licenses": "බලපත්‍ර පූරණ කළ නොහැකි විය.", + "error-metrics": "මාත්‍රික සබල ලෙස සැකසීමේ දෝෂයයි", + "error-network": "ජාල දෝෂයක් සිදු විය.", + "error-not-saved": "නොසුරැකිණි", + "error-remove-data-limit": "පෙරනිමි දත්ත සීමාව අබල කළ නොහැකි විය", + "error-remove-per-key-limit": "මෙම ප්‍රවේශ යතුරෙන් දත්ත සීමාව ඉවත් කළ නොහැකි විය", + "error-server-creation": "ඔබේ Outline සේවාදායකය සෑදීමෙහි දෝෂයක් තිබුණා.", + "error-server-destroy": "සේවාදායකය විනාශ කිරීම අසමත් විය", + "error-server-removed": "{serverName} තවදුරටත් ඔබේ DigitalOcean ගිණුම තුළ නොතිබේ.", + "error-server-rename": "සේවාදායකය යළි නම් කිරීම අසමත් විය", + "error-server-unreachable": "ඔබේ Outline සේවාදයකය නිවැරදිව ස්ථාපන කරන ලදි, නමුත් අපට එයට සම්බන්‍ධ කළ නොහැක. මෙය බොහෝ දුරට ඔබේ සේවාදායකයේ ගිනි පවුරු රීති එන සම්බන්‍ධතා අවහිර කරන බැවින් විය හැක. ඒවා සමාලෝචන කර 1024 සිට 65535 දක්වා ඇති තොටවල් මත එන TCP සම්බන්‍ධතාවලට ඉඩ දීමට තහවුරු කර ගන්න.", + "error-server-unreachable-title": "ඔබේ Outline සේවාදායකයට සම්බන්‍ධ කළ නොහැක", + "error-servers-removed": "{serverNames} තවදුරටත් ඔබේ DigitalOcean ගිණුම තුළ නොතිබේ.", + "error-set-data-limit": "පෙරනිමි දත්ත සීමාව සැකසිය නොහැකි විය", + "error-set-per-key-limit": "මෙම ප්‍රවේශ යතුර සඳහා දත්ත සීමාව සැකසීමට නොහැකි විය", + "error-unexpected": "අනපේක්‍ෂිත දෝෂයක් සිදු විය.", + "experimental": "පරීක්‍ෂ්‍ය", + "experiments": "පරීක්‍ෂණ", + "experiments-description": "නව විශේෂාංග පරීක්‍ෂා කර ඒවා මුදා හරිනු ලැබීමට පෙරර අපට ප්‍රතිපෝෂණය දෙන්න.", + "experiments-disclaimer": "අත්හදා බැලීම් සංවර්ධන කෙරෙමින් පවතියි, යෙදුමෙන් වෙනස් වේවි හෝ ඉවත් කරනු ලැබේවි. ඔබ දැනට මාත්‍රික වාර්තා කරන්නේ නම් අත්හදා බැලීම් විශේෂාංග භාවිතය ඇතුළු කරනු ලැබේ. වැඩි විස්තර සඳහා {openLink}දත්ත රැස් කිරීම් ප්‍රතිපත්තිය{closeLink} බලන්න.", + "experiments-feedback": "යෝජනා තිබේද? {openLink}ප්‍රතිපෝෂණය මෙහි ඉදිරිපත් කරන්න.{closeLink}", + "feedback-cloud-provider": "වළාකුළු සපයන්නා තෝරන්න", + "feedback-cloud-provider-error": "වළාකුළු සපයන්නෙක් තෝරන්න.", + "feedback-connection": "මගේ සේවාදායකයට සම්බනධ කළ නොහැක", + "feedback-connection-others": "අනෙක් අයට මගේ සේවාදායකයට සම්බන්ධ විය නොහැක", + "feedback-disclaimer": "අප කණ්ඩායමට ඉංග්‍රීසියෙන් ඇති ප්‍රතිපෝෂණයට පමණක් පිළිතුරු දිය හැකි බව සලකන්න.", + "feedback-email": "ඉ-තැපැල් ලිපිනය (විකල්ප)", + "feedback-error": "ප්‍රතිපෝෂණය ඇතුළත් කරන්න.", + "feedback-explanation-install": "ඔබේ සේවාදායකය මත Outline ස්ථාපන කිරීමට ප්‍රයත්න දරන විට දෝෂයක් සිදු විය. ඔබට විසඳුමක් සිතා ගත නොහැකි වී සිටියේ නම්, අපට ප්‍රතිපෝෂණයක් එවා අපි ඔබට පිළිතුරු දිය හැකි වීමට අපට ඔබේ ඉ-තැපැල් ලිපිනය කීම (වෛකල්පික) සලකා බලන්න.", + "feedback-general": "සාමාන්‍ය ප්‍රතිපෝෂණය", + "feedback-install": "Outline ස්ථාපන කිරීමේ ගැටලුවක් තිබේ", + "feedback-label": "ඔබේ ප්‍රතිපෝෂණය", + "feedback-management": "මගේ සේවාදායකය කළමනා කිරීමේ ගැටලුවක් තිබේ", + "feedback-other": "වෙනත්", + "feedback-privacy": "ඔබේ ප්‍රතිපෝෂණය, (ලබා දුන්නේ නම්) ඉ-තැපැල් ලිපිනය, සහ {openLink}පෞද්ගලිකත්ව ප්‍රතිපත්තිය{closeLink} තුළ දී ඇති අමතර තොරතුරු Outline කණ්ඩායමට යවනු ලැබේ.", + "feedback-submit": "ඉදිරිපත් කරන්න", + "feedback-suggestion": "යෝජනා", + "feedback-title-generic": "ප්‍රතිපෝෂණය යවන්න", + "feedback-title-install": "Outline සේවාදායක ස්ථාපනය අසමත් විය", + "gcp-billing-action": "මීළඟ", + "gcp-billing-body": "ඔබ {openLink}Google Cloud මත බිල්පත් ගිණුමක් එක් කරන{closeLink} තෙක් රැඳී සිටිනු ලැබේ", + "gcp-billing-description": "ඉදිරියට යාමට {openLink}Cloud Console බිල්පත් පිටුව විවෘත කර{closeLink} ගිණුමක් එක් කරන්න.", + "gcp-billing-error": "බිල්පත් තොරතුරු ලබා ගත නොහැක", + "gcp-billing-error-zero": "ඉදිරියට යාමට පෙර ඔබ බිල්පත් ගිණුමක් එක් කළ යුතු ම ය.", + "gcp-click-create": "'සාදන්න' ක්ලික් කරන්න.", + "gcp-create-new-project": "{openLink}නව Google Cloud ව්‍යාපෘතියක් සාදන්න{closeLink}.", + "gcp-create-new-vm": "{openLink}නව VM නිදර්ශනයක් සාදන්න{closeLink}.", + "gcp-create-project": "Google Cloud ව්‍යාපෘතියක් සාදන්න", + "gcp-create-server": "ඔබේ Google Cloud ව්‍යාපෘතිය සාදන්න", + "gcp-create-vm": "VM නිදර්ශනයක් සාදන්න", + "gcp-disconnect-account": "Google Cloud වේදිකා ගිණුම විසන්‍ධි කරන්න", + "gcp-firewall-create-0": "ඔබේ පරිගණක එන්ජිම් ව්‍යාපෘතියට {openLink}නව ගිනි පවුරු රීතියක්{closeLink} එක් කරන්න.", + "gcp-firewall-create-1": "'නම' ක්‍ෂේත්‍රය තුළ 'outline' ලෙස ටයිප් කරන්න.", + "gcp-firewall-create-2": "'ඉලක්ක ටැග' ක්‍ෂේත්‍රය තුළ 'outline' ලෙස ටයිප් කරන්න.", + "gcp-firewall-create-3": "'මූලාශ්‍ර IP පරාස' ක්‍ෂේත්‍රය තුළ '0.0.0.0/0' ලෙස ටයිප් කරන්න.", + "gcp-firewall-create-4": "'ප්‍රොටොකෝල සහ තොට' යටතේ 'සියල්ලට ඉඩ දෙන්න' තෝරන්න.", + "gcp-name-your-project": "'ව්‍යාපෘති නම' තුළ ඔබේ ව්‍යාපෘතිය නම් කිරීම අසමත් විය.", + "gcp-project-setup-error": "ඔබේ Google Cloud ව්‍යාපෘතිය සකසන අතරතුර දෝෂයක් සිදු විය", + "gcp-select-machine-type": "'යන්ත්‍ර වර්ගය' යටතේ 'f1-micro' යන්න තෝරන්න", + "gcp-select-networking": "'කළමනාකරණය, ආරක්‍ෂාව, තැටි, ජාලකරණය, තනි තැනැතියාව', පසුව 'ජාලකරණය' ක්ලික් කරන්න", + "gcp-select-region": "සේවාදායකයේ පරිශීලකයින්ට ළඟ කලාපයක් 'කලාපය' යටතේ තෝරන්න.", + "gcp-type-network-tag": "'ජාල ටැග' ක්‍ෂේත්‍රය තුළ 'outline' ලෙස ටයිප් කරන්න", + "gcp-type-outline-server": "'නම' ක්‍ෂේත්‍රය තුළ 'outline-server' ලෙස ටයිප් කරන්න.", + "geo-amsterdam": "ඇම්ස්ටර්ඩෑම්", + "geo-bangalore": "බැංගලෝරය", + "geo-changhua-county": "චංහුවා කෝරළය", + "geo-delhi": "දිල්ලි", + "geo-eemshaven": "ඊම්ස්හැවන්", + "geo-frankfurt": "ෆ්‍රැන්ක්ෆුර්ට්", + "geo-hamina": "හැමිනා", + "geo-hk": "හොංකොං", + "geo-iowa": "අයෝවා", + "geo-jakarta": "ජකාර්තා", + "geo-jurong-west": "බටහිර ජූරොං", + "geo-las-vegas": "ලාස් වේගාස්", + "geo-london": "ලණ්ඩන්", + "geo-los-angeles": "ලොස් ඇන්ජලීස්", + "geo-melbourne": "මෙල්බර්න්", + "geo-montreal": "මොන්ට්‍රෙයල්", + "geo-mumbai": "මුම්බයි", + "geo-new-york-city": "නිව් යෝර්ක්", + "geo-northern-virginia": "උත්තර වර්ජීනියාව", + "geo-oregon": "ඔරිගන්", + "geo-osaka": "ඔසාකා", + "geo-salt-lake-city": "සෝල්ට් ලේක් නගරය", + "geo-san-francisco": "සැන් ෆ්‍රැන්සිස්කෝ", + "geo-sao-paulo": "සාඕ පාවුලෝ", + "geo-seoul": "සෝල්", + "geo-sg": "සිංගප්පූරුව", + "geo-south-carolina": "දකුණු කැරොලිනා", + "geo-st-ghislain": "ශා. ඝිස්ලයින්", + "geo-sydney": "සිඩ්නි", + "geo-tokyo": "ටෝකියෝ", + "geo-toronto": "ටොරොන්ටෝ", + "geo-warsaw": "වර්සව්", + "geo-zurich": "සූරික්", + "key": "{keyId} යතුර", + "manual-server-assign-firewall": "ගිනි පවුරු රීතිය පවරන්න", + "manual-server-assign-group": "ආරක්‍ෂක කණ්ඩායම පවරන්න", + "manual-server-create-firewall": "ගිනි පවුරු රීතියක් සාදන්න", + "manual-server-create-group": "ආරක්‍ෂක කණ්ඩායමක් සාදන්න", + "manual-server-description": "මෙම පියවර ඔබට {cloudProvider} Linux සේවාදායකයක් මත Outline ස්ථාපන කිරීමට උදවු කරයි.", + "manual-server-firewall": "ඔබේ ගිනි පවුර වින්‍යාස කරන්න", + "manual-server-install-paste": "මෙහි ඔබේ ස්ථාපන ප්‍රතිදානය අලවන්න.", + "manual-server-install-run": "ඔබේ සේවාදායකයට පුරනය වී මෙම විධානය ධාවන කරන්න.", + "manual-server-instructions": "උපදෙස්", + "manual-server-show-me": "මට තැන පෙන්වන්න", + "manual-server-title": "පහත උපදෙස් පිළිපදින්න", + "metrics-description": "ඔබ සඳහාත් ඔබ ඔබේ සේවාදායකය බෙදා ගන්නා අයවලුන් සඳහාත් Outline හි විශ්වසනීය බව සහ කාර්යසාධනය දියුණු කිරීමට උදවු කිරීමට නිර්නාමික මාත්‍රික බෙදා ගන්න. {openLink}තව දැන ගන්න.{closeLink}", + "metrics-share": "මාත්‍රික බෙදා ගන්න", + "metrics-skip": "මඟ හරින්න", + "metrics-title": "මාත්‍රික බෙදා ගැනීම", + "nav-about": "පිළිබඳ", + "nav-data-collection": "දත්ත රැස් කිරීම", + "nav-feedback": "ප්‍රතිපෝෂණය", + "nav-help": "උදවු", + "nav-licenses": "බලපත්‍ර", + "nav-privacy": "පෞද්ගලිකත්වය", + "nav-terms": "නියම", + "no-data-limit": "කිසිවක් නැත", + "notification-app-update": "Outline Manager හි යාවත්කාලීන කරන ලද අනුවාදයක් බා ගෙන ඇත. ඔබ යෙදුම යළි ආරම්භ කරන විට එය ස්ථාපන කරනු ලැබේ.", + "notification-feedback-thanks": "අපට වැඩිදියුණු කිරීමට උදවු කිරීම වෙනුවෙන් ස්තුතියි! අපි ඔබෙන් සවන් දීමට කැමතියි.", + "notification-key-added": "යතුර එක් කළා", + "notification-key-removed": "යතුර ඉවත් කළා", + "notification-server-destroyed": "සේවාදායකය විනාශ කරන ලදි", + "notification-server-exists": "සේවාදායකය දැනටමත් එක් කර තිබේ", + "notification-server-removed": "සේවාදායකය ඉවත් කළා", + "oauth-account-active": "ඔබේ DigitalOcean ගිණුම ක්‍රියාත්මක කර ඇත.", + "oauth-account-active-tag": "ගිණුම ක්‍රියාත්මක කරන ලදි! සේවාදායක ස්ථාන පූරණ කෙරේ...", + "oauth-activate-account": "ඔබේ DigitalOcean ගිණුම ක්‍රියාත්මක කරන්න.", + "oauth-billing": "digitalocean.com මත ඔබේ බිල්පත් තොරතුරු ඇතුළත් කරන්න, ඔබ එය කළ පසු යෙදුමට ආපසු පැමිණෙන්න.", + "oauth-billing-tag": "බිල්පත් තොරතුරු ඇතුළත් කරන්න...", + "oauth-connect-description": "Outline ඔබේ ගිණුම මගින් සේවාදයකයක් සෑදීම සහ සම්බන්‍ධ වීම පහසු කරයි.", + "oauth-connect-tag": "ඔබේ ගිණුම සම්බන්‍ධ කරන තෙක් රැඳී සිටිනු ලැබේ...", + "oauth-connect-title": "පුරන්න හෝ DigitalOcean සමග ගිණුමක් සාදන්න.", + "oauth-sign-out": "වරන්න", + "oauth-verify": "DigitalOcean වෙතින් ඉ-තැපෑලක් තිබේ දැයි ඔබේ එන ලිපි පරීක්‍ෂා කර, ඔබේ ගිණුම තහවුරු කිරීමට එය තුළ ඇති සබැඳිය ක්ලික් කරන්න.", + "oauth-verify-tag": "ඔබේ ඉ-තැපෑල තහවුරු කරන්න...", + "okay": "හරි", + "per-key-data-limit-dialog-set-custom": "අභිරුචි දත්ත සීමාවක් සකසන්න", + "per-key-data-limit-dialog-title": "දත්ත සීමාව - {keyName}", + "region-best-value": "හොඳ ම වටිනාකම", + "region-description": "ඔබේ අන්තර්ජාල අත්දැකීම ලැබෙන්නේ මෙතැනිනි.", + "region-setup": "Outline සකසන්න", + "region-title": "ඔබේ සේවාදායකයේ ස්ථානය තෝරන්න.", + "remove": "ඉවත් කරන්න", + "retry": "යළි උත්සාහ කරන්න", + "save": "සුරකින්න", + "saved": "සුරැකිණි", + "saving": "සුරැකේ...", + "server-access": "සේවාදායක ප්‍රවේශය", + "server-access-key-new": "නව යතුර එක් කරන්න", + "server-access-key-rename": "යළි නම් කරන්න", + "server-access-keys": "ප්‍රවේශ යතුරු", + "server-connections": "සම්බන්‍ධතා", + "server-data-transfer": "මාරු කළ දත්ත / පසුගිය දින 30", + "server-data-used": "භාවිත කළ ප්‍රතිභාගය / පසුගිය දින 30", + "server-destroy": "සේවාදායකය විනාශ කරන්න", + "server-help-access-key-description": "මිතුරන්ට ඔබේ Outline සේවාදායකයට සම්බන්‍ධ කළ හැකි වීමට ඔවුන් සමග ප්‍රවේශ යතුරු බෙදා ගන්න. ඔවුන්ට ඔවුන්ගේ උපාංග සියල්ල මත එකම ප්‍රවේශ යතුර භාවිත කළ හැක.", + "server-help-access-key-next": "මීළඟ", + "server-help-access-key-title": "යතුරු සාදන්න, ප්‍රවේශය බෙදා ගන්න", + "server-help-connection-description": "ඔබේ පුද්ගලික ප්‍රවේශ යතුර භාවිත කර ඔබේ Outline සේවාදායකය වෙත Outline සේවාලාභී යෙදුම ස්ථාපන කිරීමට මෙහි ක්ලික් කරන්න.", + "server-help-connection-ok": "හරි, තේරුණා!", + "server-help-connection-title": "ඔබ තවම සම්බන්‍ධ කර නැත!", + "server-keys": "යතුරු", + "server-my-access-key": "මගේ ප්‍රවේශ යතුර", + "server-name": "Outline සේවාදායකය {serverLocation}", + "server-remove": "සේවාදායකය ඉවත් කරන්න", + "server-settings": "සැකසීම්", + "server-unreachable": "සේවාදායකයට ළඟා විය නොහැක", + "server-unreachable-description": "අපට මෙම සේවාදායකයට සම්බන්‍ධ කිරීමේ ගැටලු තිබේ.", + "server-unreachable-managed-description": "නැවත උත්සාහ කරන්න හෝ යෙදුමෙන් මෙම සේවාදායකය ඉවත් කරන්න.", + "server-unreachable-manual-description": "නැවත උත්සාහ කරන්න, නැති නම් මෙම සේවාදායකය සහ අතථ්‍ය ධාරකය විනාශ කරන්න.", + "server-usage": "භාවිතය (පසුගිය දින 30)", + "servers-add": "සේවාදායකය එක් කරන්න", + "servers-digitalocean": "DigitalOcean සේවාදායක", + "servers-gcp": "Google Cloud වේදිකා සේවාදායක", + "servers-manual": "සේවාදායක", + "settings-access-key-port": "නව ප්‍රවේශ යතුරු සඳහා වන තොට", + "settings-metrics-header": "නිර්නාමික මාත්‍රික බෙදා ගන්න", + "settings-server-api-url": "කළමනාකරණ API URL", + "settings-server-cost": "මාසික පිරිවැය", + "settings-server-creation": "සෑදුවේ", + "settings-server-hostname": "ධාරක නාමය", + "settings-server-id": "සේවාදායක හැඳුනුම", + "settings-server-info": "සේවාදායක තොරතුරු", + "settings-server-location": "සේවාදායක ස්ථානය", + "settings-server-name": "නම‍", + "settings-server-rename": "ඔබේ සේවාදායකය සඳහා නව නමක් සකසන්න. මෙය ඔබ මෙයට සම්බන්‍ධ කිරීමට ආරාධනා කළ පරිශීලකයින්ගේ උපාංග මත පරාවර්තන නොකෙරෙන බව සලකන්න.", + "settings-server-version": "සේවාදායක අනුවාදය", + "settings-transfer-limit": "දත්ත මාරු කිරීමේ දීමනාව", + "setup-action": "සකසන්න", + "setup-advanced": "උසස්", + "setup-anywhere": "ඕනෑම තැනක Outline සකසන්න", + "setup-cancel": "ඕනෑම වේලාවක අවලංගු කරන්න", + "setup-create": "සේවාදායකය සාදන්න", + "setup-description": "සේවාදායකයක් නැතිද? DigitalOcean සමග ගිණුමක් සාදන්න.", + "setup-do-cost": "මාසයකට එ.ජ. ඩොලර් $6 ක් පමණයි", + "setup-do-create": "1 TB දත්ත මාරුව සඳහා දින 30කට අමතර එ.ජ. ඩොලර් $6කට ඔබේ DigitalOcean ගිණුම මගින් නව සේවාදායකයක් නිර්මාණ කරන්න.", + "setup-do-data": "1 TB දත්ත මාරුවට ඉඩ දීම", + "setup-do-description": "මේ සඳහා විනාඩි කිහිපයක් ගත විය හැක. ඔබට ඕනෑම වේලාවක මෙම සේවාදායකය විනාශ කළ හැක.", + "setup-do-easiest": "පහසු ම සැකසුම් ක්‍රියාවලිය", + "setup-do-title": "Outline සැකසීම.", + "setup-firewall-instructions": "ගිනි පවුරු උපදෙස්", + "setup-gcp-create": "ඔබේ Google ගිණුම සමග නව සේවාදායකයක් සාදන්න. වියදම් ස්ථානයට සහ භාවිතයට අනුව වෙනස් වෙයි.", + "setup-gcp-easy": "පහසු සැකසීම් ක්‍රියාවලිය", + "setup-gcp-free-tier": "{openLinkFreeTier}නොමිලේ ස්තරය{closeLink} සමග, ඔබේ පළමු සේවාදායකය {openLinkIpPrice}මාසයකට එ.ජ. ඩොලර් $3{closeLink} ලෙස ආරම්භ වෙයි", + "setup-gcp-free-trial": "නව පරිශීලකයින් සඳහා {openLinkFreeTrial}දින 90 ක නොමිලේ අත්හදා බැලීම{closeLink}", + "setup-gcp-promo": "Google Cloud සඳහා නව ස්වයංක්‍රීය Outline සේවාදායක නිර්මාණ ක්‍රියාවලිය උත්සාහ කරන්න", + "setup-recommended": "නිර්දේශිත", + "setup-simple-commands": "සරල ස්ථාපන විධාන", + "setup-step-by-step": "පියවරෙන් පියවර මාර්ගෝපදේශය", + "setup-tested": "VULTR, Linode, සහ Liquid Web මත පරීක්‍ෂා කරන ලදි", + "setup-title": "Outline සැකසීමට වළාකුළු සේවයක් තෝරන්න.", + "share-description": "මෙම ආරාධනය පිටපත් කර ඔබ විශ්වාස කරන සන්නිවේදන මෙවලමකින් එය යවන්න. {openLink}උදවු අවශ්‍ය ද?{closeLink}", + "share-invite-access-key-copied": "ප්‍රවේශ යතුර පසුරු පුවරුවට පිටපත් කළා", + "share-invite-copied": "ආරාධනාව පසුරු පුවරුවට පිටපත් කළා", + "share-invite-copy": "ආරාධනය පිටපත් කරන්න", + "share-invite-copy-access-key": "ප්‍රවේශ යතුර පිටපත් කරන්න", + "share-invite-html": "විවෘත අන්තර්ජාලයට ආරක්‍ෂිතව ප්‍රවේශ වීමට මෙම සේවාදායකය භාවිත කරන්න:

1) ඔබේ උපාංගය සඳහා Outline යෙදුම බා ගෙන ස්ථාපන කරන්න:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android alternative link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) ඔබට ss:// සමග ආරම්භ වන ප්‍රවේශ යතුරක් ලැබෙයි. ඔබට එය ලැබුණු විට, මෙම ප්‍රවේශ යතුර පිටපත් කරන්න.

3) Outline සේවාලාභී යෙදුම විවෘත කරන්න. ඔබේ ප්‍රවේශ යතුර ස්වයංක්‍රීයව අනාවරණ වුව හොත් \"සම්බන්‍ධ කරන්න\" වෙත තට්ටු කර ඉදිරියට යන්න. ඔබේ ප්‍රවේශ යතුර ස්වයංක්‍රීයව අනාවරණ නොවුව හොත්, එවිට එය ක්‍ෂේත්‍රය තුළට අලවා, පසුව \"සම්බන්‍ධ කරන්න\" වෙත තට්ටු කර ඉදිරියට යන්න.

ඔබ විවෘත අන්තර්ජාලය භාවිත කිරීමට සූදානමින් සිටියි! ඔබ සේවාදායකයට සාර්ථකව සම්බන්‍ධ කර ඇති බව තහවුරු කිරීමට, Google සෙවීම මත \"මගේ IP එක කුමක් ද\" ලෙස සොයා උත්සාහ කරන්න. Google තුළ පෙන්වනු ලබන IP ලිපිනය Outline සේවාලාභියා තුළ ඇති IP ලිපිනයට ගැළපිය යුතුය.

Outline ගැන මෙතැනින් තව දැන ගන්න: https://getoutline.org/", + "share-invite-instructions": "GitHub මත අප ආරාධනාව අනුගමන කරන්න:", + "share-invite-trouble": "ආරාධනා සබැඳියට ප්‍රවේශ වීමේ ගැටලු තිබේ ද?", + "share-title": "ප්‍රවේශය බෙදා ගන්න", + "survey-data-limits-title": "දත්ත සීමාව දියුණු කරන ආකාරය තේරුම් ගැනීමට අපට උදවු කරන්න", + "survey-decline": "ප්‍රතික්‍ෂේප කරන්න", + "survey-disclaimer": "ඉදිරියට යන්න ක්ලික් කිරීමෙන් ඔබට Google පෝරම මත කෙටි සමීක්‍ෂණයක් එවනු ලැබේ. Outline වෙත සම්බන්‍ධ කර ඇති විට සමීක්‍ෂණයට සහභාගී වීම අපි නිර්දේශ කරමු.", + "survey-go-to-survey": "සමීක්‍ෂණයට යන්න", + "terms-of-service": "මම {openLink}Outline සේවා නියම{closeLink} කියවා තේරුම් ගත්තෙමි" +} diff --git a/server_manager/messages/sk.json b/server_manager/messages/sk.json new file mode 100644 index 0000000000..559a258e42 --- /dev/null +++ b/server_manager/messages/sk.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline je projekt typu open source, ktorý vytvorila spoločnosť Jigsaw na poskytovanie bezpečnejšieho prístupu na internet pre spravodajské agentúry a novinárov.

Outline používa technológiu služby Shadowsocks a zatiaľ ide o službu v rannom štádiu vývoja. Kód môžete rozšíriť v službe GitHub. Sledovať nás môžete v službách RedditMedium, kde sa dozviete, keď budeme expandovať na ďalšie platformy a pridáme nové funkcie.", + "about-version": "Verzia {version}", + "aws-lightsail-firewall-0": "Prejdite na obrazovku s inštanciami služby {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Kliknite na inštanciu, kde chcete hostiť Outline.", + "aws-lightsail-firewall-2": "Prejdite na kartu Siete (Networking).", + "aws-lightsail-firewall-3": "V sekcii Firewall (Firewall) kliknite na Pridať ďalší (Add another).", + "aws-lightsail-firewall-4": "Hodnotu Použitie (Application) nastavte na Všetky protokoly TCP a UDP (All TCP+UDP).", + "aws-lightsail-firewall-5": "Kliknite na Uložiť (Save).", + "cancel": "Zrušiť", + "close": "Zatvoriť", + "confirmation-server-destroy": "Existujúci používatelia stratia prístup. Túto akciu nie je možné vrátiť späť.", + "confirmation-server-destroy-title": "Chcete server zrušiť?", + "confirmation-server-remove": "Táto akcia odstráni váš server zo Správcu Outline, no neblokuje používateľom prístup cez proxy server. Naďalej budete musieť manuálne odstrániť servery služby Outline zo svojho hostiteľského zariadenia.", + "confirmation-server-remove-title": "Chcete server odstrániť?", + "data-limit": "Dátový limit", + "data-limit-per-key": "Dátový limit na kľúč", + "data-limits": "Limity dát", + "data-limits-description": "Nastavte pre prístupové kľúče na tomto serveri 30-dňový maximálny limit.", + "data-limits-dialog-text": "Ak chcete pre prístupové kľúče na tomto serveri nastaviť limit prenosu dát, prejdite na kartu Nastavenia.", + "data-limits-dialog-title": "Zabráňte nadmernému prenosu dát", + "data-limits-disclaimer": "Keďže momentálne zaznamenávate metriky, zahrnie sa do nich aj používanie funkcie dátových limitov. Viac sa dozviete v {openLink}pravidlách zhromažďovania údajov{closeLink}.", + "data-limits-usage": "Využilo sa {used} z {total}", + "destroy": "Zrušiť", + "digitalocean-disconnect-account": "Odpojenie účtu DigitalOcean", + "digitalocean-unreachable": "Táto chyba môže byť spôsobená firewallom na vašej sieti alebo dočasnými problémami s pripojením webu digitalocean.com.", + "disabled": "Deaktivované", + "disconnect": "Odpojiť", + "done": "Hotovo", + "enabled": "Aktivované", + "error-connectivity": "Máme problém pripojiť sa k vášmu účtu DigitalOcean. Niekedy ide o dočasný problém so službou DigitalOcean alebo vaším internetovým pripojením. Ak nebude fungovať zopakovanie pokusu, problém by malo vyriešiť opätovné prihlásenie do služby DigitalOcean.", + "error-connectivity-title": "Problém s pripojením", + "error-do-account-info": "Nepodarilo sa získať informácie o účte DigitalOcean", + "error-do-auth": "Overenie cez DigitalOcean bolo neúspešné", + "error-do-limit": "Váš účet DigitalOcean dosiahol limit virtuálnych počítačov Droplet: {num}. O jeho zvýšenie môžete požiadať na https://cloud.digitalocean.com/account/team/droplet_limit_increase.", + "error-do-regions": "Nepodarilo sa získať zoznam dostupných regiónov", + "error-do-warning": "Varovanie služby DigitalOcean: {message}", + "error-feedback": "Spätnú väzbu sa nepodarilo odoslať. Skúste to znova.", + "error-gcp-auth": "Overenie prostredníctvom služby Google Cloud Platform zlyhalo", + "error-hostname-invalid": "Musí to byť adresa IP alebo platný názov hostiteľa.", + "error-key-add": "Pridanie kľúča bolo neúspešné", + "error-key-remove": "Kľúč sa nepodarilo odstrániť", + "error-key-rename": "Kľúč sa nepodarilo premenovať", + "error-keys-get": "Kľúče sa nepodarilo načítať", + "error-keys-port-bad-input": "Hodnota portu musí byť celé číslo od 1 do 65 535.", + "error-keys-port-in-use": "Tento port sa na serveri už používa.", + "error-licenses": "Licencie sa nepodarilo načítať.", + "error-metrics": "Pri aktivácii metrík sa vyskytla chyba", + "error-network": "Vyskytla sa chyba siete.", + "error-not-saved": "Neuložené", + "error-remove-data-limit": "Nepodarilo sa vypnúť predvolený dátový limit", + "error-remove-per-key-limit": "Nepodarilo sa odstrániť dátový limit z tohto prístupového kľúča", + "error-server-creation": "Pri vytváraní vášho servera služby Outline sa vyskytla chyba.", + "error-server-destroy": "Server sa nepodarilo zrušiť", + "error-server-removed": "Servery {serverName} už nie sú vo vašom účte DigitalOcean prítomné.", + "error-server-rename": "Premenovanie servera bolo neúspešné", + "error-server-unreachable": "Váš server služby Outline bol nainštalovaný správne, no nedokážeme sa k nemu pripojiť. Je to zrejme spôsobené tým, že pravidlá firewallu vášho servera blokujú prichádzajúce pripojenia. Skontrolujte ich a nezabudnite povoliť prichádzajúce pripojenia TCP na portoch v rozsahu od 1 024 do 65 535.", + "error-server-unreachable-title": "Nie je možné pripojiť sa na váš server služby Outline", + "error-servers-removed": "Servery {serverNames} už nie sú vo vašom účte DigitalOcean prítomné.", + "error-set-data-limit": "Nepodarilo sa nastaviť predvolený dátový limit", + "error-set-per-key-limit": "Nepodarilo sa nastaviť dátový limit pre tento prístupový kľúč", + "error-unexpected": "Vyskytla sa neočakávaná chyba.", + "experimental": "Experimentálna", + "experiments": "Experimentálne funkcie", + "experiments-description": "Otestujte nové funkcie pred ich vydaním a dajte nám spätnú väzbu.", + "experiments-disclaimer": "Experimentálne funkcie sú vo fáze vývoja a môžu sa zmeniť alebo byť z aplikácie odstránené. Ak momentálne zaznamenávate metriky, zahrnie sa do nich aj používanie týchto funkcií. Viac sa dozviete v {openLink}pravidlách zhromažďovania údajov{closeLink}.", + "experiments-feedback": "Máte nejaké návrhy? {openLink}Tu odošlite spätnú väzbu.{closeLink}", + "feedback-cloud-provider": "Vybrať poskytovateľa cloudu", + "feedback-cloud-provider-error": "Vyberte poskytovateľa cloudu.", + "feedback-connection": "Nedarí sa mi pripojiť na server", + "feedback-connection-others": "Ostatní sa na môj server nemôžu pripojiť", + "feedback-disclaimer": "Upozorňujeme, že náš tím dokáže odpovedať len na spätnú väzbu v angličtine.", + "feedback-email": "E‑mailová adresa (nepovinné)", + "feedback-error": "Zadajte spätnú väzbu.", + "feedback-explanation-install": "Pri pokuse o inštaláciu služby Outline na vašom serveri sa vyskytol problém. Ak sa vám nepodarilo vymyslieť riešenie, zvážte možnosť poslať nám spätnú väzbu, v ktorej uvediete svoju e‑mailovú adresu (nepovinné), aby sme vám mohli odpovedať.", + "feedback-general": "Všeobecná spätná väzba", + "feedback-install": "Mám problémy s inštaláciou služby Outline", + "feedback-label": "Vaša spätná väzba", + "feedback-management": "Mám problémy so správou svojho servera", + "feedback-other": "Iné", + "feedback-privacy": "Vaša spätná väzba, e‑mailová adresa (ak ju uvediete) a ďalšie informácie, na ktoré sa odkazuje v {openLink}pravidlách ochrany súkromia{closeLink}, budú odoslané tímu služby Outline.", + "feedback-submit": "Odoslať", + "feedback-suggestion": "Návrhy", + "feedback-title-generic": "Spätná väzba", + "feedback-title-install": "Inštalácia servera služby Outline bola neúspešná", + "gcp-billing-action": "Ďalej", + "gcp-billing-body": "Čaká sa, kým {openLink}pridáte fakturačný účet v službe Google Cloud{closeLink}", + "gcp-billing-description": "Ak chcete pokračovať, {openLink}otvorte fakturačnú stránku nástroja Cloud Console{closeLink} a pridajte účet.", + "gcp-billing-error": "Nepodarilo sa načítať fakturačné údaje", + "gcp-billing-error-zero": "Pred pokračovaním musíte pridať fakturačný účet.", + "gcp-click-create": "Kliknite na Create (Vytvoriť).", + "gcp-create-new-project": "{openLink}Vytvorenie nového projektu v službe Google Cloud{closeLink}", + "gcp-create-new-vm": "{openLink}Vytvorenie novej inštancie VM{closeLink}", + "gcp-create-project": "Vytvorenie projektu v službe Google Cloud", + "gcp-create-server": "Vytvorenie projektu v službe Google Cloud", + "gcp-create-vm": "Vytvorenie inštancie VM", + "gcp-disconnect-account": "Odpojte účet Google Cloud Platform", + "gcp-firewall-create-0": "Pridajte do svojho projektu služby Compute Engine {openLink}nové pravidlo firewallu{closeLink}.", + "gcp-firewall-create-1": "Do poľa Name (Názov) napíšte „outline“.", + "gcp-firewall-create-2": "Do poľa Target tags (Cieľové značky) napíšte „outline“.", + "gcp-firewall-create-3": "Do poľa Source IP ranges (Rozsahy IP zdroja) napíšte 0.0.0.0/0.", + "gcp-firewall-create-4": "V sekcii Protocols and ports (Protokoly a porty) vyberte Allow All (Povoliť všetky).", + "gcp-name-your-project": "Projekt pomenujte v poli Názov projektu (Project name).", + "gcp-project-setup-error": "Pri nastavovaní vášho projektu v službe Google Cloud sa vyskytla chyba", + "gcp-select-machine-type": "V sekcii Typ počítača (Machine type) vyberte f1-micro", + "gcp-select-networking": "Kliknite na položku Správa, zabezpečenie, disky, siete, výhradný prístup (Management, security, disks, networking, sole tenancy) a potom na Siete (Networking)", + "gcp-select-region": "V sekcii Oblasť (Region) vyberte oblasť, blízko ktorej budú používatelia servera.", + "gcp-type-network-tag": "Do poľa Network tags (Značky siete) napíšte „outline“", + "gcp-type-outline-server": "Do poľa Name (Názov) napíšte „outline-server“.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalúr", + "geo-changhua-county": "Región Chang‑chua", + "geo-delhi": "Dillí", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Západné Jü‑lang‑si", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londýn", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Bombaj", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Severná Virgínia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Soul", + "geo-sg": "Singapur", + "geo-south-carolina": "Južná Karolína", + "geo-st-ghislain": "Saint-Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varšava", + "geo-zurich": "Zürich", + "key": "Kľúč č. {keyId}", + "manual-server-assign-firewall": "Priradenie pravidla firewallu", + "manual-server-assign-group": "Pridružiť skupinu zabezpečenia", + "manual-server-create-firewall": "Vytvorenie pravidla firewallu", + "manual-server-create-group": "Vytvorenie skupiny zabezpečenia", + "manual-server-description": "Tieto kroky vám pomôžu nainštalovať Outline na serveri so systémom Linux poskytovateľa {cloudProvider}.", + "manual-server-firewall": "Konfigurácia firewallu", + "manual-server-install-paste": "Tu prilepte výstup inštalácie.", + "manual-server-install-run": "Prihláste sa na svoj server a spustite tento príkaz.", + "manual-server-instructions": "Pokyny", + "manual-server-show-me": "Ukázať kde", + "manual-server-title": "Postupujte podľa pokynov nižšie", + "metrics-description": "Zdieľajte anonymizované metriky a pomôžte tak zlepšiť spoľahlivosť a výkonnosť služby Outline pre seba a tých, s ktorými zdieľate svoj server. {openLink}Ďalšie informácie{closeLink}.", + "metrics-share": "Zdieľať metriky", + "metrics-skip": "Preskočiť", + "metrics-title": "Zdieľanie metrík", + "nav-about": "O aplikácii", + "nav-data-collection": "Zhromažďovanie dát", + "nav-feedback": "Spätná väzba", + "nav-help": "Pomocník", + "nav-licenses": "Licencie", + "nav-privacy": "Ochrana súkromia", + "nav-terms": "Zmluvné podmienky", + "no-data-limit": "Žiadny", + "notification-app-update": "Bola stiahnutá aktualizovaná verzia Správcu Outline. Bude nainštalovaná, keď aplikáciu reštartujete.", + "notification-feedback-thanks": "Ďakujeme, že nám pomáhate zlepšovať sa! Oceňujeme vašu spätnú väzbu.", + "notification-key-added": "Bol pridaný kľúč", + "notification-key-removed": "Kľúč bol odstránený", + "notification-server-destroyed": "Server bol zrušený", + "notification-server-exists": "Server už bol pridaný", + "notification-server-removed": "Server bol odstránený", + "oauth-account-active": "Váš účet DigitalOcean bol aktivovaný.", + "oauth-account-active-tag": "Účet bol aktivovaný. Načítavajú sa umiestnenia serverov…", + "oauth-activate-account": "Aktivujte svoj účet DigitalOcean.", + "oauth-billing": "Na digitalocean.com zadajte svoje fakturačné údaje a potom sa vráťte do aplikácie.", + "oauth-billing-tag": "Zadajte fakturačné údaje…", + "oauth-connect-description": "Pomocou vášho účtu umožňuje Outline jednoducho vytvoriť server a pripojiť sa.", + "oauth-connect-tag": "Čaká sa na pripojenie vášho účtu…", + "oauth-connect-title": "Prihláste sa do účtu DigitalOcean alebo si ho vytvorte.", + "oauth-sign-out": "Odhlásiť sa", + "oauth-verify": "V doručenej pošte si otvorte správu zo služby DigitalOcean a kliknite na odkaz, čím potvrdíte svoj účet.", + "oauth-verify-tag": "Potvrďte svoj e‑mail…", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Nastaviť vlastný dátový limit", + "per-key-data-limit-dialog-title": "Dátový limit – {keyName}", + "region-best-value": "Najvýhodnejšia ponuka", + "region-description": "Odtiaľto bude zabezpečované vaše internetové prostredie.", + "region-setup": "Nastaviť Outline", + "region-title": "Vyberte umiestnenie svojho servera.", + "remove": "Odstrániť", + "retry": "Skúsiť znova", + "save": "Uložiť", + "saved": "Uložené", + "saving": "Ukladá sa…", + "server-access": "Prístup na server", + "server-access-key-new": "Pridať nový kľúč", + "server-access-key-rename": "Premenovať", + "server-access-keys": "Prístupové kľúče", + "server-connections": "Pripojenia", + "server-data-transfer": "Prenesené dáta za posledných 30 dní", + "server-data-used": "Využitý limit za posledných 30 dní", + "server-destroy": "Zrušiť server", + "server-help-access-key-description": "Zdieľajte prístupové kľúče s priateľmi, aby sa mohli pripojiť na váš server služby Outline. Na všetkých zariadeniach môžu používať rovnaký prístupový kľúč.", + "server-help-access-key-next": "Ďalej", + "server-help-access-key-title": "Vytváranie kľúčov a zdieľanie prístupu", + "server-help-connection-description": "Ak chcete pomocou svojho osobného prístupového kľúča k serveru služby Outline nainštalovať klientsku aplikáciu Outline, kliknite tu.", + "server-help-connection-ok": "Dobre.", + "server-help-connection-title": "Ešte ste sa nepripojili!", + "server-keys": "Kľúče", + "server-my-access-key": "Môj prístupový kľúč", + "server-name": "Server služby Outline: {serverLocation}", + "server-remove": "Odstrániť server", + "server-settings": "Nastavenia", + "server-unreachable": "Server je mimo dosahu", + "server-unreachable-description": "S pripojením na tento server máme problémy.", + "server-unreachable-managed-description": "Skúste to znova alebo tento server odstráňte z aplikácie.", + "server-unreachable-manual-description": "Skúste to znova alebo tento server a virtuálneho hostiteľa zrušte.", + "server-usage": "Spotreba (posledných 30 dní)", + "servers-add": "Pridať server", + "servers-digitalocean": "Servery služby DigitalOcean", + "servers-gcp": "Servery služby Google Cloud Platform", + "servers-manual": "Servery", + "settings-access-key-port": "Port pre nové prístupové kľúče", + "settings-metrics-header": "Zdieľanie anonymných metrík", + "settings-server-api-url": "Webová adresa rozhrania Management API", + "settings-server-cost": "Cena za mesiac", + "settings-server-creation": "Vytvorené", + "settings-server-hostname": "Názov hostiteľa", + "settings-server-id": "Identifikátor servera", + "settings-server-info": "Informácie o serveri", + "settings-server-location": "Umiestnenie servera", + "settings-server-name": "Názov", + "settings-server-rename": "Nastavte pre svoj server nový názov. Upozorňujeme, že sa to neprejaví v zariadeniach používateľov, ktorých ste pozvali na pripojenie k tomuto serveru.", + "settings-server-version": "Verzia servera", + "settings-transfer-limit": "Limit prenosu dát", + "setup-action": "Nastaviť", + "setup-advanced": "Rozšírené", + "setup-anywhere": "Nastavte Outline kdekoľvek", + "setup-cancel": "Možnosť zrušenia kedykoľvek", + "setup-create": "Vytvoriť server", + "setup-description": "Nemáte server? Vytvorte si účet DigitalOcean.", + "setup-do-cost": "Iba 6 USD mesačne", + "setup-do-create": "Vytvorte si pomocou účtu DigitalOcean nový server za ďalších 6 USD za 30 dní s prenosom 1 TB dát.", + "setup-do-data": "Limit prenosu 1 TB dát", + "setup-do-description": "Môže to trvať niekoľko minút. Tento server môžete kedykoľvek zničiť.", + "setup-do-easiest": "Najjednoduchší proces nastavenia", + "setup-do-title": "Nastavuje sa Outline.", + "setup-firewall-instructions": "Pokyny k firewallu", + "setup-gcp-create": "Vytvorte si nový server pomocou účtu Google. Cena sa líši v závislosti od oblasti a používania.", + "setup-gcp-easy": "Jednoduchý proces nastavenia", + "setup-gcp-free-tier": "Na {openLinkFreeTier}úrovni Free{closeLink} sa cena za prvý server začína na {openLinkIpPrice}3 USD mesačne{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90‑dňová bezplatná skúšobná verzia{closeLink} pre nových používateľov", + "setup-gcp-promo": "Vyskúšajte nový proces automatického vytvorenia servera služby Outline pre Google Cloud", + "setup-recommended": "Odporúčané", + "setup-simple-commands": "Jednoduché príkazy na inštaláciu", + "setup-step-by-step": "Podrobný sprievodca nastavením", + "setup-tested": "Testované v službách VULTR, Linode a Liquid Web", + "setup-title": "Ak chcete nastaviť Outline, vyberte cloudovú službu.", + "share-description": "Skopírujte túto pozvánku a odošlite ju cez komunikačný nástroj, ktorému dôverujete. {openLink}Potrebujete pomoc?{closeLink}", + "share-invite-access-key-copied": "Prístupový kľúč bol skopírovaný do schránky", + "share-invite-copied": "Pozvánka bola skopírovaná do schránky", + "share-invite-copy": "Kopírovať pozvánku", + "share-invite-copy-access-key": "Kopírovať prístupový kľúč", + "share-invite-html": "Na bezpečný prístup na otvorený internet použite tento server:

1. Do zariadenia si stiahnite a nainštalujte aplikáciu Outline:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Alternatívny odkaz pre Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2. Dostanete prístupový kľúč, ktorý sa začína na ss://. Prijatý prístupový kľúč skopírujte.

3. Otvorte klientsku aplikáciu Outline. Ak bol prístupový kľúč automaticky rozpoznaný, klepnite na Pripojiť a pokračujte. Ak prístupový kľúč automaticky rozpoznaný nebol, prilepte ho do poľa a potom klepnite na Pripojiť a pokračujte.

Môžete začať používať otvorený internet. Ak sa chcete uistiť, že ste sa úspešne pripojili k serveru, skúste do Vyhľadávania Google zadať výraz „what is my ip“ (akú mám adresu IP). Adresa IP zobrazená na Googli by sa mala zhodovať s adresou IP v kliente Outline.

Viac o službe Outline sa dozviete tu: https://getoutline.org/", + "share-invite-instructions": "Postupujte podľa našich pozývacích pokynov v službe GitHub:", + "share-invite-trouble": "Máte problém s prístupom k odkazu s pozvánkou?", + "share-title": "Zdieľanie prístupu", + "survey-data-limits-title": "Pomôžte nám zistiť, ako môžeme zlepšiť dátové limity", + "survey-decline": "Odmietnuť", + "survey-disclaimer": "Kliknutím na Pokračovať prejdete na krátky prieskum vo Formulároch Google. Pri jeho vypĺňaní odporúčame pripojiť sa k službe Outline.", + "survey-go-to-survey": "Prejsť na prieskum", + "terms-of-service": "Mám prečítané {openLink}zmluvné podmienky služby Outline{closeLink} a rozumiem im" +} diff --git a/server_manager/messages/sl.json b/server_manager/messages/sl.json new file mode 100644 index 0000000000..7c69104a0a --- /dev/null +++ b/server_manager/messages/sl.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline je odprtokodni projekt, ki je bil ustvarjen v inkubatorju Jigsaw in katerega cilj je novičarskim organizacijam in novinarjem zagotoviti varnejši način dostopa do interneta.

Outline uporablja tehnologijo Shadowsocks in je šele v zgodnji fazi razvoja izdelka. Če želite sodelovati pri razvoju kode, lahko to storite prek platforme GitHub. Če vas zanima, kdaj se bomo razširili na več platform in dodali nove funkcije, nas spremljajte na spletnih mestih Reddit in Medium.", + "about-version": "Različica {version}", + "aws-lightsail-firewall-0": "Pomaknite se na zaslon s primerki {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Kliknite primerek, v katerem želite gostiti Outline.", + "aws-lightsail-firewall-2": "Pomaknite se na kartico »Omrežje«.", + "aws-lightsail-firewall-3": "V razdelku »Požarni zid« (Firewall) kliknite »Dodaj drugo« (Add another).", + "aws-lightsail-firewall-4": "Vrednost »Izvajanje« (Application) nastavite na »TCP + UDP v celoti« (All TCP+UDP).", + "aws-lightsail-firewall-5": "Kliknite »Shrani« (Save).", + "cancel": "Prekliči", + "close": "Zapri", + "confirmation-server-destroy": "Obstoječi uporabniki bodo izgubili dostop. Tega dejanja ni mogoče razveljaviti.", + "confirmation-server-destroy-title": "Želite uničiti strežnik?", + "confirmation-server-remove": "S tem dejanjem bo strežnik odstranjen iz Upravitelja za Outline, vendar dostop proxy do uporabnikov ne bo blokiran. Kljub temu boste morali strežnik Outline ročno izbrisati iz gostiteljevega računalnika.", + "confirmation-server-remove-title": "Želite odstraniti strežnik?", + "data-limit": "Omejitev podatkov", + "data-limit-per-key": "Omejitev podatkov na ključ", + "data-limits": "Omejitve prenosa podatkov", + "data-limits-description": "Določite omejitev prenosa podatkov na podlagi 30-dnevnega obdobja spremljanja za ključe za dostop v tem strežniku.", + "data-limits-dialog-text": "Odprite kartico z nastavitvami in nastavite omejitev prenosa podatkov za ključe za dostop v tem strežniku.", + "data-limits-dialog-title": "Preprečevanje preseganja omejitev prenosa podatkov", + "data-limits-disclaimer": "Ker v poročilih trenutno prikazujete meritve, bo vključena tudi uporaba funkcij omejitev prenosa podatkov. Več podrobnosti je na voljo v {openLink}pravilniku o zbiranju podatkov{closeLink}.", + "data-limits-usage": "Uporabljeno: {used} od {total}", + "destroy": "Uniči", + "digitalocean-disconnect-account": "Prekinitev povezave računa DigitalOcean", + "digitalocean-unreachable": "Do te napake je morda prišlo zaradi požarnega zidu v vašem omrežju ali začasnih težav glede povezljivosti z digitalocean.com.", + "disabled": "Onemogočeno", + "disconnect": "Prekini povezavo", + "done": "Končano", + "enabled": "Omogočeno", + "error-connectivity": "Imamo težave pri povezovanju v vaš račun DigitalOcean. Občasno prihaja do težave pri ponudniku DigitalOcean ali z vašo internetno povezavo. Če vnovični poskusi niso uspešni, lahko težavo odpravite tako, da se znova prijavite v DigitalOcean.", + "error-connectivity-title": "Težave s povezavo", + "error-do-account-info": "Pridobivanje podatkov o računu DigitalOcean ni uspelo", + "error-do-auth": "Preverjanje pristnosti pri ponudniku DigitalOcean ni uspelo", + "error-do-limit": "Račun DigitalOcean je dosegel omejitev toliko primerkov (»droplets«): {num}. Povečanje lahko zahtevate na https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Pridobivanje seznama razpoložljivih regij ni uspelo", + "error-do-warning": "Opozorilo ponudnika DigitalOcean: »{message}«", + "error-feedback": "Pošiljanje povratnih informacij ni uspelo. Poskusite znova.", + "error-gcp-auth": "Preverjanje pristnosti s storitvijo Google Cloud Platform ni uspelo.", + "error-hostname-invalid": "Vnesti je treba naslov IP ali veljavno ime gostitelja.", + "error-key-add": "Dodajanje ključa ni uspelo", + "error-key-remove": "Odstranitev ključa ni uspela", + "error-key-rename": "Preimenovanje ključa ni uspelo", + "error-keys-get": "Ključev ni bilo mogoče naložiti", + "error-keys-port-bad-input": "Za vrata mora biti navedeno celo število med 1 in 65.535.", + "error-keys-port-in-use": "Vrata so že v uporabi v strežniku.", + "error-licenses": "Licenc ni bilo mogoče naložiti.", + "error-metrics": "Napaka pri nastavitvi omogočanja meritev", + "error-network": "Prišlo je do omrežne napake.", + "error-not-saved": "Ni shranjeno", + "error-remove-data-limit": "Privzete omejitve podatkov ni bilo mogoče onemogočiti.", + "error-remove-per-key-limit": "Omejitve podatkov za ta ključ za dostop ni bilo mogoče odstraniti.", + "error-server-creation": "Pri ustvarjanju strežnika Outline je prišlo do težave.", + "error-server-destroy": "Uničenje strežnika ni uspelo", + "error-server-removed": "Strežnika {serverName} ni več v vašem računu DigitalOcean.", + "error-server-rename": "Preimenovanje strežnika ni uspelo", + "error-server-unreachable": "Strežnik Outline Server je bil ustrezno nameščen, vendar se ne moremo povezati vanj. Najverjetnejši razlog so pravila glede požarnega zidu v vašem strežniku, ki blokirajo dohodne povezave. Preglejte jih in zagotovite, da bodo omogočene povezave TCP v vratih od 1024 do 65535.", + "error-server-unreachable-title": "Ni se mogoče povezati v strežnik Outline", + "error-servers-removed": "Strežnika {serverNames} ni več v vašem računu DigitalOcean.", + "error-set-data-limit": "Privzete omejitve podatkov ni bilo mogoče nastaviti.", + "error-set-per-key-limit": "Omejitve podatkov za ta ključ za dostop ni bilo mogoče nastaviti.", + "error-unexpected": "Prišlo je do nepričakovane napake.", + "experimental": "Poskusno", + "experiments": "Preizkusi", + "experiments-description": "Preizkusite nove funkcije in nam pošljite povratne informacije pred njihovo uradno izdajo.", + "experiments-disclaimer": "Preizkusi so še vedno v razvoju in bodo morda spremenjeni ali odstranjeni iz aplikacije. Če v poročilih trenutno prikazujete meritve, bo vključena tudi uporaba preizkusnih funkcij. Več podrobnosti je na voljo v {openLink}pravilniku o zbiranju podatkov{closeLink}.", + "experiments-feedback": "Imate predloge? {openLink}Pošljite povratne informacije tukaj.{closeLink}", + "feedback-cloud-provider": "Izberite ponudnika storitev v oblaku", + "feedback-cloud-provider-error": "Izberite ponudnika oblaka.", + "feedback-connection": "Ni se mogoče povezati z mojim strežnikom", + "feedback-connection-others": "Drugi se ne morejo povezati z mojim strežnikom", + "feedback-disclaimer": "Upoštevajte, da lahko naša ekipa na povratne informacije odgovarja samo v angleščini.", + "feedback-email": "E-poštni naslov (izbirno)", + "feedback-error": "Vnesite povratne informacije.", + "feedback-explanation-install": "Pri poskusu namestitve aplikacije Outline v strežnik je prišlo do napake. Če niste uspeli poiskati rešitve, nam pošljite povratne informacije in sporočite svoj e-poštni naslov (izbirno), tako da bomo lahko vzpostavili stik z vami.", + "feedback-general": "Splošne povratne informacije", + "feedback-install": "Težave imam z namestitvijo aplikacije Outline.", + "feedback-label": "Vaše povratne informacije", + "feedback-management": "Težave imam z upravljanjem svojega strežnika", + "feedback-other": "Drugi", + "feedback-privacy": "Vaše povratne informacije, e-poštni naslov (če je naveden) in dodatni podatki, opredeljeni v {openLink}pravilniku o zasebnosti{closeLink}, bodo poslani ekipi za Outline.", + "feedback-submit": "Pošlji", + "feedback-suggestion": "Predlogi", + "feedback-title-generic": "Pošiljanje povratnih informacij", + "feedback-title-install": "Namestitev strežnika Outline ni uspela", + "gcp-billing-action": "Naprej", + "gcp-billing-body": "Čakanje, da {openLink}dodate račun za obračunavanje v storitvi Google Cloud{closeLink}.", + "gcp-billing-description": "Če želite nadaljevati, {openLink}odprite stran za obračunavanje za Cloud Console{closeLink} in dodajte račun.", + "gcp-billing-error": "Informacij za obračun ni bilo mogoče pridobiti.", + "gcp-billing-error-zero": "Preden nadaljujete, morate dodati račun za obračunavanje.", + "gcp-click-create": "Kliknite »Ustvari« (Create).", + "gcp-create-new-project": "{openLink}Ustvarjanje novega projekta Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Ustvarjanje novega primerka VM{closeLink}.", + "gcp-create-project": "Ustvarjanje projekta Google Cloud", + "gcp-create-server": "Ustvarjanje svojega projekta Google Cloud", + "gcp-create-vm": "Ustvarjanje primerka VM", + "gcp-disconnect-account": "Prekinitev povezave z računom za Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Dodajte novo pravilo glede požarnega zidu{closeLink} v projekt Compute Engine.", + "gcp-firewall-create-1": "V polje »Ime« (Name) vnesite »outline«.", + "gcp-firewall-create-2": "V polje »Ciljne oznake« (Target tags) vnesite »outline«.", + "gcp-firewall-create-3": "V polje »razponi vira IP« (Source IP ranges) vnesite »0.0.0.0/0«.", + "gcp-firewall-create-4": "V razdelku »Protokoli in vrata« (Protocols and ports) izberite »Dovoli vse« (Allow all).", + "gcp-name-your-project": "Poimenujte projekt v polju »Ime projekta« (Project name).", + "gcp-project-setup-error": "Med nastavljanjem projekta Google Cloud je prišlo do napake.", + "gcp-select-machine-type": "V razdelku »Vrsta računalnika« (Machine type) izberite »f1-micro«", + "gcp-select-networking": "Kliknite »Upravljanje, varnost, diski, omrežje, edino skrbništvo« (Management, security, disks, networking, sole tenancy) in nato »Omrežje« (Networking)", + "gcp-select-region": "V razdelku »Regija« (Region) izberite regijo v bližini lokacije, na kateri bodo uporabniki strežnika.", + "gcp-type-network-tag": "V polje »Oznake za omrežje« (Network tags) vnesite »outline«", + "gcp-type-outline-server": "V polje »Ime« (Name) vnesite »outline-server«.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Okrožje Čanhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Džakarta", + "geo-jurong-west": "Zahodni Jurong", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbaj", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Severna Virginija", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "Sao Paulo", + "geo-seoul": "Seul", + "geo-sg": "Singapur", + "geo-south-carolina": "Južna Karolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varšava", + "geo-zurich": "Zürich", + "key": "Ključ {keyId}", + "manual-server-assign-firewall": "Dodeli pravilo glede požarnega zidu", + "manual-server-assign-group": "Dodeli varnostno skupino", + "manual-server-create-firewall": "Ustvarjanje pravila glede požarnega zidu", + "manual-server-create-group": "Ustvarjanje varnostne skupine", + "manual-server-description": "S temi navodili boste lažje namestili aplikacijo Outline v strežniku Linux ponudnika {cloudProvider}.", + "manual-server-firewall": "Konfiguriranje požarnega zidu", + "manual-server-install-paste": "Podatke iz namestitve prilepite sem.", + "manual-server-install-run": "Prijavite se v strežnik in izvedite ta ukaz.", + "manual-server-instructions": "Navodila", + "manual-server-show-me": "Pokaži lokacijo", + "manual-server-title": "Upoštevajte spodnja navodila", + "metrics-description": "Delite anonimne meritve, da bomo lažje izboljšali zanesljivost in uspešnost strežnika Outline za vas in uporabnike, s katerimi ga delite. {openLink}Preberite več o tem.{closeLink}", + "metrics-share": "Deli meritve", + "metrics-skip": "Preskoči", + "metrics-title": "Deljenje meritev", + "nav-about": "Vizitka", + "nav-data-collection": "Zbiranje podatkov", + "nav-feedback": "Povratne informacije", + "nav-help": "Pomoč", + "nav-licenses": "Licence", + "nav-privacy": "Zasebnost", + "nav-terms": "Pogoji", + "no-data-limit": "Brez", + "notification-app-update": "Posodobljena različica Upravitelja za Outline je prenesena. Nameščena bo ob vnovičnem zagonu aplikacije.", + "notification-feedback-thanks": "Hvala, da nam pomagate pri izboljševanju. Cenimo vaše mnenje.", + "notification-key-added": "Ključ je dodan", + "notification-key-removed": "Ključ odstranjen", + "notification-server-destroyed": "Strežnik je uničen", + "notification-server-exists": "Strežnik je že dodan", + "notification-server-removed": "Strežnik je odstranjen", + "oauth-account-active": "Račun DigitalOcean je aktiviran.", + "oauth-account-active-tag": "Račun je aktiviran. Nalaganje lokacij strežnika …", + "oauth-activate-account": "Aktivirajte račun DigitalOcean.", + "oauth-billing": "Na digitalocean.com vnesite podatke za obračunavanje in se vrnite v aplikacijo, ko končate.", + "oauth-billing-tag": "Vnesite podatke za obračunavanje …", + "oauth-connect-description": "Če za Outline omogočite dostop do vašega računa, boste lahko preprosto ustvarili strežnik in se povezali.", + "oauth-connect-tag": "Čakanje na povezovanje računa …", + "oauth-connect-title": "Prijavite se v DigitalOcean ali ustvarite račun za DigitalOcean.", + "oauth-sign-out": "Odjava", + "oauth-verify": "V nabiralniku preverite, ali ste prejeli e-poštno sporočilo ponudnika DigitalOcean, in kliknite povezavo v njem, da potrdite račun.", + "oauth-verify-tag": "Potrdite svoj e-poštni naslov …", + "okay": "V redu", + "per-key-data-limit-dialog-set-custom": "Nastavi omejitev podatkov po meri", + "per-key-data-limit-dialog-title": "Omejitev podatkov – {keyName}", + "region-best-value": "Najboljša vrednost", + "region-description": "To je lokacija, s katere boste povezani v internet.", + "region-setup": "Nastavi Outline", + "region-title": "Izberite lokacijo strežnika.", + "remove": "Odstrani", + "retry": "Poskusi znova", + "save": "Shrani", + "saved": "Shranjeno", + "saving": "Shranjevanje …", + "server-access": "Dostop do strežnika", + "server-access-key-new": "Dodaj nov ključ", + "server-access-key-rename": "Preimenuj", + "server-access-keys": "Ključi za dostop", + "server-connections": "Povezave", + "server-data-transfer": "Količina prenesenih podatkov/zadnjih 30 dni", + "server-data-used": "Uporabljena količina/zadnjih 30 dni", + "server-destroy": "Uniči strežnik", + "server-help-access-key-description": "Ključe za dostop delite s prijatelji, tako da se lahko povežejo v vaš strežnik Outline. V vseh svojih napravah lahko uporabijo isti ključ za dostop.", + "server-help-access-key-next": "Naprej", + "server-help-access-key-title": "Ustvarjanje ključev, delitev dostopa", + "server-help-connection-description": "Kliknite tukaj, da namestite aplikacijo odjemalca Outline prek osebnega ključa za dostop do strežnika Outline.", + "server-help-connection-ok": "V redu, razumem.", + "server-help-connection-title": "Niste še povezani.", + "server-keys": "Ključi", + "server-my-access-key": "Moj ključ za dostop", + "server-name": "Strežnik Outline {serverLocation}", + "server-remove": "Odstrani strežnik", + "server-settings": "Nastavitve", + "server-unreachable": "Strežnika ni mogoče doseči", + "server-unreachable-description": "Imamo težave pri povezovanju v ta strežnik.", + "server-unreachable-managed-description": "Poskusite znova ali ta strežnik odstranite iz aplikacije.", + "server-unreachable-manual-description": "Poskusite znova ali uničite ta strežnik in virtualnega gostitelja.", + "server-usage": "Uporaba (zadnjih 30 dni)", + "servers-add": "Dodaj strežnik", + "servers-digitalocean": "Strežniki DigitalOcean", + "servers-gcp": "Strežniki Google Cloud Platform", + "servers-manual": "Strežniki", + "settings-access-key-port": "Vrata za nove ključe za dostop", + "settings-metrics-header": "Deli anonimne meritve", + "settings-server-api-url": "URL API-ja za upravljanje", + "settings-server-cost": "Mesečni stroški", + "settings-server-creation": "Ustvarjeno", + "settings-server-hostname": "Ime gostitelja", + "settings-server-id": "ID strežnika", + "settings-server-info": "Podatki o strežniku", + "settings-server-location": "Lokacija strežnika", + "settings-server-name": "Ime", + "settings-server-rename": "Nastavite novo ime strežnika. Upoštevajte, da to ne bo uveljavljeno v napravah uporabnikov, ki ste jih povabili, da se povežejo v vaš strežnik.", + "settings-server-version": "Različica strežnika", + "settings-transfer-limit": "Dovoljena količina prenosa podatkov", + "setup-action": "Nastavi", + "setup-advanced": "Dodatno", + "setup-anywhere": "Outline lahko nastavite kjer koli", + "setup-cancel": "Preklic je mogoč kadar koli.", + "setup-create": "Ustvari strežnik", + "setup-description": "Ali nimate strežnika? Ustvarite račun pri ponudniku DigitalOcean.", + "setup-do-cost": "Samo 6 USD na mesec", + "setup-do-create": "Ustvarite nov strežnik z računom DigitalOcean in si za dodatnih 6 USD/30 dni zagotovite 1 TB prenosa podatkov.", + "setup-do-data": "1 TB razpoložljive količine prenosa podatkov", + "setup-do-description": "To lahko traja nekaj minut. Ta strežnik lahko kadar koli uničite.", + "setup-do-easiest": "Najlažji postopek nastavitve", + "setup-do-title": "Nastavljanje strežnika Outline.", + "setup-firewall-instructions": "Navodila glede požarnega zidu", + "setup-gcp-create": "Ustvarite nov strežnik z računom Google. Stroški so odvisni od lokacije in uporabe.", + "setup-gcp-easy": "Preprost postopek nastavitve", + "setup-gcp-free-tier": "Na {openLinkFreeTier}brezplačni ravni{closeLink} se cena za prvi strežnik začne pri {openLinkIpPrice}3 USD/mesec{closeLink}.", + "setup-gcp-free-trial": "{openLinkFreeTrial}90-dnevni brezplačen preizkus{closeLink} za nove uporabnike.", + "setup-gcp-promo": "Preizkusite novi postopek samodejnega ustvarjanja strežnika Outline za Google Cloud.", + "setup-recommended": "Priporočeno", + "setup-simple-commands": "Preprosti ukazi za namestitev", + "setup-step-by-step": "Vodnik za nastavitev po korakih", + "setup-tested": "Preizkušeno pri ponudnikih VULTR, Linode in Liquid Web", + "setup-title": "Izberite storitev v oblaku za nastavitev strežnika Outline.", + "share-description": "Kopirajte to povabilo in ga pošljite iz komunikacijskega orodja, ki mu zaupate. {openLink}Potrebujete pomoč?{closeLink}", + "share-invite-access-key-copied": "Ključ za dostop je kopiran v odložišče.", + "share-invite-copied": "Povabilo je kopirano v odložišče.", + "share-invite-copy": "Kopiranje povabila", + "share-invite-copy-access-key": "Kopiraj ključ za dostop", + "share-invite-html": "Za varen dostop do odprtega interneta uporabite ta strežnik:

1) Prenesite in namestite aplikacijo Outline za napravo:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Alternativna povezava za Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Prejeli boste ključ za dostop, ki se začne s ss://. Ko prejmete ključ za dostop, ga kopirajte.

3) Odprite odjemalsko aplikacijo Outline. Če je ključ za dostop samodejno zaznan, se dotaknite možnosti »Poveži« in nadaljujte. Če ključ za dostop ni bil samodejno zaznan, ga prilepite v polje, nato pa se dotaknite možnosti »Poveži« in nadaljujte.

Zdaj lahko uporabljate odprti internet. Če želite preveriti uspešno vzpostavitev povezave s strežnikom, v Iskanju Google poiščite »what is my ip« (kakšen je moj naslov IP). Naslov IP, prikazan v Googlu, se mora ujemati z naslovom IP v odjemalski aplikaciji Outline.

Več o storitvi Outline preberite tukaj: https://getoutline.org/", + "share-invite-instructions": "Upoštevajte navodila v povabilu v platformi GitHub:", + "share-invite-trouble": "Imate težave z dostopom do povezave povabila?", + "share-title": "Delitev dostopa", + "survey-data-limits-title": "Pomagajte nam ugotoviti, kako bi lahko izboljšali omejitve podatkov", + "survey-decline": "Zavrni", + "survey-disclaimer": "Če kliknete gumb za nadaljevanje, boste preusmerjeni v kratko anketo v Google Obrazcih. Priporočamo, da anketo izpolnete, ko ste povezani s strežnikom Outline.", + "survey-go-to-survey": "V anketo", + "terms-of-service": "Prebral(-a) sem {openLink}pogoje storitve Outline{closeLink} in jih razumem" +} diff --git a/server_manager/messages/sq.json b/server_manager/messages/sq.json new file mode 100644 index 0000000000..b176830e63 --- /dev/null +++ b/server_manager/messages/sq.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline është një projekt me burim të hapur i krijuar nga Jigsaw për të ofruar një mënyrë më të sigurt për t'u qasur në internet për organizatat e lajmeve dhe gazetarët.

Outline mundësohet nga Shadowsocks dhe është akoma një produkt në fazë të hershme. Mund të kontribuosh për kodin në GitHub dhe të na ndjekësh në Reddit dhe Medium për t'u informuar kur të zgjerohemi në platforma të tjera dhe të shtojmë veçori të reja.", + "about-version": "Versioni {version}", + "aws-lightsail-firewall-0": "Navigo tek ekrani i ekzemplarëve të {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Kliko tek ekzemplari në të cilin dëshiron ta strehosh Outline.", + "aws-lightsail-firewall-2": "Navigo te skeda \"Rrjetet\" (Networking).", + "aws-lightsail-firewall-3": "Në seksionin \"Muri mbrojtës\" (Firewall), kliko te \"Shto një tjetër\" (Add another).", + "aws-lightsail-firewall-4": "Caktoje vlerën \"Aplikacioni\" (Application) te \"Të gjitha TCP+UDP\" (All TCP+UDP).", + "aws-lightsail-firewall-5": "Kliko te \"Ruaj\" (Save).", + "cancel": "Anulo", + "close": "Mbyll", + "confirmation-server-destroy": "Përdoruesit ekzistues do të humbasin qasjen. Ky veprim nuk mund të zhbëhet.", + "confirmation-server-destroy-title": "Të shkatërrohet serveri?", + "confirmation-server-remove": "Ky veprim e heq serverin tënd nga Outline Manager, por nuk e bllokon qasjen e serverit proxy për përdoruesit. Do të duhet ta fshish përsëri në mënyrë manuale serverin e Outline nga pajisja pritëse.", + "confirmation-server-remove-title": "Të hiqet serveri?", + "data-limit": "Kufiri i të dhënave", + "data-limit-per-key": "Kufiri i të dhënave për çdo çelës", + "data-limits": "Kufijtë e të dhënave", + "data-limits-description": "Cakto një kufi gradual 30-ditor të transferimit të të dhënave për çelësat e qasjes në këtë server.", + "data-limits-dialog-text": "Shko te skeda \"Cilësimet\" për të caktuar një kufi të transferimit të të dhënave për çelësat e qasjes në këtë server.", + "data-limits-dialog-title": "Shmang përdorimet e tepërta të të dhënave", + "data-limits-disclaimer": "Duke qenë se po raporton aktualisht metrikën, përdorimi i veçorisë së kufijve të të dhënave do të përfshihet. Shiko {openLink}politikën për mbledhjen e të dhënave{closeLink} për më shumë detaje.", + "data-limits-usage": "Të përdorura: {used} nga {total}", + "destroy": "Shkatërro", + "digitalocean-disconnect-account": "Shkëpute llogarinë e DigitalOcean", + "digitalocean-unreachable": "Ky gabim mund të jetë shkaktuar nga një mur mbrojtës në rrjetin tënd ose nga probleme të përkohshme të lidhjes me digitalocean.com.", + "disabled": "Çaktivizuar", + "disconnect": "Shkëput", + "done": "U krye", + "enabled": "Aktivizuar", + "error-connectivity": "Kemi probleme me lidhjen me llogarinë tënde të DigitalOcean. Ndonjëherë ky është një problem i përkohshëm me DigitalOcean ose me lidhjen tënde të internetit. Nëse nuk zgjidhet duke e provuar përsëri, ky problem duhet të rregullohet duke u identifikuar përsëri në DigitalOcean.", + "error-connectivity-title": "Problem i lidhjes", + "error-do-account-info": "Marrja e informacioneve të llogarisë së DigitalOcean dështoi", + "error-do-auth": "Vërtetimi me DigitalOcean dështoi", + "error-do-limit": "Llogaria jote e DigitalOcean ka arritur kufirin e saj prej {num} pikëzash. Mund të kërkosh një rritje në https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Marrja e listës së rajoneve të disponueshme dështoi", + "error-do-warning": "Paralajmërimi nga DigitalOcean: \"{message}\"", + "error-feedback": "Dërgimi i komenteve dështoi. Provo përsëri.", + "error-gcp-auth": "Vërtetimi me Google Cloud Platform dështoi", + "error-hostname-invalid": "Duhet të jetë një adresë IP ose një emër i vlefshëm pritësi.", + "error-key-add": "Shtimi i çelësit dështoi", + "error-key-remove": "Heqja e çelësit dështoi", + "error-key-rename": "Riemërtimi i çelësit dështoi", + "error-keys-get": "Çelësat nuk mund të ngarkoheshin", + "error-keys-port-bad-input": "Porta duhet të jetë një numër i plotë nga 1 deri në 65 535.", + "error-keys-port-in-use": "Porta është tashmë në përdorim në server.", + "error-licenses": "Licencat nuk mund të ngarkoheshin.", + "error-metrics": "Gabim gjatë caktimit të aktivizimit të metrikës", + "error-network": "Ndodhi një gabim i rrjetit.", + "error-not-saved": "Nuk u ruajt", + "error-remove-data-limit": "Kufiri i parazgjedhur i të dhënave nuk mund të çaktivizohej", + "error-remove-per-key-limit": "Kufiri i të dhënave nuk mund të hiqej nga ky çelës qasjeje", + "error-server-creation": "Ndodhi një gabim gjatë krijimit të serverit tënd të Outline.", + "error-server-destroy": "Shkatërrimi i serverit dështoi", + "error-server-removed": "{serverName} nuk është më i pranishëm në llogarinë tënde të DigitalOcean.", + "error-server-rename": "Riemërtimi i serverit dështoi", + "error-server-unreachable": "Serveri yt i Outline u instalua si duhet, por nuk mund të lidhemi me të. Ka shumë mundësi që kjo të ndodhë sepse rregullat e murit mbrojtës të serverit tënd i bllokojnë lidhjet hyrëse. Rishikoji ata dhe sigurohu që të lejosh lidhjet hyrëse të protokollit TCP në portat nga 1024 deri në 65 535.", + "error-server-unreachable-title": "Nuk mund të lidhesh me serverin tënd të Outline", + "error-servers-removed": "{serverNames} nuk janë më të pranishëm në llogarinë tënde të DigitalOcean.", + "error-set-data-limit": "Kufiri i parazgjedhur i të dhënave nuk mund të caktohej", + "error-set-per-key-limit": "Kufiri i të dhënave nuk mund të caktohej për këtë çelës qasjeje", + "error-unexpected": "Ndodhi një gabim i papritur.", + "experimental": "Eksperimentale", + "experiments": "Eksperimentet", + "experiments-description": "Testo veçoritë e reja dhe na jep komentet e tua para se të publikohen.", + "experiments-disclaimer": "Eksperimentet janë në zhvillim dhe mund të ndryshohen ose të hiqen nga aplikacioni. Nëse po raporton aktualisht metrikën, përdorimi i veçorive eksperimentale do të përfshihet. Shiko {openLink}politikën për mbledhjen e të dhënave{closeLink} për më shumë detaje.", + "experiments-feedback": "Ke sugjerime? {openLink}Dërgo komentet këtu.{closeLink}", + "feedback-cloud-provider": "Zgjidh ofruesin e shërbimit të resë kompjuterike", + "feedback-cloud-provider-error": "Zgjidh një ofrues të shërbimit të resë kompjuterike.", + "feedback-connection": "Nuk mund të lidhem me serverin tim", + "feedback-connection-others": "Të tjerët nuk mund të lidhen me serverin tim", + "feedback-disclaimer": "Ki parasysh se ekipi ynë mund t'u përgjigjet komenteve vetëm në anglisht.", + "feedback-email": "Adresa e email-it (opsionale)", + "feedback-error": "Shkruaj komentet.", + "feedback-explanation-install": "Ndodhi një gabim gjatë përpjekjes për ta instaluar Outline në serverin tënd. Nëse nuk ke arritur të gjesh një zgjidhje, ki parasysh të na dërgosh komentet e tua dhe të na tregosh adresën tënde të email-it (opsionale) që të mund të të kontaktojmë përsëri.", + "feedback-general": "Komente të përgjithshme", + "feedback-install": "Kam probleme me instalimin e Outline", + "feedback-label": "Komentet e tua", + "feedback-management": "Kam probleme me menaxhimin e serverit tim", + "feedback-other": "Tjetër", + "feedback-privacy": "Komentet e tua, adresa e email-it (nëse jepet) dhe informacionet shtesë të përmendura në {openLink}politikën e privatësisë{closeLink} do t'i dërgohen ekipit të Outline.", + "feedback-submit": "Dërgo", + "feedback-suggestion": "Sugjerime", + "feedback-title-generic": "Dërgo komentet", + "feedback-title-install": "Instalimi i serverit të Outline dështoi", + "gcp-billing-action": "Para", + "gcp-billing-body": "Në pritje që {openLink}të shtosh një llogari faturimi në Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Hap faqen e faturimit të Cloud Console{closeLink} dhe shto një llogari për të vazhduar.", + "gcp-billing-error": "Informacionet e faturimit nuk mund të merren", + "gcp-billing-error-zero": "Duhet të shtosh një llogari faturimi para se të vazhdosh.", + "gcp-click-create": "Kliko te \"Krijo\" (Create).", + "gcp-create-new-project": "{openLink}Krijo një projekt të ri të Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Krijo një ekzemplar të ri të pajisjes virtuale (VM){closeLink}.", + "gcp-create-project": "Krijo një projekt të Google Cloud", + "gcp-create-server": "Krijo projektin tënd të Google Cloud", + "gcp-create-vm": "Krijo një ekzemplar të pajisjes virtuale (VM)", + "gcp-disconnect-account": "Shkëpute llogarinë e Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Shto një rregull të ri të murit mbrojtës{closeLink} në projektin tënd të Compute Engine.", + "gcp-firewall-create-1": "Shkruaj \"outline\" në fushën \"Emri\" (Name).", + "gcp-firewall-create-2": "Shkruaj \"outline\" në fushën \"Etiketat e objektivit\" (Target tags).", + "gcp-firewall-create-3": "Shkruaj \"0.0.0.0/0\" në fushën \"Intervali i IP-ve të burimit\" (Source IP ranges).", + "gcp-firewall-create-4": "Zgjidh \"Lejo të gjitha\" (Allow all) nën \"Protokollet dhe portat\" (Protocols and ports).", + "gcp-name-your-project": "Emërtoje projektin tënd në fushën \"Emri i projektit\" (Project name).", + "gcp-project-setup-error": "Ndodhi një gabim gjatë konfigurimit të projektit tënd të Google Cloud", + "gcp-select-machine-type": "Zgjidh \"f1-micro\" nën \"Lloji i pajisjes\" (Machine type)", + "gcp-select-networking": "Kliko te \"Menaxhimi, siguria, disqet, rrjetet, pronësi unike\" (Management, security, disks, networking, sole tenancy) dhe më pas te \"Rrjetet\" (Networking)", + "gcp-select-region": "Zgjidh një rajon afër vendndodhjes ku do të jenë përdoruesit e serverit nën opsionin \"Rajoni\" (Region).", + "gcp-type-network-tag": "Shkruaj \"outline\" në fushën \"Etiketat e rrjetit\" (Network tags).", + "gcp-type-outline-server": "Shkruaj \"outline-server\" në fushën \"Emri\" (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Konteja Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong-Kong", + "geo-iowa": "Ioua", + "geo-jakarta": "Xhakartë", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londër", + "geo-los-angeles": "Los Anxhelos", + "geo-melbourne": "Melburn", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "Nju-Jork", + "geo-northern-virginia": "Virxhinia e Veriut", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Solt-Lejk-Siti", + "geo-san-francisco": "San-Francisko", + "geo-sao-paulo": "Sao-Paulo", + "geo-seoul": "Seul", + "geo-sg": "Singapor", + "geo-south-carolina": "Karolina e Jugut", + "geo-st-ghislain": "Shën-Ghislain", + "geo-sydney": "Sidnei", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varshavë", + "geo-zurich": "Zyrih", + "key": "Çelësi {keyId}", + "manual-server-assign-firewall": "Cakto rregullin e murit mbrojtës", + "manual-server-assign-group": "Cakto grupin e sigurisë", + "manual-server-create-firewall": "Krijo një rregull të murit mbrojtës", + "manual-server-create-group": "Krijo një grup sigurie", + "manual-server-description": "Këta hapa do të të ndihmojnë ta instalosh Outline në një server me sistemin operativ Linux të {cloudProvider}.", + "manual-server-firewall": "Konfiguro murin mbrojtës", + "manual-server-install-paste": "Ngjit këtu daljen e instalimit.", + "manual-server-install-run": "Identifikohu në serverin tënd dhe ekzekuto këtë komandë.", + "manual-server-instructions": "Udhëzimet", + "manual-server-show-me": "Më trego se ku", + "manual-server-title": "Ndiq udhëzimet më poshtë", + "metrics-description": "Ndaj metrikën e anonimizuar për të ndihmuar në përmirësimin e besueshmërisë dhe cilësisë së funksionimit të Outline, për ty dhe për ata me të cilët e ndan serverin tënd. {openLink}Mëso më shumë.{closeLink}", + "metrics-share": "Ndaj metrikën", + "metrics-skip": "Kapërce", + "metrics-title": "Ndarja e metrikës", + "nav-about": "Informacione", + "nav-data-collection": "Mbledhja e të dhënave", + "nav-feedback": "Komentet", + "nav-help": "Ndihma", + "nav-licenses": "Licencat", + "nav-privacy": "Privatësia", + "nav-terms": "Kushtet", + "no-data-limit": "Asnjë", + "notification-app-update": "Një version i përditësuar i Outline Manager është shkarkuar. Ai do të instalohet kur ta rinisësh aplikacionin.", + "notification-feedback-thanks": "Faleminderit që na ndihmon të përmirësohemi! Na pëlqen shumë të mësojmë nga ti.", + "notification-key-added": "Çelësi u shtua", + "notification-key-removed": "Çelësi u hoq", + "notification-server-destroyed": "Serveri u shkatërrua", + "notification-server-exists": "Serveri është shtuar tashmë", + "notification-server-removed": "Serveri u hoq", + "oauth-account-active": "Llogaria jote e DigitalOcean është aktivizuar.", + "oauth-account-active-tag": "Llogaria u aktivizua! Vendndodhjet e serverit po ngarkohen...", + "oauth-activate-account": "Aktivizo llogarinë tënde të DigitalOcean.", + "oauth-billing": "Fut informacionet e tua të faturimit në digitalocean.com dhe kthehu përsëri tek aplikacioni kur të mbarosh.", + "oauth-billing-tag": "Fut informacionet e faturimit...", + "oauth-connect-description": "Me llogarinë tënde, Outline e bën të lehtë të krijosh një server dhe të lidhesh.", + "oauth-connect-tag": "Në pritje për lidhjen e llogarisë sate...", + "oauth-connect-title": "Identifikohu ose krijo një llogari me DigitalOcean.", + "oauth-sign-out": "Dil", + "oauth-verify": "Kontrollo kutinë hyrëse për një email nga DigitalOcean dhe kliko te lidhja në të për të konfirmuar llogarinë tënde.", + "oauth-verify-tag": "Konfirmo email-in tënd...", + "okay": "Në rregull", + "per-key-data-limit-dialog-set-custom": "Cakto një kufi të personalizuar të të dhënave", + "per-key-data-limit-dialog-title": "Kufiri i të dhënave - {keyName}", + "region-best-value": "Vlera më e mirë", + "region-description": "Ky është vendi nga do të vijë përvoja jote me internetin.", + "region-setup": "Konfiguro Outline", + "region-title": "Zgjidh vendndodhjen e serverit tënd.", + "remove": "Hiq", + "retry": "Riprovo", + "save": "Ruaj", + "saved": "U ruajt", + "saving": "Po ruhet...", + "server-access": "Qasja te serveri", + "server-access-key-new": "Shto një çelës të ri", + "server-access-key-rename": "Riemërto", + "server-access-keys": "Çelësat e qasjes", + "server-connections": "Lidhjet", + "server-data-transfer": "Të dhënat e transferuara / 30 ditët e fundit", + "server-data-used": "Sasia e lejuar e përdorur / 30 ditët e fundit", + "server-destroy": "Shkatërro serverin", + "server-help-access-key-description": "Ndaji çelësat e qasjes me shokët që ata të mund të lidhen me serverin tënd të Outline. Ata mund të përdorin të njëjtin çelës qasjeje në të gjitha pajisjet e tyre.", + "server-help-access-key-next": "Para", + "server-help-access-key-title": "Krijo çelësa dhe ndaj qasjen", + "server-help-connection-description": "Kliko këtu për të instaluar aplikacionin e klientit të Outline duke përdorur çelësin tënd personal të qasjes në serverin tënd të Outline.", + "server-help-connection-ok": "Në rregull, e kuptova!", + "server-help-connection-title": "Nuk je lidhur ende!", + "server-keys": "Çelësat", + "server-my-access-key": "Çelësi im i qasjes", + "server-name": "Serveri i Outline në {serverLocation}", + "server-remove": "Hiqe serverin", + "server-settings": "Cilësimet", + "server-unreachable": "Serveri është i paarritshëm", + "server-unreachable-description": "Kemi probleme me lidhjen me këtë server.", + "server-unreachable-managed-description": "Provo përsëri ose hiqe këtë server nga aplikacioni.", + "server-unreachable-manual-description": "Provo përsëri ose shkatërroje këtë server dhe pritësin virtual.", + "server-usage": "Përdorimi (30 ditët e fundit)", + "servers-add": "Shto një server", + "servers-digitalocean": "Serverët e DigitalOcean", + "servers-gcp": "Serverët e Google Cloud Platform", + "servers-manual": "Serverët", + "settings-access-key-port": "Porta për çelësat e rinj të qasjes", + "settings-metrics-header": "Ndaj metrikën anonime", + "settings-server-api-url": "URL-ja e API-së së menaxhimit", + "settings-server-cost": "Kostoja mujore", + "settings-server-creation": "Krijuar", + "settings-server-hostname": "Emri i pritësit", + "settings-server-id": "ID-ja e serverit", + "settings-server-info": "Informacionet e serverit", + "settings-server-location": "Vendndodhja e serverit", + "settings-server-name": "Emri", + "settings-server-rename": "Cakto një emër të ri për serverin tënd. Ki parasysh se kjo nuk do të pasqyrohet në pajisjet e përdoruesve që ke ftuar të lidhen me të.", + "settings-server-version": "Versioni i serverit", + "settings-transfer-limit": "Sasia e lejuar për transferimin e të dhënave", + "setup-action": "Konfiguro", + "setup-advanced": "Të përparuara", + "setup-anywhere": "Konfiguroje Outline në çdo vend", + "setup-cancel": "Anuloje në çdo kohë", + "setup-create": "Krijo një server", + "setup-description": "Nuk ke një server? Krijo një llogari me DigitalOcean.", + "setup-do-cost": "Vetëm 6 USD në muaj", + "setup-do-create": "Krijo një server të ri me llogarinë tënde të DigitalOcean për 6 USD shtesë/30 ditë për transferimin e të dhënave me 1 TB.", + "setup-do-data": "Sasia e lejuar e transferimit të të dhënave prej 1 TB", + "setup-do-description": "Kjo mund të zgjasë disa minuta. Mund ta shkatërrosh këtë server në çdo kohë.", + "setup-do-easiest": "Procesi më i lehtë i konfigurimit", + "setup-do-title": "Outline po konfigurohet.", + "setup-firewall-instructions": "Udhëzimet për murin mbrojtës", + "setup-gcp-create": "Krijo një server të ri me \"Llogarinë tënde të Google\". Kostot variojnë sipas vendndodhjes dhe përdorimit.", + "setup-gcp-easy": "Proces i lehtë i konfigurimit", + "setup-gcp-free-tier": "Me {openLinkFreeTier}Nivelin falas{closeLink}, serveri yt i parë fillon nga {openLinkIpPrice}3 USD/muaj{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Prova falas për 90 ditë{closeLink} për përdoruesit e rinj", + "setup-gcp-promo": "Provo procesin e ri automatik për krijimin e serverit të Outline për Google Cloud", + "setup-recommended": "Të rekomanduar", + "setup-simple-commands": "Komanda të thjeshta të instalimit", + "setup-step-by-step": "Udhëzuesi i konfigurimit hap pas hapi", + "setup-tested": "Testuar në VULTR, Linode dhe Liquid Web", + "setup-title": "Zgjidh një shërbim të resë kompjuterike për të konfiguruar Outline.", + "share-description": "Kopjoje këtë ftesë dhe dërgoje atë nga një vegël komunikimi që i beson. {openLink}Ke nevojë për ndihmë?{closeLink}", + "share-invite-access-key-copied": "Çelësi i qasjes u kopjua te kujtesa e fragmenteve", + "share-invite-copied": "Ftesa u kopjua te kujtesa e fragmenteve", + "share-invite-copy": "Kopjo ftesën", + "share-invite-copy-access-key": "Kopjo çelësin e qasjes", + "share-invite-html": "Përdor këtë server për t'u qasur në mënyrë të sigurt në internetin e hapur:

1) Shkarko dhe instalo aplikacionin Outline për pajisjen tënde:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Lidhja alternative për Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Do të marrësh një çelës qasjeje që fillon me ss://. Pasi ta marrësh, kopjoje këtë çelës qasjeje.

3) Hap aplikacionin e klientit të Outline. Nëse çelësi yt i qasjes zbulohet automatikisht, trokit te \"Lidhu\" dhe vazhdo. Nëse çelësi yt i qasjes nuk zbulohet automatikisht, atëherë ngjite atë te fusha dhe më pas trokit te \"Lidhu\" dhe vazhdo.

Je gati të përdorësh internetin e hapur! Për t'u siguruar që je lidhur me sukses me serverin, provo të kërkosh me \"cila është adresa ime IP\" në \"Kërko në Google\". Adresa IP e shfaqur në Google duhet të përputhet me adresën IP në klientin e Outline.

Mëso më shumë rreth Outline këtu: https://getoutline.org/", + "share-invite-instructions": "Ndiq udhëzimet tona për ftesat në GitHub:", + "share-invite-trouble": "Ke probleme me qasjen te lidhja e ftesës?", + "share-title": "Ndaj qasjen", + "survey-data-limits-title": "Na ndihmo të kuptojmë se si të përmirësojmë kufijtë e të dhënave", + "survey-decline": "Refuzo", + "survey-disclaimer": "Duke klikuar te \"Vazhdo\", do të dërgohesh te një anketë e shkurtër te \"Formularët e Google\". Ne rekomandojmë që ta plotësosh anketën ndërkohë që je i lidhur me Outline.", + "survey-go-to-survey": "Shko tek anketa", + "terms-of-service": "Unë i kam lexuar dhe i kam kuptuar {openLink}Kushtet e shërbimit të Outline{closeLink}" +} diff --git a/server_manager/messages/sr-Latn.json b/server_manager/messages/sr-Latn.json new file mode 100644 index 0000000000..5ce39df938 --- /dev/null +++ b/server_manager/messages/sr-Latn.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline je projekat otvorenog koda koji je napravio Jigsaw da bi novinskim agencijama i novinarima omogućio da bezbednije pristupaju internetu.

Outline koristi tehnologiju Shadowsocks i još uvek je u ranim fazama razvoja. Možete da date svoj doprinos kodu na GitHub-u i da nas pratite na Reddit-u i Medium-u da biste čuli kada se proširimo na još platformi i dodamo nove funkcije.", + "about-version": "Verzija {version}", + "aws-lightsail-firewall-0": "Pređite na ekran sa {openLink}Amazon Lightsail{closeLink} instancama.", + "aws-lightsail-firewall-1": "Kliknite na instancu na kojoj želite da hostujete Outline.", + "aws-lightsail-firewall-2": "Pređite na karticu „Umrežavanje“ (Networking).", + "aws-lightsail-firewall-3": "U odeljku „Zaštitni zid“ (Firewall) kliknite na „Dodaj drugi“ (Add another).", + "aws-lightsail-firewall-4": "Vrednost „Aplikacija“ (Application) podesite na „Kompletan TCP+UDP“ (All TCP+UDP).", + "aws-lightsail-firewall-5": "Kliknite na „Sačuvaj“ (Save).", + "cancel": "Otkaži", + "close": "Zatvori", + "confirmation-server-destroy": "Postojeći korisnici će izgubiti pristup. Ovu radnju ne možete da opozovete.", + "confirmation-server-destroy-title": "Želite li da izbrišete server?", + "confirmation-server-remove": "Ova radnja uklanja server iz Outline Manager-a, ali ne blokira korisnicima pristup proksiju. I dalje morate ručno da izbrišete Outline server sa računara koji ga hostuje.", + "confirmation-server-remove-title": "Želite li da uklonite server?", + "data-limit": "Ograničenje potrošnje podataka", + "data-limit-per-key": "Ograničenje potrošnje podataka po ključu", + "data-limits": "Ograničenja potrošnje podataka", + "data-limits-description": "Podesite ograničenje prenosa podataka u odnosu na poslednjih 30 dana za pristupne ključeve na ovom serveru.", + "data-limits-dialog-text": "Otvorite karticu Podešavanja da biste podesili ograničenje prenosa podataka za pristupne ključeve na ovom serveru.", + "data-limits-dialog-title": "Izbegnite prekomernu potrošnju podataka", + "data-limits-disclaimer": "Budući da trenutno šaljete izveštaje o pokazateljima, biće obuhvaćena upotreba funkcije za ograničenje potrošnje podataka. Dodatne podatke potražite u {openLink}smernicama za prikupljanje podataka{closeLink}.", + "data-limits-usage": "Iskorišćeno je {used} od {total}", + "destroy": "Izbriši", + "digitalocean-disconnect-account": "Prekinite vezu sa DigitalOcean nalogom", + "digitalocean-unreachable": "Do ove greške je možda došlo zbog zaštitnog zida na vašoj mreži ili privremenih problema sa povezivanjem na digitalocean.com.", + "disabled": "Onemogućeno", + "disconnect": "Prekini vezu", + "done": "Gotovo", + "enabled": "Omogućeno", + "error-connectivity": "Imamo problema pri povezivanju sa vašim DigitalOcean nalogom. Razlog može da bude privremeni problem sa DigitalOcean-om ili vašom internet vezom. Probajte ponovo, a ako ne uspete, problem bi trebalo da se reši kada se ponovo prijavite u DigitalOcean.", + "error-connectivity-title": "Problem pri povezivanju", + "error-do-account-info": "Preuzimanje informacija o DigitalOcean nalogu nije uspelo", + "error-do-auth": "Potvrda identiteta kod DigitalOcean-a nije uspela", + "error-do-limit": "DigitalOcean nalog je dostigao ograničenje za virtuelne servere ({num}). Možete da zatražite povećanje na https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Preuzimanje liste dostupnih regiona nije uspelo", + "error-do-warning": "DigitalOcean upozorenje: „{message}“", + "error-feedback": "Slanje povratnih informacija nije uspelo. Probajte ponovo.", + "error-gcp-auth": "Potvrda identiteta u Google Cloud Platform-u nije uspela", + "error-hostname-invalid": "Mora da bude IP adresa ili važeće ime hosta.", + "error-key-add": "Dodavanje ključa nije uspelo", + "error-key-remove": "Uklanjanje ključa nije uspelo", + "error-key-rename": "Preimenovanje ključa nije uspelo", + "error-keys-get": "Učitavanje ključeva nije uspelo", + "error-keys-port-bad-input": "Port mora da bude ceo broj između 1 i 65.535.", + "error-keys-port-in-use": "Port se već koristi na serveru.", + "error-licenses": "Učitavanje licenci nije uspelo.", + "error-metrics": "Greška pri omogućavanju pokazatelja", + "error-network": "Došlo je do greške na mreži.", + "error-not-saved": "Nije sačuvano", + "error-remove-data-limit": "Onemogućavanje podrazumevanog ograničenja potrošnje podataka nije uspelo", + "error-remove-per-key-limit": "Uklanjanje ograničenja potrošnje podataka za ovaj pristupni ključ nije uspelo", + "error-server-creation": "Došlo je do greške pri pravljenju Outline servera.", + "error-server-destroy": "Brisanje servera nije uspelo", + "error-server-removed": "{serverName} više nije prisutan na DigitalOcean nalogu.", + "error-server-rename": "Preimenovanje servera nije uspelo", + "error-server-unreachable": "Outline server je ispravno instaliran, ali ne možemo da se povežemo s njim. To je najverovatnije zbog toga što pravila zaštitnog zida vašeg servera blokiraju dolazne veze. Pregledajte ih i obavezno dozvolite dolazne TCP veze na portovima u opsegu od 1024 do 65535.", + "error-server-unreachable-title": "Ne možemo da se povežemo sa vašim Outline serverom", + "error-servers-removed": "{serverNames} više nisu prisutni na DigitalOcean nalogu.", + "error-set-data-limit": "Podešavanje podrazumevanog ograničenja potrošnje podataka nije uspelo", + "error-set-per-key-limit": "Podešavanje ograničenja potrošnje podataka za ovaj pristupni ključ nije uspelo", + "error-unexpected": "Došlo je do neočekivane greške.", + "experimental": "Eksperimentalno", + "experiments": "Eksperimenti", + "experiments-description": "Testirajte nove funkcije i pružite nam povratne informacije pre njihovog izdavanja.", + "experiments-disclaimer": "Eksperimenti su u fazi razvoja i možemo da ih promenimo ili uklonimo iz aplikacije. Ako trenutno prijavljujete pokazatelje, biće obuhvaćena upotreba eksperimentalnih funkcija. Dodatne podatke potražite u {openLink}smernicama za prikupljanje podataka{closeLink}.", + "experiments-feedback": "Imate predloge? {openLink}Ovde pošaljite povratne informacije.{closeLink}", + "feedback-cloud-provider": "Izaberite dobavljača klauda", + "feedback-cloud-provider-error": "Izaberite dobavljača klauda.", + "feedback-connection": "Ne mogu da se povežem sa serverom", + "feedback-connection-others": "Drugi ne mogu da se povežu sa mojim serverom", + "feedback-disclaimer": "Imajte u vidu da naš tim može da odgovori samo na povratne informacije navedene na engleskom.", + "feedback-email": "Imejl adresa (opcionalno)", + "feedback-error": "Unesite povratne informacije.", + "feedback-explanation-install": "Došlo je do greške pri pokušaju instaliranja Outline-a na serveru. Ako ne možete da pronađete rešenje, ne bi bilo loše da nam pošaljete povratne informacije i navedete imejl adresu (opcionalno) da bismo mogli da vam odgovorimo.", + "feedback-general": "Opšte povratne informacije", + "feedback-install": "Imam problema pri instaliranju Outline-a", + "feedback-label": "Vaše povratne informacije", + "feedback-management": "Imam problema pri upravljanju serverom", + "feedback-other": "Drugo", + "feedback-privacy": "Povratne informacije, imejl adresa (ako je navedete) i dodatne informacije pomenute u {openLink}politici privatnosti{closeLink} šalju se Outline timu.", + "feedback-submit": "Pošalji", + "feedback-suggestion": "Predlozi", + "feedback-title-generic": "Pošaljite povratne informacije", + "feedback-title-install": "Instalacija Outline servera nije uspela", + "gcp-billing-action": "Dalje", + "gcp-billing-body": "Čekamo da {openLink}dodate nalog za obračun u Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Otvorite stranicu obračuna za Cloud Console{closeLink} i dodajte nalog da biste nastavili.", + "gcp-billing-error": "Preuzimanje informacija za obračun nije uspelo", + "gcp-billing-error-zero": "Morate da dodate nalog za obračun da biste nastavili.", + "gcp-click-create": "Kliknite na Create (Napravi).", + "gcp-create-new-project": "{openLink}Napravite novi Google Cloud projekat{closeLink}.", + "gcp-create-new-vm": "{openLink}Napravite novu instancu virtuelne mašine{closeLink}.", + "gcp-create-project": "Napravite Google Cloud projekat", + "gcp-create-server": "Napravite Google Cloud projekat", + "gcp-create-vm": "Napravite instancu virtuelne mašine", + "gcp-disconnect-account": "Prekinite vezu sa Google Cloud Platform nalogom", + "gcp-firewall-create-0": "{openLink}Dodajte novo pravilo zaštitnog zida{closeLink} u Compute Engine projekat.", + "gcp-firewall-create-1": "Unesite „outline“ u polje Name (Ime).", + "gcp-firewall-create-2": "Unesite „outline“ u polje Target tags (Oznake odredišta).", + "gcp-firewall-create-3": "Unesite 0.0.0.0/0 u polje Source IP ranges (Opsezi izvornih IP adresa).", + "gcp-firewall-create-4": "Izaberite Allow all (Dozvoli sve) u odeljku Protocols and ports (Protokoli i portovi).", + "gcp-name-your-project": "Ime projekta unesite u polje „Ime projekta“ (Project name).", + "gcp-project-setup-error": "Došlo je do greške pri podešavanju Google Cloud projekta", + "gcp-select-machine-type": "U odeljku „Tip mašine“ (Machine type) izaberite „f1-micro“", + "gcp-select-networking": "Kliknite na „Upravljanje, bezbednost, diskovi, umrežavanje, isključiv zakup“ (Management, security, disks, networking, sole tenancy), pa na „Umrežavanje“ (Networking)", + "gcp-select-region": "U odeljku „Region“ (Region) izaberite region koji se nalazi blizu lokacije korisnika servera.", + "gcp-type-network-tag": "Unesite „outline“ u polje „Oznake mreže“ (Network tags)", + "gcp-type-outline-server": "Unesite „outline-server“ u polje „Ime“ (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalor", + "geo-changhua-county": "Okrug Čanghua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Emshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Ajova", + "geo-jakarta": "Džakarta", + "geo-jurong-west": "Jurong Vest", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Anđeles", + "geo-melbourne": "Melburn", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbaj", + "geo-new-york-city": "Njujork", + "geo-northern-virginia": "Severna Virdžinija", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Solt Lejk Siti", + "geo-san-francisco": "San Francisko", + "geo-sao-paulo": "Sao Paulo", + "geo-seoul": "Seul", + "geo-sg": "Singapur", + "geo-south-carolina": "Južna Karolina", + "geo-st-ghislain": "Sen Gislen", + "geo-sydney": "Sidnej", + "geo-tokyo": "Tokio", + "geo-toronto": "Toronto", + "geo-warsaw": "Varšava", + "geo-zurich": "Cirih", + "key": "Ključ {keyId}", + "manual-server-assign-firewall": "Dodelite pravilo zaštitnog zida", + "manual-server-assign-group": "Dodelite bezbednosnu grupu", + "manual-server-create-firewall": "Napravite pravilo zaštitnog zida", + "manual-server-create-group": "Napravite bezbednosnu grupu", + "manual-server-description": "Pomoću ovih koraka ćete moći da instalirate Outline na {cloudProvider} Linux serveru.", + "manual-server-firewall": "Konfigurišite zaštitni zid", + "manual-server-install-paste": "Ovde nalepite izlaz instalacije.", + "manual-server-install-run": "Prijavite se na server i pokrenite ovu komandu.", + "manual-server-instructions": "Uputstva", + "manual-server-show-me": "Pokaži mi gde", + "manual-server-title": "Pratite uputstva u nastavku", + "metrics-description": "Delite anonimne pokazatelje da biste poboljšali pouzdanost i učinak Outline-a za sebe i druge sa kojima delite server. {openLink}Saznajte više.{closeLink}", + "metrics-share": "Deli pokazatelje", + "metrics-skip": "Preskoči", + "metrics-title": "Deljenje pokazatelja", + "nav-about": "Osnovni podaci", + "nav-data-collection": "Prikupljanje podataka", + "nav-feedback": "Povratne informacije", + "nav-help": "Pomoć", + "nav-licenses": "Licence", + "nav-privacy": "Privatnost", + "nav-terms": "Uslovi", + "no-data-limit": "Nema", + "notification-app-update": "Preuzeta je ažurirana verzija Outline Manager-a. Instaliraće se kada restartujete aplikaciju.", + "notification-feedback-thanks": "Hvala vam što nam pomažete da se poboljšamo! Volimo da se čujemo s vama.", + "notification-key-added": "Ključ je dodat", + "notification-key-removed": "Ključ je uklonjen", + "notification-server-destroyed": "Server je izbrisan", + "notification-server-exists": "Server je već dodat", + "notification-server-removed": "Server je uklonjen", + "oauth-account-active": "DigitalOcean nalog je aktivan.", + "oauth-account-active-tag": "Nalog je aktivan! Učitavaju se lokacije servera...", + "oauth-activate-account": "Aktivirajte DigitalOcean nalog.", + "oauth-billing": "Unesite informacije za obračun na digitalocean.com i vratite se u aplikaciju kad završite.", + "oauth-billing-tag": "Unesite informacije za obračun...", + "oauth-connect-description": "Ako mu dozvolite pristup nalogu, Outline vam omogućava da lako napravite server i povezujete se na njega.", + "oauth-connect-tag": "Čeka se da se nalog poveže...", + "oauth-connect-title": "Prijavite se ili otvorite DigitalOcean nalog.", + "oauth-sign-out": "Odjavi me", + "oauth-verify": "U prijemnom sandučetu potražite imejl od DigitalOcean-a i kliknite na link u njemu da biste potvrdili nalog.", + "oauth-verify-tag": "Potvrdite imejl...", + "okay": "Važi", + "per-key-data-limit-dialog-set-custom": "Podesi prilagođeno ograničenje potrošnje podataka", + "per-key-data-limit-dialog-title": "Ograničenje potrošnje podataka – {keyName}", + "region-best-value": "Najbolja ponuda", + "region-description": "Odavde ćete dobijati pristup internetu.", + "region-setup": "Podesi Outline", + "region-title": "Izaberite lokaciju servera.", + "remove": "Ukloni", + "retry": "Probaj ponovo", + "save": "Sačuvaj", + "saved": "Sačuvano je", + "saving": "Čuva se...", + "server-access": "Pristup serveru", + "server-access-key-new": "Dodaj nov ključ", + "server-access-key-rename": "Promeni ime", + "server-access-keys": "Pristupni ključevi", + "server-connections": "Veze", + "server-data-transfer": "Preneto podataka/poslednjih 30 dana", + "server-data-used": "Iskorišćena količina/poslednjih 30 dana", + "server-destroy": "Izbriši server", + "server-help-access-key-description": "Delite pristupne ključeve sa prijateljima da bi mogli da se povezuju na vaš Outline server. Mogu da koriste isti pristupni ključ na svim uređajima.", + "server-help-access-key-next": "Dalje", + "server-help-access-key-title": "Pravite ključeve, delite pristup", + "server-help-connection-description": "Kliknite ovde da biste instalirali klijentsku aplikaciju Outline pomoću ličnog pristupnog ključa za Outline server.", + "server-help-connection-ok": "Važi!", + "server-help-connection-title": "Još uvek niste povezani!", + "server-keys": "Ključevi", + "server-my-access-key": "Moj pristupni ključ", + "server-name": "Outline server {serverLocation}", + "server-remove": "Ukloni server", + "server-settings": "Podešavanja", + "server-unreachable": "Server je nedostupan", + "server-unreachable-description": "Imamo problema pri povezivanju sa ovim serverom.", + "server-unreachable-managed-description": "Probajte ponovo ili uklonite ovaj server iz aplikacije.", + "server-unreachable-manual-description": "Probajte ponovo ili izbrišite ovaj server i virtuelni host.", + "server-usage": "Iskorišćenost (poslednjih 30 dana)", + "servers-add": "Dodajte server", + "servers-digitalocean": "DigitalOcean serveri", + "servers-gcp": "Google Cloud Platform serveri", + "servers-manual": "Serveri", + "settings-access-key-port": "Port za nove pristupne ključeve", + "settings-metrics-header": "Delite anonimne pokazatelje", + "settings-server-api-url": "URL API-ja za upravljanje", + "settings-server-cost": "Mesečni trošak", + "settings-server-creation": "Napravljeno", + "settings-server-hostname": "Ime hosta", + "settings-server-id": "ID servera", + "settings-server-info": "Informacije o serveru", + "settings-server-location": "Lokacija servera", + "settings-server-name": "Ime", + "settings-server-rename": "Podesite novo ime servera. Imajte na umu da se ono neće videti na uređajima korisnika koje ste pozvali da se na njega povežu.", + "settings-server-version": "Verzija servera", + "settings-transfer-limit": "Dozvoljena količina podataka za prenos", + "setup-action": "Podesi", + "setup-advanced": "Napredno", + "setup-anywhere": "Podesite Outline bilo gde", + "setup-cancel": "Uvek možete da otkažete", + "setup-create": "Napravi server", + "setup-description": "Nemate server? Napravite DigitalOcean nalog.", + "setup-do-cost": "Samo 6 USD mesečno", + "setup-do-create": "Napravite nov server pomoću DigitalOcean naloga po ceni od dodatnih 6 USD za 30 dana za 1 TB podataka koje možete da prenesete.", + "setup-do-data": "Dozvoljena količina podataka za prenos je 1 TB", + "setup-do-description": "Ovo može da traje par minuta. Uvek možete da izbrišete ovaj server.", + "setup-do-easiest": "Najlakše podešavanje", + "setup-do-title": "Outline se podešava.", + "setup-firewall-instructions": "Uputstva za zaštitni zid", + "setup-gcp-create": "Napravite novi server pomoću Google naloga. Cene se razlikuju u zavisnosti od lokacije i upotrebe.", + "setup-gcp-easy": "Jednostavan proces podešavanja", + "setup-gcp-free-tier": "Uz {openLinkFreeTier}Besplatni paket{closeLink}, početna cena za prvi server je samo {openLinkIpPrice}3 USD mesečno{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Besplatan probni period od 90 dana{closeLink} za nove korisnike", + "setup-gcp-promo": "Isprobajte novi automatski proces pravljenja Outline servera za Google Cloud", + "setup-recommended": "Preporučeno", + "setup-simple-commands": "Jednostavne komande za instaliranje", + "setup-step-by-step": "Detaljan vodič za podešavanje", + "setup-tested": "Testirano je na VULTR-u, Linode-u i Liquid Web-u", + "setup-title": "Izaberite klaud uslugu da biste podesili Outline.", + "share-description": "Kopirajte ovaj poziv i pošaljite ga pomoću pouzdane alatke za komunikaciju. {openLink}Potrebna vam je pomoć?{closeLink}", + "share-invite-access-key-copied": "Pristupni ključ je kopiran u privremenu memoriju", + "share-invite-copied": "Poziv je kopiran u privremenu memoriju", + "share-invite-copy": "Kopiraj poziv", + "share-invite-copy-access-key": "Kopiraj pristupni ključ", + "share-invite-html": "Koristite ovaj server da biste bezbedno pristupali otvorenom internetu:

1) Preuzmite i instalirajte aplikaciju Outline za svoj uređaj:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Alternativni link za Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Dobićete pristupni ključ koji počinje sa ss://. Kad ga dobijete, kopirajte ovaj pristupni ključ.

3) Otvorite klijentsku aplikaciju Outline. Ako se pristupni ključ otkrije automatski, dodirnite Poveži i nastavite. Ako se pristupni ključ ne otkrije automatski, nalepite ga u polje, pa dodirnite Poveži i nastavite.

Spremni ste za korišćenje otvorenog interneta! Da biste bili sigurni da ste se povezali sa serverom, u Google pretrazi potražite „koja je moja IP adresa“. IP adresa koja se prikazuje na Google-u treba da se podudara sa IP adresom u klijentskoj aplikaciji Outline.

Saznajte više o Outline-u ovde: https://getoutline.org/", + "share-invite-instructions": "Pratite uputstva o pozivima na GitHub-u:", + "share-invite-trouble": "Imate problema sa pristupom linku poziva?", + "share-title": "Delite pristup", + "survey-data-limits-title": "Pomozite nam da poboljšamo ograničenje potrošnje podataka", + "survey-decline": "Odbij", + "survey-disclaimer": "Ako kliknete na Nastavi, preći ćete na kratku anketu u Google upitnicima. Preporučujemo da anketu popunite dok ste povezani sa Outline-om.", + "survey-go-to-survey": "Otvori anketu", + "terms-of-service": "Pročitao/la sam i razumem {openLink}Uslove korišćenja usluge za Outline{closeLink}" +} diff --git a/server_manager/messages/sr.json b/server_manager/messages/sr.json new file mode 100644 index 0000000000..04d4383368 --- /dev/null +++ b/server_manager/messages/sr.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline је пројекат отвореног кода који је направио Jigsaw да би новинским агенцијама и новинарима омогућио да безбедније приступају интернету.

Outline користи технологију Shadowsocks и још увек је у раним фазама развоја. Можете да дате свој допринос коду на GitHub-у и да нас пратите на Reddit-у и Medium-у да бисте чули када се проширимо на још платформи и додамо нове функције.", + "about-version": "Верзија {version}", + "aws-lightsail-firewall-0": "Пређите на екран са {openLink}Amazon Lightsail{closeLink} инстанцама.", + "aws-lightsail-firewall-1": "Кликните на инстанцу на којој желите да хостујете Outline.", + "aws-lightsail-firewall-2": "Пређите на картицу „Умрежавање“ (Networking).", + "aws-lightsail-firewall-3": "У одељку „Заштитни зид“ (Firewall) кликните на „Додај други“ (Add another).", + "aws-lightsail-firewall-4": "Вредност „Апликација“ (Application) подесите на „Комплетан TCP+UDP“ (All TCP+UDP).", + "aws-lightsail-firewall-5": "Кликните на „Сачувај“ (Save).", + "cancel": "Откажи", + "close": "Затвори", + "confirmation-server-destroy": "Постојећи корисници ће изгубити приступ. Ову радњу не можете да опозовете.", + "confirmation-server-destroy-title": "Желите ли да избришете сервер?", + "confirmation-server-remove": "Ова радња уклања сервер из Outline Manager-а, али не блокира корисницима приступ проксију. И даље морате ручно да избришете Outline сервер са рачунара који га хостује.", + "confirmation-server-remove-title": "Желите ли да уклоните сервер?", + "data-limit": "Ограничење потрошње података", + "data-limit-per-key": "Ограничење потрошње података по кључу", + "data-limits": "Ограничења потрошње података", + "data-limits-description": "Подесите ограничење преноса података у односу на последњих 30 дана за приступне кључеве на овом серверу.", + "data-limits-dialog-text": "Отворите картицу Подешавања да бисте подесили ограничење преноса података за приступне кључеве на овом серверу.", + "data-limits-dialog-title": "Избегните прекомерну потрошњу података", + "data-limits-disclaimer": "Будући да тренутно шаљете извештаје о показатељима, биће обухваћена употреба функције за ограничење потрошње података. Додатне податке потражите у {openLink}смерницама за прикупљање података{closeLink}.", + "data-limits-usage": "Искоришћено је {used} од {total}", + "destroy": "Избриши", + "digitalocean-disconnect-account": "Прекините везу са DigitalOcean налогом", + "digitalocean-unreachable": "До ове грешке је можда дошло због заштитног зида на вашој мрежи или привремених проблема са повезивањем на digitalocean.com.", + "disabled": "Онемогућено", + "disconnect": "Прекини везу", + "done": "Готово", + "enabled": "Омогућено", + "error-connectivity": "Имамо проблема при повезивању са вашим DigitalOcean налогом. Разлог може да буде привремени проблем са DigitalOcean-ом или вашом интернет везом. Пробајте поново, а ако не успете, проблем би требало да се реши када се поново пријавите у DigitalOcean.", + "error-connectivity-title": "Проблем при повезивању", + "error-do-account-info": "Преузимање информација о DigitalOcean налогу није успело", + "error-do-auth": "Потврда идентитета код DigitalOcean-а није успела", + "error-do-limit": "DigitalOcean налог је достигао ограничење за виртуелне сервере ({num}). Можете да затражите повећање на https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Преузимање листе доступних региона није успело", + "error-do-warning": "DigitalOcean упозорење: „{message}“", + "error-feedback": "Слање повратних информација није успело. Пробајте поново.", + "error-gcp-auth": "Потврда идентитета у Google Cloud Platform-у није успела", + "error-hostname-invalid": "Мора да буде IP адреса или важеће име хоста.", + "error-key-add": "Додавање кључа није успело", + "error-key-remove": "Уклањање кључа није успело", + "error-key-rename": "Преименовање кључа није успело", + "error-keys-get": "Учитавање кључева није успело", + "error-keys-port-bad-input": "Порт мора да буде цео број између 1 и 65.535.", + "error-keys-port-in-use": "Порт се већ користи на серверу.", + "error-licenses": "Учитавање лиценци није успело.", + "error-metrics": "Грешка при омогућавању показатеља", + "error-network": "Дошло је до грешке на мрежи.", + "error-not-saved": "Није сачувано", + "error-remove-data-limit": "Онемогућавање подразумеваног ограничења потрошње података није успело", + "error-remove-per-key-limit": "Уклањање ограничења потрошње података за овај приступни кључ није успело", + "error-server-creation": "Дошло је до грешке при прављењу Outline сервера.", + "error-server-destroy": "Брисање сервера није успело", + "error-server-removed": "{serverName} више није присутан на DigitalOcean налогу.", + "error-server-rename": "Преименовање сервера није успело", + "error-server-unreachable": "Outline сервер је исправно инсталиран, али не можемо да се повежемо с њим. То је највероватније због тога што правила заштитног зида вашег сервера блокирају долазне везе. Прегледајте их и обавезно дозволите долазне TCP везе на портовима у опсегу од 1024 до 65535.", + "error-server-unreachable-title": "Не можемо да се повежемо са вашим Outline сервером", + "error-servers-removed": "{serverNames} више нису присутни на DigitalOcean налогу.", + "error-set-data-limit": "Подешавање подразумеваног ограничења потрошње података није успело", + "error-set-per-key-limit": "Подешавање ограничења потрошње података за овај приступни кључ није успело", + "error-unexpected": "Дошло је до неочекиване грешке.", + "experimental": "Експериментално", + "experiments": "Експерименти", + "experiments-description": "Тестирајте нове функције и пружите нам повратне информације пре њиховог издавања.", + "experiments-disclaimer": "Експерименти су у фази развоја и можемо да их променимо или уклонимо из апликације. Ако тренутно пријављујете показатеље, биће обухваћена употреба експерименталних функција. Додатне податке потражите у {openLink}смерницама за прикупљање података{closeLink}.", + "experiments-feedback": "Имате предлоге? {openLink}Овде пошаљите повратне информације.{closeLink}", + "feedback-cloud-provider": "Изаберите добављача клауда", + "feedback-cloud-provider-error": "Изаберите добављача клауда.", + "feedback-connection": "Не могу да се повежем са сервером", + "feedback-connection-others": "Други не могу да се повежу са мојим сервером", + "feedback-disclaimer": "Имајте у виду да наш тим може да одговори само на повратне информације наведене на енглеском.", + "feedback-email": "Имејл адреса (опционално)", + "feedback-error": "Унесите повратне информације.", + "feedback-explanation-install": "Дошло је до грешке при покушају инсталирања Outline-а на серверу. Ако не можете да пронађете решење, не би било лоше да нам пошаљете повратне информације и наведете имејл адресу (опционално) да бисмо могли да вам одговоримо.", + "feedback-general": "Опште повратне информације", + "feedback-install": "Имам проблема при инсталирању Outline-а", + "feedback-label": "Ваше повратне информације", + "feedback-management": "Имам проблема при управљању сервером", + "feedback-other": "Друго", + "feedback-privacy": "Повратне информације, имејл адреса (ако је наведете) и додатне информације поменуте у {openLink}политици приватности{closeLink} шаљу се Outline тиму.", + "feedback-submit": "Пошаљи", + "feedback-suggestion": "Предлози", + "feedback-title-generic": "Пошаљите повратне информације", + "feedback-title-install": "Инсталација Outline сервера није успела", + "gcp-billing-action": "Даље", + "gcp-billing-body": "Чекамо да {openLink}додате налог за обрачун у Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Отворите страницу обрачуна за Cloud Console{closeLink} и додајте налог да бисте наставили.", + "gcp-billing-error": "Преузимање информација за обрачун није успело", + "gcp-billing-error-zero": "Морате да додате налог за обрачун да бисте наставили.", + "gcp-click-create": "Кликните на Create (Направи).", + "gcp-create-new-project": "{openLink}Направите нови Google Cloud пројекат{closeLink}.", + "gcp-create-new-vm": "{openLink}Направите нову инстанцу виртуелне машине{closeLink}.", + "gcp-create-project": "Направите Google Cloud пројекат", + "gcp-create-server": "Направите Google Cloud пројекат", + "gcp-create-vm": "Направите инстанцу виртуелне машине", + "gcp-disconnect-account": "Прекините везу са Google Cloud Platform налогом", + "gcp-firewall-create-0": "{openLink}Додајте ново правило заштитног зида{closeLink} у Compute Engine пројекат.", + "gcp-firewall-create-1": "Унесите „outline“ у поље Name (Име).", + "gcp-firewall-create-2": "Унесите „outline“ у поље Target tags (Ознаке одредишта).", + "gcp-firewall-create-3": "Унесите 0.0.0.0/0 у поље Source IP ranges (Опсези изворних IP адреса).", + "gcp-firewall-create-4": "Изаберите Allow all (Дозволи све) у одељку Protocols and ports (Протоколи и портови).", + "gcp-name-your-project": "Име пројекта унесите у поље „Име пројекта“ (Project name).", + "gcp-project-setup-error": "Дошло је до грешке при подешавању Google Cloud пројекта", + "gcp-select-machine-type": "У одељку „Тип машине“ (Machine type) изаберите „f1-micro“", + "gcp-select-networking": "Кликните на „Управљање, безбедност, дискови, умрежавање, искључив закуп“ (Management, security, disks, networking, sole tenancy), па на „Умрежавање“ (Networking)", + "gcp-select-region": "У одељку „Регион“ (Region) изаберите регион који се налази близу локације корисника сервера.", + "gcp-type-network-tag": "Унесите „outline“ у поље „Ознаке мреже“ (Network tags)", + "gcp-type-outline-server": "Унесите „outline-server“ у поље „Име“ (Name).", + "geo-amsterdam": "Амстердам", + "geo-bangalore": "Бангалор", + "geo-changhua-county": "Округ Чангхуа", + "geo-delhi": "Делхи", + "geo-eemshaven": "Емсхавен", + "geo-frankfurt": "Франкфурт", + "geo-hamina": "Хамина", + "geo-hk": "Хонгконг", + "geo-iowa": "Ајова", + "geo-jakarta": "Џакарта", + "geo-jurong-west": "Јуронг Вест", + "geo-las-vegas": "Лас Вегас", + "geo-london": "Лондон", + "geo-los-angeles": "Лос Анђелес", + "geo-melbourne": "Мелбурн", + "geo-montreal": "Монтреал", + "geo-mumbai": "Мумбај", + "geo-new-york-city": "Њујорк", + "geo-northern-virginia": "Северна Вирџинија", + "geo-oregon": "Орегон", + "geo-osaka": "Осака", + "geo-salt-lake-city": "Солт Лејк Сити", + "geo-san-francisco": "Сан Франциско", + "geo-sao-paulo": "Сао Пауло", + "geo-seoul": "Сеул", + "geo-sg": "Сингапур", + "geo-south-carolina": "Јужна Каролина", + "geo-st-ghislain": "Сен Гислен", + "geo-sydney": "Сиднеј", + "geo-tokyo": "Токио", + "geo-toronto": "Торонто", + "geo-warsaw": "Варшава", + "geo-zurich": "Цирих", + "key": "Кључ {keyId}", + "manual-server-assign-firewall": "Доделите правило заштитног зида", + "manual-server-assign-group": "Доделите безбедносну групу", + "manual-server-create-firewall": "Направите правило заштитног зида", + "manual-server-create-group": "Направите безбедносну групу", + "manual-server-description": "Помоћу ових корака ћете моћи да инсталирате Outline на {cloudProvider} Linux серверу.", + "manual-server-firewall": "Конфигуришите заштитни зид", + "manual-server-install-paste": "Овде налепите излаз инсталације.", + "manual-server-install-run": "Пријавите се на сервер и покрените ову команду.", + "manual-server-instructions": "Упутства", + "manual-server-show-me": "Покажи ми где", + "manual-server-title": "Пратите упутства у наставку", + "metrics-description": "Делите анонимне показатеље да бисте побољшали поузданост и учинак Outline-а за себе и друге са којима делите сервер. {openLink}Сазнајте више.{closeLink}", + "metrics-share": "Дели показатеље", + "metrics-skip": "Прескочи", + "metrics-title": "Дељење показатеља", + "nav-about": "Основни подаци", + "nav-data-collection": "Прикупљање података", + "nav-feedback": "Повратне информације", + "nav-help": "Помоћ", + "nav-licenses": "Лиценце", + "nav-privacy": "Приватност", + "nav-terms": "Услови", + "no-data-limit": "Нема", + "notification-app-update": "Преузета је ажурирана верзија Outline Manager-а. Инсталираће се када рестартујете апликацију.", + "notification-feedback-thanks": "Хвала вам што нам помажете да се побољшамо! Волимо да се чујемо с вама.", + "notification-key-added": "Кључ је додат", + "notification-key-removed": "Кључ је уклоњен", + "notification-server-destroyed": "Сервер је избрисан", + "notification-server-exists": "Сервер је већ додат", + "notification-server-removed": "Сервер је уклоњен", + "oauth-account-active": "DigitalOcean налог је активан.", + "oauth-account-active-tag": "Налог је активан! Учитавају се локације сервера...", + "oauth-activate-account": "Активирајте DigitalOcean налог.", + "oauth-billing": "Унесите информације за обрачун на digitalocean.com и вратите се у апликацију кад завршите.", + "oauth-billing-tag": "Унесите информације за обрачун...", + "oauth-connect-description": "Ако му дозволите приступ налогу, Outline вам омогућава да лако направите сервер и повезујете се на њега.", + "oauth-connect-tag": "Чека се да се налог повеже...", + "oauth-connect-title": "Пријавите се или отворите DigitalOcean налог.", + "oauth-sign-out": "Одјави ме", + "oauth-verify": "У пријемном сандучету потражите имејл од DigitalOcean-а и кликните на линк у њему да бисте потврдили налог.", + "oauth-verify-tag": "Потврдите имејл...", + "okay": "Важи", + "per-key-data-limit-dialog-set-custom": "Подеси прилагођено ограничење потрошње података", + "per-key-data-limit-dialog-title": "Ограничење потрошње података – {keyName}", + "region-best-value": "Најбоља понуда", + "region-description": "Одавде ћете добијати приступ интернету.", + "region-setup": "Подеси Outline", + "region-title": "Изаберите локацију сервера.", + "remove": "Уклони", + "retry": "Пробај поново", + "save": "Сачувај", + "saved": "Сачувано је", + "saving": "Чува се...", + "server-access": "Приступ серверу", + "server-access-key-new": "Додај нов кључ", + "server-access-key-rename": "Промени име", + "server-access-keys": "Приступни кључеви", + "server-connections": "Везе", + "server-data-transfer": "Пренето података/последњих 30 дана", + "server-data-used": "Искоришћена количина/последњих 30 дана", + "server-destroy": "Избриши сервер", + "server-help-access-key-description": "Делите приступне кључеве са пријатељима да би могли да се повезују на ваш Outline сервер. Могу да користе исти приступни кључ на свим уређајима.", + "server-help-access-key-next": "Даље", + "server-help-access-key-title": "Правите кључеве, делите приступ", + "server-help-connection-description": "Кликните овде да бисте инсталирали клијентску апликацију Outline помоћу личног приступног кључа за Outline сервер.", + "server-help-connection-ok": "Важи!", + "server-help-connection-title": "Још увек нисте повезани!", + "server-keys": "Кључеви", + "server-my-access-key": "Мој приступни кључ", + "server-name": "Outline сервер {serverLocation}", + "server-remove": "Уклони сервер", + "server-settings": "Подешавања", + "server-unreachable": "Сервер је недоступан", + "server-unreachable-description": "Имамо проблема при повезивању са овим сервером.", + "server-unreachable-managed-description": "Пробајте поново или уклоните овај сервер из апликације.", + "server-unreachable-manual-description": "Пробајте поново или избришите овај сервер и виртуелни хост.", + "server-usage": "Искоришћеност (последњих 30 дана)", + "servers-add": "Додајте сервер", + "servers-digitalocean": "DigitalOcean сервери", + "servers-gcp": "Google Cloud Platform сервери", + "servers-manual": "Сервери", + "settings-access-key-port": "Порт за нове приступне кључеве", + "settings-metrics-header": "Делите анонимне показатеље", + "settings-server-api-url": "URL API-ја за управљање", + "settings-server-cost": "Месечни трошак", + "settings-server-creation": "Направљено", + "settings-server-hostname": "Име хоста", + "settings-server-id": "ИД сервера", + "settings-server-info": "Информације о серверу", + "settings-server-location": "Локација сервера", + "settings-server-name": "Име", + "settings-server-rename": "Подесите ново име сервера. Имајте на уму да се оно неће видети на уређајима корисника које сте позвали да се на њега повежу.", + "settings-server-version": "Верзија сервера", + "settings-transfer-limit": "Дозвољена количина података за пренос", + "setup-action": "Подеси", + "setup-advanced": "Напредно", + "setup-anywhere": "Подесите Outline било где", + "setup-cancel": "Увек можете да откажете", + "setup-create": "Направи сервер", + "setup-description": "Немате сервер? Направите DigitalOcean налог.", + "setup-do-cost": "Само 6 USD месечно", + "setup-do-create": "Направите нов сервер помоћу DigitalOcean налога по цени од додатних 6 USD за 30 дана за 1 TB података које можете да пренесете.", + "setup-do-data": "Дозвољена количина података за пренос је 1 TB", + "setup-do-description": "Ово може да траје пар минута. Увек можете да избришете овај сервер.", + "setup-do-easiest": "Најлакше подешавање", + "setup-do-title": "Outline се подешава.", + "setup-firewall-instructions": "Упутства за заштитни зид", + "setup-gcp-create": "Направите нови сервер помоћу Google налога. Цене се разликују у зависности од локације и употребе.", + "setup-gcp-easy": "Једноставан процес подешавања", + "setup-gcp-free-tier": "Уз {openLinkFreeTier}Бесплатни пакет{closeLink}, почетна цена за први сервер је само {openLinkIpPrice}3 USD месечно{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Бесплатан пробни период од 90 дана{closeLink} за нове кориснике", + "setup-gcp-promo": "Испробајте нови аутоматски процес прављења Outline сервера за Google Cloud", + "setup-recommended": "Препоручено", + "setup-simple-commands": "Једноставне команде за инсталирање", + "setup-step-by-step": "Детаљан водич за подешавање", + "setup-tested": "Тестирано је на VULTR-у, Linode-у и Liquid Web-у", + "setup-title": "Изаберите клауд услугу да бисте подесили Outline.", + "share-description": "Копирајте овај позив и пошаљите га помоћу поуздане алатке за комуникацију. {openLink}Потребна вам је помоћ?{closeLink}", + "share-invite-access-key-copied": "Приступни кључ је копиран у привремену меморију", + "share-invite-copied": "Позив је копиран у привремену меморију", + "share-invite-copy": "Копирај позив", + "share-invite-copy-access-key": "Копирај приступни кључ", + "share-invite-html": "Користите овај сервер да бисте безбедно приступали отвореном интернету:

1) Преузмите и инсталирајте апликацију Outline за свој уређај:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Алтернативни линк за Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Добићете приступни кључ који почиње са ss://. Кад га добијете, копирајте овај приступни кључ.

3) Отворите клијентску апликацију Outline. Ако се приступни кључ открије аутоматски, додирните Повежи и наставите. Ако се приступни кључ не открије аутоматски, налепите га у поље, па додирните Повежи и наставите.

Спремни сте за коришћење отвореног интернета! Да бисте били сигурни да сте се повезали са сервером, у Google претрази потражите „која је моја IP адреса“. IP адреса која се приказује на Google-у треба да се подудара са IP адресом у клијентској апликацији Outline.

Сазнајте више о Outline-у овде: https://getoutline.org/", + "share-invite-instructions": "Пратите упутства о позивима на GitHub-у:", + "share-invite-trouble": "Имате проблема са приступом линку позива?", + "share-title": "Делите приступ", + "survey-data-limits-title": "Помозите нам да побољшамо ограничење потрошње података", + "survey-decline": "Одбиј", + "survey-disclaimer": "Ако кликнете на Настави, прећи ћете на кратку анкету у Google упитницима. Препоручујемо да анкету попуните док сте повезани са Outline-ом.", + "survey-go-to-survey": "Отвори анкету", + "terms-of-service": "Прочитао/ла сам и разумем {openLink}Услове коришћења услуге за Outline{closeLink}" +} diff --git a/server_manager/messages/sv.json b/server_manager/messages/sv.json new file mode 100644 index 0000000000..562cb5398e --- /dev/null +++ b/server_manager/messages/sv.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline är ett projekt baserat på öppen källkod som Jigsaw har skapat i syfte att erbjuda nyhetsorganisationer och journalister ett säkrare sätt att få åtkomst internet.

Outline drivs med Shadowsocks och är fortfarande en produkt i ett tidigt skede. Du kan bidra till koden på GitHub och följa oss på Reddit och Medium om du vill ha koll på när vi expanderar till fler plattformar och lägger till nya funktioner.", + "about-version": "Version {version}", + "aws-lightsail-firewall-0": "Navigera till skärmen för {openLink}Amazon Lightsail{closeLink}-instanser.", + "aws-lightsail-firewall-1": "Klicka på den instans som du vill ska stå värd för Outline.", + "aws-lightsail-firewall-2": "Navigera till fliken Nätverk (Networking).", + "aws-lightsail-firewall-3": "I avsnittet Brandvägg (Firewall) klickar du på Lägg till nytt (Add another).", + "aws-lightsail-firewall-4": "Ställ in värdet App (Application) på Alla TCP+UDP (All TCP+UDP).", + "aws-lightsail-firewall-5": "Klicka på Spara (Save).", + "cancel": "Avbryt", + "close": "Stäng", + "confirmation-server-destroy": "Befintliga användare förlorar åtkomsten. Åtgärden kan inte ångras.", + "confirmation-server-destroy-title": "Vill du förstöra servern?", + "confirmation-server-remove": "Detta tar bort servern från Outline Manager men blockerar inte användarnas åtkomst till proxyservrar. Du behöver fortfarande radera Outline-servern manuellt från värddatorn.", + "confirmation-server-remove-title": "Vill du ta bort servern?", + "data-limit": "Datagräns", + "data-limit-per-key": "Datagräns per nyckel", + "data-limits": "Datagränser", + "data-limits-description": "Ställ in en begränsning på minst 30 dagar för dataöverföring för åtkomstnycklar på servern.", + "data-limits-dialog-text": "Öppna fliken Inställningar om du vill ställa in en begränsning för dataöverföring för åtkomstnycklar på servern.", + "data-limits-dialog-title": "Undvik överskriden datamängd", + "data-limits-disclaimer": "Eftersom du för närvarande rapporterar mätvärden kommer användningen av funktionen för datagränser att inkluderas. I {openLink}policyn för datainsamling{closeLink} finns mer information.", + "data-limits-usage": "{used} av {total} har använts", + "destroy": "Förstör", + "digitalocean-disconnect-account": "Koppla från DigitalOcean-kontot", + "digitalocean-unreachable": "Felet kan bero på en brandvägg i nätverket eller ett tillfälligt problem med anslutningen till digitalocean.com.", + "disabled": "Inaktiverad", + "disconnect": "Koppla från", + "done": "Klar", + "enabled": "Aktiverad", + "error-connectivity": "Det går inte att ansluta till ditt DigitalOcean-konto. Det här är ibland ett tillfälligt problem med DigitalOcean eller med din internetanslutning. Om det inte fungerar när du försöker igen testar du att logga in på DigitalOcean igen. Det borde lösa problemet.", + "error-connectivity-title": "Anslutningsproblem", + "error-do-account-info": "Det gick inte att hämta information om DigitalOcean-kontot", + "error-do-auth": "Autentiseringen med DigitalOcean misslyckades", + "error-do-limit": "Ditt DigitalOcean-konto har uppnått gränsen på {num} servrar (s.k. Droplets). Du kan begära höjning av gränsen på https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Det gick inte att hämta en lista över tillgängliga regioner", + "error-do-warning": "DigitalOcean-varning: {message}", + "error-feedback": "Det gick inte att skicka feedback. Försök igen.", + "error-gcp-auth": "Autentiseringen med Google Cloud Platform misslyckades", + "error-hostname-invalid": "Måste vara en IP-adress eller ett giltigt värdnamn.", + "error-key-add": "Det gick inte att lägga till nyckel", + "error-key-remove": "Det gick inte att ta bort nyckeln", + "error-key-rename": "Det gick inte att byta namn på nyckeln", + "error-keys-get": "Det gick inte att läsa in nycklarna", + "error-keys-port-bad-input": "Porten ska anges som ett heltal mellan 1 och 65 535.", + "error-keys-port-in-use": "Porten används redan på servern.", + "error-licenses": "Det gick inte att läsa in licenser.", + "error-metrics": "Det gick inte att aktivera mätvärden", + "error-network": "Ett nätverksfel uppstod.", + "error-not-saved": "Sparades inte", + "error-remove-data-limit": "Det gick inte att inaktivera standarddatagränsen", + "error-remove-per-key-limit": "Det gick inte att ta bort datagränsen från åtkomstnyckeln", + "error-server-creation": "Det gick inte att skapa Outline-servern.", + "error-server-destroy": "Det gick inte att förstöra servern", + "error-server-removed": "{serverName} finns inte längre i DigitalOcean-kontot.", + "error-server-rename": "Det gick inte att byta namn på servern", + "error-server-unreachable": "Outline-servern installerades korrekt, men vi kan inte ansluta till den. Det beror troligen på att inkommande anslutningar blockeras av serverns brandväggsregler. Granska dem och kontrollera att de tillåter inkommande TCP-anslutningar i portar mellan 1024 och 65535.", + "error-server-unreachable-title": "Det går inte att ansluta till din Outline-server", + "error-servers-removed": "{serverNames} finns inte längre i DigitalOcean-kontot.", + "error-set-data-limit": "Det gick inte att ställa in standarddatagränsen", + "error-set-per-key-limit": "Det gick inte att ställa in datagränsen för åtkomstnyckeln", + "error-unexpected": "Ett oväntat fel uppstod.", + "experimental": "Experimentellt", + "experiments": "Experiment", + "experiments-description": "Testa nya funktioner och ge oss feedback innan de lanseras.", + "experiments-disclaimer": "Experimentella funktioner är under utveckling och kan ändras eller tas bort från appen. Om du för närvarande rapporterar mätvärden kommer användningen av experimentella funktioner att inkluderas. I {openLink}policyn för datainsamling{closeLink} finns mer information.", + "experiments-feedback": "Har du förslag? {openLink}Skicka feedback här.{closeLink}", + "feedback-cloud-provider": "Välj molnleverantör", + "feedback-cloud-provider-error": "Välj en molnleverantör.", + "feedback-connection": "Det går inte att ansluta till min server", + "feedback-connection-others": "Andra kan inte ansluta till min server", + "feedback-disclaimer": "Tänk på att vårt team endast kan svara på feedback på engelska.", + "feedback-email": "E-postadress (valfri)", + "feedback-error": "Skriv din feedback.", + "feedback-explanation-install": "Ett fel uppstod när Outline skulle installeras på servern. Om du inte har kommit på någon lösning kan du skicka feedback till oss och eventuellt ange din e-postadress så att vi kan återkomma till dig.", + "feedback-general": "Allmän feedback", + "feedback-install": "Har problem med att installera Outline", + "feedback-label": "Din feedback", + "feedback-management": "Har problem med hanteringen av min server", + "feedback-other": "Annan", + "feedback-privacy": "Din feedback, din e-postadress (om den har angetts) och ytterligare uppgifter som anges i {openLink}integritetspolicyn{closeLink} skickas till Outline-teamet.", + "feedback-submit": "Skicka in", + "feedback-suggestion": "Förslag", + "feedback-title-generic": "Skicka feedback", + "feedback-title-install": "Det gick inte att installera Outline-servern", + "gcp-billing-action": "Nästa", + "gcp-billing-body": "Väntar på att du ska {openLink}lägga till ett faktureringskonto på Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Öppna faktureringssidan för Cloud Console{closeLink} och lägg till ett konto för att gå vidare.", + "gcp-billing-error": "Faktureringsuppgifterna kan inte hämtas", + "gcp-billing-error-zero": "Ett faktureringskonto måste läggas till innan du går vidare.", + "gcp-click-create": "Klicka på Skapa (Create).", + "gcp-create-new-project": "{openLink}Skapa ett nytt Google-molnprojekt{closeLink}.", + "gcp-create-new-vm": "{openLink}Skapa en ny VM-instans{closeLink}.", + "gcp-create-project": "Skapa ett Google-molnprojekt", + "gcp-create-server": "Skapa Google-molnprojektet", + "gcp-create-vm": "Skapa en VM-instans", + "gcp-disconnect-account": "Koppla från Google Cloud Platform-kontot", + "gcp-firewall-create-0": "{openLink}Lägg till en ny brandväggsregel{closeLink} i Compute Engine-projektet.", + "gcp-firewall-create-1": "Skriv ”outline” i fältet Namn (Name).", + "gcp-firewall-create-2": "Skriv ”outline” i fältet Måltaggar (Target tags).", + "gcp-firewall-create-3": "Skriv 0.0.0.0/0 i fältet IP-intervall för källan (Source IP ranges).", + "gcp-firewall-create-4": "Välj Tillåt alla (Allow all) under Protokoll och portar (Protocols and ports).", + "gcp-name-your-project": "Namnge projektet i fältet Projektnamn (Project name).", + "gcp-project-setup-error": "Ett fel inträffade när Google Cloud-projektet skulle konfigureras", + "gcp-select-machine-type": "Välj ”f1-micro” under Maskintyp (Machine type)", + "gcp-select-networking": "Klicka på Hantering, säkerhet, diskar, nätverk, ensam besittning (Management, security, disks, networking, sole tenancy) och sedan på Nätverk (Networking).", + "gcp-select-region": "Välj en region nära där serverns användare kommer att vara under Region.", + "gcp-type-network-tag": "Skriv ”outline” i fältet Nätverkstaggar (Network tags)", + "gcp-type-outline-server": "Skriv ”outline-server” i fältet Namn (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua län", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hongkong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Northern Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "South Carolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warszawa", + "geo-zurich": "Zürich", + "key": "Nyckel {keyId}", + "manual-server-assign-firewall": "TIlldela brandväggsregler", + "manual-server-assign-group": "Tilldela säkerhetsgrupp", + "manual-server-create-firewall": "Skapa en brandväggsregel", + "manual-server-create-group": "Skapa en säkerhetsgrupp", + "manual-server-description": "Använd dessa anvisningar för att installera Outline på en {cloudProvider} Linux-server.", + "manual-server-firewall": "Konfigurera brandväggen", + "manual-server-install-paste": "Klistra in utdata från installationen här.", + "manual-server-install-run": "Logga in på servern och kör det här kommandot.", + "manual-server-instructions": "Anvisningar", + "manual-server-show-me": "Visa mig var", + "manual-server-title": "Följ anvisningarna nedan", + "metrics-description": "Dela anonymiserade mätvärden för att hjälpa oss att förbättra Outlines tillförlitlighet och prestanda för både dig och de du delar servern med. {openLink}Läs mer.{closeLink}", + "metrics-share": "Dela mätvärden", + "metrics-skip": "Hoppa över", + "metrics-title": "Delning av mätvärden", + "nav-about": "Om", + "nav-data-collection": "Datainsamling", + "nav-feedback": "Feedback", + "nav-help": "Hjälp", + "nav-licenses": "Licenser", + "nav-privacy": "Integritet", + "nav-terms": "Villkor", + "no-data-limit": "Ingen", + "notification-app-update": "En uppdaterad version av Outline Manager har laddats ned. Den installeras när du startar om appen.", + "notification-feedback-thanks": "Tack för att du hjälper oss att bli bättre! Vi uppskattar din feedback.", + "notification-key-added": "Nyckeln har lagts till", + "notification-key-removed": "Nyckeln togs bort", + "notification-server-destroyed": "Servern har förstörts", + "notification-server-exists": "Servern har redan lagts till", + "notification-server-removed": "Servern togs bort", + "oauth-account-active": "Ditt DigitalOcean-konto har aktiverats.", + "oauth-account-active-tag": "Kontot har aktiverats! Serverplatser läses in …", + "oauth-activate-account": "Aktivera DigitalOcean-kontot.", + "oauth-billing": "Ange dina faktureringsuppgifter på digitalocean.com och återgå till appen när du är klar.", + "oauth-billing-tag": "Ange faktureringsuppgifter …", + "oauth-connect-description": "Med åtkomst till ditt konto blir det enkelt att skapa en server och ansluta i Outline.", + "oauth-connect-tag": "Väntar på att ansluta till kontot …", + "oauth-connect-title": "Logga in eller skapa ett konto med DigitalOcean.", + "oauth-sign-out": "Logga ut", + "oauth-verify": "Titta efter ett e-postmeddelande från DigitalOcean i inkorgen och klicka på länken i meddelandet för att bekräfta ditt konto.", + "oauth-verify-tag": "Bekräfta din e-postadress …", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Ställ in en anpassad datagräns", + "per-key-data-limit-dialog-title": "Datagräns – {keyName}", + "region-best-value": "Bästa värde", + "region-description": "Det är härifrån du får din internetupplevelse.", + "region-setup": "Konfigurera Outline", + "region-title": "Välj plats för servern.", + "remove": "Ta bort", + "retry": "Försök igen", + "save": "Spara", + "saved": "Sparades", + "saving": "Sparar …", + "server-access": "Åtkomst till servern", + "server-access-key-new": "Lägg till en ny nyckel", + "server-access-key-rename": "Byt namn", + "server-access-keys": "Åtkomstnycklar", + "server-connections": "Anslutningar", + "server-data-transfer": "Överförd data de senaste 30 dagarna", + "server-data-used": "Använd datamängd de senaste 30 dagarna", + "server-destroy": "Förstör servern", + "server-help-access-key-description": "Dela åtkomstnycklar med vänner, så att de kan ansluta till din Outline-server. De kan använda samma åtkomstnyckel på alla sina enheter.", + "server-help-access-key-next": "Nästa", + "server-help-access-key-title": "Skapa nycklar, dela åtkomst", + "server-help-connection-description": "Klicka här för att installera klientappen för Outline. Använd din personliga åtkomstnyckel till Outline-servern.", + "server-help-connection-ok": "OK!", + "server-help-connection-title": "Du är inte ansluten än!", + "server-keys": "Nycklar", + "server-my-access-key": "Min åtkomstnyckel", + "server-name": "Outline-server {serverLocation}", + "server-remove": "Ta bort servern", + "server-settings": "Inställningar", + "server-unreachable": "Servern kan inte nås", + "server-unreachable-description": "Vi har problem med att ansluta till den här servern.", + "server-unreachable-managed-description": "Försök igen eller ta bort servern från appen.", + "server-unreachable-manual-description": "Försök igen eller förstör den här servern och den virtuella värden.", + "server-usage": "Användning (de senaste 30 dagarna)", + "servers-add": "Lägg till server", + "servers-digitalocean": "DigitalOcean-servrar", + "servers-gcp": "Google Cloud Platform-servrar", + "servers-manual": "Servrar", + "settings-access-key-port": "Port för nya åtkomstnycklar", + "settings-metrics-header": "Dela anonyma mätvärden", + "settings-server-api-url": "Webbadress för hanterings-API", + "settings-server-cost": "Månadskostnad", + "settings-server-creation": "Skapades", + "settings-server-hostname": "Värdnamn", + "settings-server-id": "Server-id", + "settings-server-info": "Serverinformation", + "settings-server-location": "Serverplats", + "settings-server-name": "Namn", + "settings-server-rename": "Ange ett nytt namn på din server. Observera att detta inte syns på dina inbjudna användares enheter.", + "settings-server-version": "Serverversion", + "settings-transfer-limit": "Tillåten dataöverföring", + "setup-action": "Konfigurera", + "setup-advanced": "Avancerat", + "setup-anywhere": "Konfigurera Outline var som helst", + "setup-cancel": "Avbryt när du vill", + "setup-create": "Skapa server", + "setup-description": "Har du ingen server? Skapa ett konto med DigitalOcean.", + "setup-do-cost": "Endast 60 SEK i månaden", + "setup-do-create": "Skapa en ny server med DigitalOcean-kontot för ytterligare 60 SEK/30 dagar för 1 TB dataöverföring.", + "setup-do-data": "1 TB dataöverföring", + "setup-do-description": "Det kan ta några minuter. Du kan förstöra servern när du vill.", + "setup-do-easiest": "Enklaste konfigurationsprocessen", + "setup-do-title": "Konfigurera Outline.", + "setup-firewall-instructions": "Anvisningar för brandväggen", + "setup-gcp-create": "Skapa en ny server med ditt Google-konto. Kostnaderna varierar beroende på plats och användning.", + "setup-gcp-easy": "Smidig konfiguration", + "setup-gcp-free-tier": "Med {openLinkFreeTier}Free Tier{closeLink} får du den första servern från {openLinkIpPrice}3 USD i månaden{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}90 dagars gratis provperiod{closeLink} för nya användare", + "setup-gcp-promo": "Prova den nya automatiska processen för att skapa Outline-servrar för Google Cloud", + "setup-recommended": "Rekommenderas", + "setup-simple-commands": "Enkla installationskommandon", + "setup-step-by-step": "Konfigurationsguide med stegvisa anvisningar", + "setup-tested": "Har testats på VULTR, Linode och Liquid Web", + "setup-title": "Välj en molntjänst för att konfigurera Outline.", + "share-description": "Kopiera inbjudan och skicka den från ett kommunikationsverktyg du litar på. {openLink}Behöver du hjälp?{closeLink}", + "share-invite-access-key-copied": "Åtkomstnyckeln har kopierats till urklipp", + "share-invite-copied": "Inbjudan har kopierats till urklipp", + "share-invite-copy": "Kopiera inbjudan", + "share-invite-copy-access-key": "Kopiera åtkomstnyckel", + "share-invite-html": "Använd den här servern för att på ett säkert sätt få åtkomst till det öppna internet:

1) Ladda ned och installera Outline-appen för din enhet:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Alternativ Android-länk: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Du får en åtkomstnyckel som börjar med ss://. Kopiera åtkomstnyckeln när du har fått den.

3) Öppna klientappen för Outline. Om åtkomstnyckeln identifieras automatiskt trycker du på Anslut och fortsätter. Om åtkomstnyckeln inte identifieras automatiskt klistrar du in den i fältet och trycker på Anslut.

Du är redo att använda det öppna internet. Kontrollera att du har anslutit till servern genom att försöka söka efter ”what is my ip” (vad är min ip) på Google Sök. IP-adressen som visas i Google ska matcha IP-adressen i Outline-klienten.

Läs mer om Outline här: https://getoutline.org/", + "share-invite-instructions": "Följ anvisningarna i inbjudan på GitHub:", + "share-invite-trouble": "Har du problem med att öppna inbjudningslänken?", + "share-title": "Dela åtkomst", + "survey-data-limits-title": "Hjälp oss att förstå hur vi kan förbättra datagränser", + "survey-decline": "Avvisa", + "survey-disclaimer": "Genom att klicka på att fortsätta skickas du till en kort undersökning om Google Formulär. Vi rekommenderar att du svarar på undersökningen när du är ansluten till Outline.", + "survey-go-to-survey": "Öppna enkäten", + "terms-of-service": "Jag har läst och förstått {openLink}användarvillkoren för Outline{closeLink}" +} diff --git a/server_manager/messages/sw.json b/server_manager/messages/sw.json new file mode 100644 index 0000000000..491b28a9fa --- /dev/null +++ b/server_manager/messages/sw.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline ni mradi wa programu huria uliobuniwa na Jigsaw ili kutoa njia salama kwa mashirika ya habari na waandishi wa habari kufikia intaneti.

Outline inaendeshwa na Shadowsocks na bado ni bidhaa ya hatua ya awali. Unaweza kuchangia kwenye msimbo katika GitHub na utufuatilie katika Reddit na Medium ili ufahamu tutakapopanuka katika mifumo na vipengele vipya.", + "about-version": "Toleo la {version}", + "aws-lightsail-firewall-0": "Nenda kwenye skrini ya matukio ya {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Bofya tukio ambalo unataka kupangisha Outline.", + "aws-lightsail-firewall-2": "Nenda kwenye kichupo cha 'Mtandao'.", + "aws-lightsail-firewall-3": "Katika sehemu ya 'Kinga mtandao', bofya 'Weka nyingine'.", + "aws-lightsail-firewall-4": "Weka thamani ya 'Programu' kuwa 'TCP+UDP Zote'.", + "aws-lightsail-firewall-5": "Bofya 'Hifadhi'.", + "cancel": "Ghairi", + "close": "Funga", + "confirmation-server-destroy": "Watumiaji waliopo watapoteza idhini ya kufikia. Kitendo hiki hakiwezi kutenduliwa.", + "confirmation-server-destroy-title": "Ungependa kuharibu Seva?", + "confirmation-server-remove": "Kitendo hiki huondoa seva yako kwenye Outline Manager lakini hakizuii uwezo wa kufikia seva mbadala kwa watumiaji. Bado utahitaji kufuta mwenyewe seva ya Outline kwenye mashine yako pangishi.", + "confirmation-server-remove-title": "Je, ungependa kuondoa Seva?", + "data-limit": "Kikomo cha Data", + "data-limit-per-key": "Kikomo cha data kwa kila ufunguo", + "data-limits": "Vikomo vya data", + "data-limits-description": "Weka kikomo cha uhamishaji wa data cha siku 30 zinazofuata kwa funguo zilizo kwenye seva hii.", + "data-limits-dialog-text": "Nenda kwenye kichupo cha Mipangilio ili uweke kikomo cha uhamishaji wa data kwa funguo kwenye seva hii.", + "data-limits-dialog-title": "Epuka kupita kikomo cha data", + "data-limits-disclaimer": "Kwa kuwa kwa sasa unaripoti vipimo, matumizi ya kipengele cha vikomo vya data yatajumuishwa. Tafadhali angalia {openLink}sera kuhusu ukusanyaji wa data{closeLink} ili upate maelezo zaidi.", + "data-limits-usage": "Umetumia {used} kati ya {total}", + "destroy": "Haribu", + "digitalocean-disconnect-account": "Tenganisha akaunti ya DigitalOcean", + "digitalocean-unreachable": "Huenda hitilafu hii inatokana na kinga mtandao kwenye mtandao wako au hitilafu za muda mfupi za muunganisho katika digitalocean.com.", + "disabled": "Kimezimwa", + "disconnect": "Tenganisha", + "done": "Nimemaliza", + "enabled": "Imewashwa", + "error-connectivity": "Tunatatizika kuunganisha kwenye akaunti yako ya DigitalOcean. Wakati mwingine hili ni tatizo la muda kwenye DigitalOcean au muunganisho wako wa intaneti. Ikiwa kujaribu tena hakufanyi kazi, kuingia kwenye DigitalOcean tena kunapaswa kurekebisha tatizo.", + "error-connectivity-title": "Tatizo la muunganisho", + "error-do-account-info": "Imeshindwa kupata maelezo ya akaunti ya DigitalOcean", + "error-do-auth": "Umeshindwa kuthibitisha kwa kutumia DigitalOcean", + "error-do-limit": "Akaunti yako ya DigitalOcean imefikia kikomo cha Seva {num}. Unaweza kuomba kuongezewa kiwango katika https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Imeshindwa kupata orodha ya maeneo itakopatikana", + "error-do-warning": "Onyo la DigitalOcean: \"{message}\"", + "error-feedback": "Imeshindwa kutuma maoni. Tafadhali jaribu tena.", + "error-gcp-auth": "Uthibitishaji na Google Cloud Platform umeshindwa", + "error-hostname-invalid": "Lazima iwe anwani ya IP au jina sahihi la mpangishaji.", + "error-key-add": "Imeshindwa kuweka ufunguo", + "error-key-remove": "Imeshindwa kuondoa ufunguo", + "error-key-rename": "Imeshindwa kubadilisha jina la ufunguo", + "error-keys-get": "Imeshindwa kupakia funguo", + "error-keys-port-bad-input": "Mlango lazima uwe nambari kamili kati ya 1 na 65,535.", + "error-keys-port-in-use": "Mlango tayari unatumika kwenye seva.", + "error-licenses": "Imeshindwa kupakia leseni.", + "error-metrics": "Hitilafu ya kuweka mipangilio ya vipimo imetokea", + "error-network": "Hitilafu ya mtandao imetokea.", + "error-not-saved": "Haijahifadhiwa", + "error-remove-data-limit": "Imeshindwa kuzima kikomo chaguomsingi cha data", + "error-remove-per-key-limit": "Haikuweza kuondoa kikomo cha data kwenye ufunguo huu", + "error-server-creation": "Hitilafu imetokea wakati wa kuunda seva yako ya Outline.", + "error-server-destroy": "Imeshindwa kuharibu seva", + "error-server-removed": "Seva ya {serverName} haipatikani tena kwenye akaunti yako ya DigitalOcean.", + "error-server-rename": "Imeshindwa kubadilisha jina la seva", + "error-server-unreachable": "Seva yako ya Outline imesakinishwa ipasavyo lakini hatuwezi kuunganisha nayo. Yamkini ni kwa sababu amri za kinga mtandao ya seva yako zinazuia miunganisho inayoingia. Tafadhali zikague na uhakikishe kuwa umeruhusu miunganisho inayoingia ya TCP kwenye milango kuanzia 1024 hadi 65535.", + "error-server-unreachable-title": "Imeshindwa kuunganisha kwenye Seva yako ya Outline", + "error-servers-removed": "Seva ya {serverNames} haipatikani tena kwenye akaunti yako ya DigitalOcean.", + "error-set-data-limit": "Imeshindwa kuweka kikomo chaguomsingi cha data", + "error-set-per-key-limit": "Imeshindwa kuweka kikomo cha data kwa ufunguo huu", + "error-unexpected": "Hitilafu isiyotarajiwa imetokea.", + "experimental": "Kinajaribiwa", + "experiments": "Majaribio", + "experiments-description": "Jaribu vipengele vipya na utupatie maoni kabla havijazinduliwa.", + "experiments-disclaimer": "Majaribio yanatengenezwa na huenda yakabadilika au kuondolewa kwenye programu. Ikiwa kwa sasa unaripoti vipimo, matumizi ya vipengele vya majaribio yatajumuishwa. Tafadhali angalia {openLink}sera kuhusu ukusanyaji wa data{closeLink} ili upate maelezo zaidi.", + "experiments-feedback": "Je, una mapendekezo? {openLink}Tuma maoni hapa.{closeLink}", + "feedback-cloud-provider": "Chagua mtoa huduma za wingu", + "feedback-cloud-provider-error": "Tafadhali chagua mtoa huduma za wingu.", + "feedback-connection": "Nimeshindwa kuunganisha kwenye seva yangu", + "feedback-connection-others": "Wengine hawawezi kuunganisha kwenye seva yangu", + "feedback-disclaimer": "Tafadhali kumbuka kuwa timu yetu inaweza tu kujibu maoni kwa Kiingereza.", + "feedback-email": "Anwani ya barua pepe (si lazima)", + "feedback-error": "Tafadhali weka maoni.", + "feedback-explanation-install": "Hitilafu imetokea wakati wa kujaribu kusakinisha Outline kwenye seva yako. Iwapo hujaweza kupata suluhisho, tafadhali zingatia kututumia maoni na kutuambia anwani yako ya barua pepe (si lazima) ili tuweze kukujibu.", + "feedback-general": "Maoni ya jumla", + "feedback-install": "Ninatatizika kusakinisha Outline", + "feedback-label": "Maoni yako", + "feedback-management": "Ninatatizika kudhibiti seva yangu", + "feedback-other": "Nyingine", + "feedback-privacy": "Maoni, anwani ya barua pepe (ikiwa itawekwa) na maelezo yako ya ziada yanayorejelewa katika {openLink}sera ya faragha{closeLink} yatatumwa kwa timu ya Outline.", + "feedback-submit": "Tuma", + "feedback-suggestion": "Mapendekezo", + "feedback-title-generic": "Tuma Maoni", + "feedback-title-install": "Imeshindwa Kusakinisha Seva ya Outline", + "gcp-billing-action": "Inayofuata", + "gcp-billing-body": "Inakusubiri uweke {openLink}akaunti ya malipo kwenye Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Fungua ukurasa wa malipo wa Dashibodi ya Wingu{closeLink} na uweke akaunti ili uendelee.", + "gcp-billing-error": "Imeshindwa kupata maelezo ya kulipa", + "gcp-billing-error-zero": "Lazima uweke akaunti ya malipo kabla ya kuendelea.", + "gcp-click-create": "Bofya 'Unda'.", + "gcp-create-new-project": "{openLink}Unda mradi mpya wa Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Unda tukio jipya la mashine pepe{closeLink}.", + "gcp-create-project": "Unda mradi wa Google Cloud", + "gcp-create-server": "Unda mradi wako wa Google Cloud", + "gcp-create-vm": "Unda tukio la mashine pepe", + "gcp-disconnect-account": "Tenganisha akaunti ya Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Weka amri mpya ya kinga mtandao{closeLink} kwenye mradi wako wa Compute Engine.", + "gcp-firewall-create-1": "Andika 'outline' katika sehemu ya 'Jina'.", + "gcp-firewall-create-2": "Andika 'outline' kwenye sehemu ya 'Lebo lengwa'.", + "gcp-firewall-create-3": "Andika '0.0.0.0/0' katika sehemu ya 'Viwango vya IP ya chanzo'.", + "gcp-firewall-create-4": "Chagua 'Ruhusu zote' chini ya 'Itifaki na milango'.", + "gcp-name-your-project": "Taja jina la mradi wako kwenye sehemu ya 'Jina la mradi'.", + "gcp-project-setup-error": "Hitilafu imetokea wakati wa kuweka mipangilio ya mradi wako wa Google Cloud", + "gcp-select-machine-type": "Chagua 'f1-micro' chini ya 'Aina ya mashine'", + "gcp-select-networking": "Bofya 'Usimamizi, usalama, diski, mitandao, upangaji pekee', kisha ubofye 'Mitandao'", + "gcp-select-region": "Chagua eneo lililo karibu na ambapo watumiaji wa seva watakuwa chini ya 'Eneo'.", + "gcp-type-network-tag": "Andika 'outline' kwenye sehemu ya 'Lebo za mtandao'", + "gcp-type-outline-server": "Andika 'outline-server' katika sehemu ya 'Jina'.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Kaunti ya Changhua", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong Magharibi", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Virginia Kaskazini", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Mji wa Salt Lake", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapoo", + "geo-south-carolina": "Carolina Kusini", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warsaw", + "geo-zurich": "Zürich", + "key": "Kitufe cha {keyId}", + "manual-server-assign-firewall": "Weka amri ya kinga mtandao", + "manual-server-assign-group": "Weka Kikundi cha Usalama", + "manual-server-create-firewall": "Unda amri ya kinga mtandao", + "manual-server-create-group": "Unda Kikundi cha Usalama", + "manual-server-description": "Hatua hizi zitakusaidia kusakinisha Outline kwenye seva ya {cloudProvider} ya Linux.", + "manual-server-firewall": "Weka mipangilio kwenye kinga mtandao yako", + "manual-server-install-paste": "Bandika data ya usakinishaji hapa.", + "manual-server-install-run": "Ingia katika seva yako na utekeleze amri hii.", + "manual-server-instructions": "Maagizo", + "manual-server-show-me": "Nionyeshe wapi", + "manual-server-title": "Fuata maagizo hapa chini", + "metrics-description": "Shiriki vipimo ambavyo vimefichwa utambulisho ili kusaidia kuboresha uthabiti na utendaji wa Outline, kwako na kwa wale unaoshiriki nao seva yako. {openLink}Pata maelezo zaidi.{closeLink}", + "metrics-share": "Shiriki vipimo", + "metrics-skip": "Ruka", + "metrics-title": "Kushiriki vipimo", + "nav-about": "Kuhusu", + "nav-data-collection": "Ukusanyaji wa data", + "nav-feedback": "Maoni", + "nav-help": "Usaidizi", + "nav-licenses": "Leseni", + "nav-privacy": "Faragha", + "nav-terms": "Sheria na Masharti", + "no-data-limit": "Hamna", + "notification-app-update": "Toleo lililosasishwa la Outline Manager limepakuliwa. Litasakinishwa utakapozima kisha uwashe upya programu.", + "notification-feedback-thanks": "Asante kwa kutusaidia kuboresha huduma! Tungependa kusikia kutoka kwako.", + "notification-key-added": "Ufunguo umewekwa", + "notification-key-removed": "Ufunguo umeondolewa", + "notification-server-destroyed": "Seva imeharibiwa", + "notification-server-exists": "Seva tayari imewekwa", + "notification-server-removed": "Seva imeondolewa", + "oauth-account-active": "Akaunti yako ya DigitalOcean imewezeshwa.", + "oauth-account-active-tag": "Akaunti imewezeshwa! Inapakia maeneo ya seva...", + "oauth-activate-account": "Wezesha akaunti yako ya DigitalOcean.", + "oauth-billing": "Weka maelezo yako ya kulipa kwenye digitalocean.com na urudi katika programu mara tu unapomaliza.", + "oauth-billing-tag": "Weka maelezo ya kulipa...", + "oauth-connect-description": "Kwa kutumia akaunti yako, Outline hurahisisha uundaji wa seva na kukusaidia uunganishwe.", + "oauth-connect-tag": "Inasubiri kuunganisha akaunti yako...", + "oauth-connect-title": "Ingia au unda akaunti ukitumia DigitalOcean.", + "oauth-sign-out": "Ondoka kwenye Akaunti", + "oauth-verify": "Angalia kikasha chako ili uone barua pepe kutoka DigitalOcean na ubofye kiungo ili uthibitishe akaunti yako.", + "oauth-verify-tag": "Thibitisha barua pepe yako...", + "okay": "SAWA", + "per-key-data-limit-dialog-set-custom": "Weka kikomo maalum cha data", + "per-key-data-limit-dialog-title": "Kikomo cha Data - {keyName}", + "region-best-value": "Thamani Bora Zaidi", + "region-description": "Hapa ndipo matumizi yako ya mtandao yatapotoka.", + "region-setup": "Weka mipangilio ya Outline", + "region-title": "Chagua eneo ilipo seva yako.", + "remove": "Ondoa", + "retry": "Jaribu tena", + "save": "Hifadhi", + "saved": "Imehifadhi", + "saving": "Inahifadhi...", + "server-access": "Idhini ya kufikia seva", + "server-access-key-new": "Weka ufunguo mpya", + "server-access-key-rename": "Badilisha jina", + "server-access-keys": "Funguo", + "server-connections": "Miunganisho", + "server-data-transfer": "Data iliyohamishwa / siku 30 zilizopita", + "server-data-used": "Data iliyohamishwa / siku 30 zilizopita", + "server-destroy": "Haribu seva", + "server-help-access-key-description": "Shiriki funguo na marafiki, ili waweze kuunganisha kwenye seva yako ya Outline. Wanaweza kutumia ufunguo sawa kwenye vifaa vyao vyote.", + "server-help-access-key-next": "Kinachofuata", + "server-help-access-key-title": "Unda funguo, shiriki idhini ya kufikia", + "server-help-connection-description": "Bofya hapa ili usakinishe programu ya Outline, kwa kutumia ufunguo wako binafsi kwenye seva yako ya Outline.", + "server-help-connection-ok": "Sawa, nimeelewa!", + "server-help-connection-title": "Bado hujaunganishwa!", + "server-keys": "Funguo", + "server-my-access-key": "Ufunguo wangu", + "server-name": "Seva ya Outline {serverLocation}", + "server-remove": "Ondoa seva", + "server-settings": "Mipangilio", + "server-unreachable": "Seva haiwezi kufikiwa", + "server-unreachable-description": "Tunakumbwa na hitilafu katika kukuunganisha kwenye seva hii.", + "server-unreachable-managed-description": "Jaribu tena au ondoa seva hii kwenye programu.", + "server-unreachable-manual-description": "Jaribu tena au haribu seva hii na seva pangishi pepe.", + "server-usage": "Matumizi (siku 30 zilizopita)", + "servers-add": "Weka seva", + "servers-digitalocean": "Seva za DigitalOcean", + "servers-gcp": "Seva za Google Cloud Platform", + "servers-manual": "Seva", + "settings-access-key-port": "Mlango wa funguo mpya", + "settings-metrics-header": "Shiriki vipimo vilivyoficha utambulisho", + "settings-server-api-url": "URL ya API ya Usimamizi", + "settings-server-cost": "Gharama za kila mwezi", + "settings-server-creation": "Imeundwa", + "settings-server-hostname": "Jina la mpangishaji", + "settings-server-id": "Kitambulisho cha Seva", + "settings-server-info": "Maelezo ya seva", + "settings-server-location": "Eneo la seva", + "settings-server-name": "Jina", + "settings-server-rename": "Weka jina jipya la seva yako. Kumbuka kuwa hili halitaonyeshwa kwenye vifaa vya watumiaji uliowaalika kuunganishwa nao.", + "settings-server-version": "Toleo la seva", + "settings-transfer-limit": "Ruhusa ya uhamishaji wa data", + "setup-action": "Weka mipangilio", + "setup-advanced": "Maagizo ya kina", + "setup-anywhere": "Weka mipangilio ya Outline popote", + "setup-cancel": "Ghairi wakati wowote", + "setup-create": "Unda seva", + "setup-description": "Je, huna seva? Unda akaunti kwa kutumia DigitalOcean.", + "setup-do-cost": "US$6 pekee kwa mwezi", + "setup-do-create": "Unda seva mpya ukitumia akaunti yako ya DigitalOcean ili upate US$6 za ziada kwa siku 30 kwa ajili ya TB 1 ya uhamishaji wa data.", + "setup-do-data": "Inaruhusu uhamishaji wa data yenye ukubwa wa TB 1", + "setup-do-description": "Hatua hii inaweza kuchukua dakika kadhaa. Unaweza kuharibu seva hii wakati wowote.", + "setup-do-easiest": "Mchakato rahisi zaidi wa kuweka mipangilio", + "setup-do-title": "Kuweka mipangilio ya Outline.", + "setup-firewall-instructions": "Maagizo ya kinga mtandao", + "setup-gcp-create": "Unda seva mpya kwa kutumia akaunti yako ya Google. Gharama hutofautiana kulingana na eneo na matumizi.", + "setup-gcp-easy": "Mchakato rahisi wa kuweka mipangilio", + "setup-gcp-free-tier": "Ukiwa na {openLinkFreeTier}Kiwango cha Bure{closeLink}, seva yako ya kwanza inaanzia {openLinkIpPrice}US$3 kwa mwezi{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Jaribio lisilolipishwa la siku 90{closeLink} kwa watumiaji wapya", + "setup-gcp-promo": "Jaribu mchakato mpya otomatiki wa kuunda seva ya Outline kwa Google Cloud", + "setup-recommended": "Inapendekezwa", + "setup-simple-commands": "Amri rahisi za kusakinisha", + "setup-step-by-step": "Mwongozo wa hatua kwa hatua wa kuweka mipangilio", + "setup-tested": "Imejaribiwa kwenye VULTR, Linode, na Liquid Web", + "setup-title": "Chagua huduma ya wingu ili uweke mipangilio ya Outline.", + "share-description": "Nakili mwaliko huu na utume kutoka kwenye zana ya mawasiliano unayoamini. {openLink}Je, unahitaji usaidizi?{closeLink}", + "share-invite-access-key-copied": "Umenakili ufunguo kwenye ubao wa kunakili", + "share-invite-copied": "Umenakili mwaliko kwenye ubao wa kunakili", + "share-invite-copy": "Nakili mwaliko", + "share-invite-copy-access-key": "Nakili ufunguo", + "share-invite-html": "Tumia seva hii ili ufikie kwa usalama intaneti ya umma:

1) Pakua na usakinishe programu ya Outline kwenye kifaa chako:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Kiungo mbadala cha Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Utapokea ufunguo unaoanza na ss://. Baada ya kuupokea, nakili ufunguo huu.

3) Fungua programu ya Outline. Ikiwa ufunguo wako umetambuliwa kiotomatiki, gusa \"Unganisha\" na uendelee. Ikiwa ufunguo wako haujatambuliwa kiotomatiki basi ubandike kwenye sehemu, kisha gusa \"Unganisha\" na uendelee.

Utakuwa tayari kutumia intaneti ya umma! Ili kuhakikisha kuwa umeunganishwa kikamilifu kwenye seva, jaribu kutafuta \"ip yangu ni nini\" kwenye Tafuta na Google. Anwani ya IP inayoonyeshwa kwenye Google inapaswa kufanana na anwani ya IP iliyo kwenye programu ya Outline.

Pata maelezo zaidi kuhusu Outline hapa: https://getoutline.org/", + "share-invite-instructions": "Fuata maagizo yetu ya mwaliko kwenye GitHub:", + "share-invite-trouble": "Je, unatatizika kufikia kiungo cha mwaliko?", + "share-title": "Shiriki idhini ya kufikia", + "survey-data-limits-title": "Tusaidie kuelewa jinsi ya kuboresha vikomo vya data", + "survey-decline": "Kataa", + "survey-disclaimer": "Kwa kubofya endelea utaelekezwa kwenye utafiti mfupi katika Fomu za Google. Tunapendekeza ufanye utafiti ukiwa umeunganishwa kwenye Outline.", + "survey-go-to-survey": "Nenda kwenye utafiti", + "terms-of-service": "Nimesoma na kuelewa {openLink}Sheria na Masharti ya Outline{closeLink}" +} diff --git a/server_manager/messages/ta.json b/server_manager/messages/ta.json new file mode 100644 index 0000000000..8a87b4eb08 --- /dev/null +++ b/server_manager/messages/ta.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline என்பது Jigsaw உருவாக்கிய ஓர் ஓப்பன் சோர்ஸ் திட்டப்பணி ஆகும். செய்தி நிறுவனங்களும் செய்தியாளர்களும் இணையத்தை அணுகுவதற்கான பாதுகாப்பான வழியை இது வழங்குகிறது.

Outlineனை Shadowsocks வழங்குகிறது. இது இன்னும் தொடக்கநிலையில் உள்ள ஒரு தயாரிப்பு. GitHub இல் கோடிங்கில் உங்கள் பங்களிப்பை வழங்கலாம். Reddit இல் எங்களைப் பின்தொடரலாம். மேலும் கூடுதல் தளங்களுக்கு விரிவாக்கும்போதும் புதிய அம்சங்களைச் சேர்க்கும்போதும் Medium இல் தெரிந்துகொள்ளலாம்.", + "about-version": "பதிப்பு {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} இன்ஸ்டன்ஸ்கள் பக்கத்திற்குச் செல்லவும்.", + "aws-lightsail-firewall-1": "நீங்கள் Outlineனை ஹோஸ்ட் செய்ய விரும்பும் இன்ஸ்டன்ஸைக் கிளிக் செய்யவும்.", + "aws-lightsail-firewall-2": "'நெட்வொர்க்கிங்' (Networking) பிரிவிற்குச் செல்லவும்.", + "aws-lightsail-firewall-3": "'ஃபயர்வால்' (Firewall) பிரிவில் 'மற்றொன்றைச் சேர்' (Add another) என்பதைக் கிளிக் செய்யவும்.", + "aws-lightsail-firewall-4": "'அனைத்து TCP+UDP' (All TCP+UDP) என்பதற்கு 'ஆப்ஸ்' (Application) மதிப்பை அமைக்கவும்.", + "aws-lightsail-firewall-5": "‘சேமி’ (Save) என்பதைக் கிளிக் செய்யவும்.", + "cancel": "ரத்துசெய்", + "close": "மூடுக", + "confirmation-server-destroy": "ஏற்கெனவே இருக்கும் பயனர்கள் அணுகலை இழப்பார்கள். இதைச் செயல்தவிர்க்க முடியாது.", + "confirmation-server-destroy-title": "சேவையகத்தை அழிக்கவா?", + "confirmation-server-remove": "இந்தச் செயல்பாடு Outline Managerரில் இருந்து உங்கள் சேவையகத்தை அகற்றும். ஆனால் ப்ராக்ஸி அணுகலைப் பயனர்களுக்குத் தடுக்காது. உங்கள் ஹோஸ்ட் மெஷினில் இருந்து நீங்கள்தான் Outline சேவையகத்தை நீக்க வேண்டும்.", + "confirmation-server-remove-title": "சேவையகத்தை அகற்றவா?", + "data-limit": "தரவு வரம்பு", + "data-limit-per-key": "ஒரு குறியீடுக்கான தரவு வரம்பு", + "data-limits": "தரவு வரம்புகள்", + "data-limits-description": "இந்தச் சேவையகத்தில் உள்ள அணுகல் குறியீடுகளைத் தரவுப் பரிமாற்றத்திற்காகச் சோதனை முறையில் பயன்படுத்த 30 நாள் வரம்பை அமைக்கலாம்.", + "data-limits-dialog-text": "அமைப்புகள் பிரிவுக்குச் சென்று இந்தச் சேவையகத்தில் உள்ள அணுகல் குறியீடுகளுக்கான தரவுப் பரிமாற்ற வரம்பை அமைக்கலாம்.", + "data-limits-dialog-title": "தரவை அதிகமாகப் பயன்படுவதைத் தவிர்க்கலாம்", + "data-limits-disclaimer": "தற்சமயம் நீங்கள் அளவீடுகளைத் தெரிவிப்பதால் தரவு வரம்புகள் அம்சத்தின் உபயோகமும் சேர்க்கப்படும். கூடுதல் தகவல்களுக்கு {openLink}தரவுச் சேகரிப்புக் கொள்கையைப்{closeLink} பார்க்கவும்.", + "data-limits-usage": "{used}/{total} பயன்படுத்தப்பட்டது", + "destroy": "அழி", + "digitalocean-disconnect-account": "DigitalOcean கணக்கின் இணைப்பைத் துண்டித்தல்", + "digitalocean-unreachable": "உங்கள் நெட்வொர்க்கில் உள்ள ஃபயர்வால் காரணமாகவோ digitalocean.com என்ற தளத்தில் ஏற்பட்டுள்ள தற்காலிக இணைப்புச் சிக்கல்கள் காரணமாகவோ இந்தப் பிழை ஏற்பட்டிருக்கலாம்.", + "disabled": "முடக்கப்பட்டது", + "disconnect": "இணைப்பைத் துண்டி", + "done": "முடிந்தது", + "enabled": "இயக்கப்பட்டுள்ளது", + "error-connectivity": "உங்கள் DigitalOcean கணக்குடன் இணைப்பதில் சிக்கல். இது சில சமயங்களில் DigitalOceanனில் ஏற்படும் தற்காலிகச் சிக்கலாகவோ உங்கள் இணைய இணைப்பில் ஏற்பட்ட சிக்கலாகவோ இருக்கலாம். மீண்டும் முயன்றும் இணைக்க முடியவில்லை எனில் DigitalOceanனில் மீண்டும் உள்நுழையுங்கள். சிக்கல் சரியாகும்.", + "error-connectivity-title": "இணைப்பதில் சிக்கல்", + "error-do-account-info": "DigitalOcean கணக்கு விவரங்களைப் பெற முடியவில்லை", + "error-do-auth": "DigitalOceanனில் உள்நுழைய முடியவில்லை", + "error-do-limit": "உங்கள் DigitalOcean கணக்கு {num} ட்ராப்லெட்கள் என்ற வரம்பை எட்டிவிட்டது. https://cloud.digitalocean.com/account/team/droplet_limit_increase என்ற தளத்தில் வரம்பை உயர்த்தக் கோரலாம்", + "error-do-regions": "அனுமதி இருக்கக்கூடிய இடங்களின் பட்டியலைப் பெற முடியவில்லை", + "error-do-warning": "DigitalOcean எச்சரிக்கை: \"{message}\"", + "error-feedback": "கருத்தைச் சமர்ப்பிக்க முடியவில்லை. மீண்டும் முயலவும்.", + "error-gcp-auth": "Google Cloud Platformமில் உள்நுழைய முடியவில்லை", + "error-hostname-invalid": "IP முகவரியாகவோ சரியான ஹோஸ்ட்பெயராகவோ இருக்க வேண்டும்.", + "error-key-add": "குறியீட்டைச் சேர்க்க முடியவில்லை", + "error-key-remove": "குறியீட்டை அகற்ற முடியவில்லை", + "error-key-rename": "குறியீட்டின் பெயரை மாற்ற முடியவில்லை", + "error-keys-get": "குறியீடுகளை ஏற்ற முடியவில்லை", + "error-keys-port-bad-input": "1ல் இருந்து 65,535க்குள் ஒரு முழு எண்ணாகப் போர்ட் இருக்க வேண்டும்.", + "error-keys-port-in-use": "சேவையகத்தில் போர்ட் ஏற்கெனவே பயன்பாட்டில் உள்ளது.", + "error-licenses": "உரிமங்களைக் காட்ட முடியவில்லை.", + "error-metrics": "அளவீடுகளைத் தெரிவிப்பதற்கான அமைப்பை இயக்கும்போது பிழை ஏற்பட்டது", + "error-network": "நெட்வொர்க் பிழை ஏற்பட்டது.", + "error-not-saved": "சேமிக்கப்படவில்லை", + "error-remove-data-limit": "இயல்புத் தரவு வரம்பை முடக்க முடியவில்லை", + "error-remove-per-key-limit": "இந்த அணுகல் குறியீட்டில் இருந்து தரவு வரம்பை அகற்ற முடியவில்லை", + "error-server-creation": "உங்கள் Outline சேவையகத்தை உருவாக்கும்போது பிழை ஏற்பட்டது.", + "error-server-destroy": "சேவையகத்தை அழிக்க முடியவில்லை", + "error-server-removed": "இனி உங்கள் DigitalOcean கணக்கில் {serverName} கிடைக்காது.", + "error-server-rename": "சேவையகத்தின் பெயரை மாற்ற முடியவில்லை", + "error-server-unreachable": "உங்கள் Outline சேவையகம் சரியாக நிறுவப்பட்டது, ஆனால் அதனுடன் இணைக்க முடியவில்லை. உங்கள் சேவையகத்தின் ஃபயர்வால் விதிகள் உள்வரும் இணைப்புகளைத் தடுப்பதால் இப்படி ஆகலாம். அவற்றைச் சரிபார்த்து 1024 முதல் 65535 வரையிலான போர்ட்டுகளின் வரம்பில் உள்வரும் TCP இணைப்புகள் அனுமதிக்கப்படுவதை உறுதிசெய்யுங்கள்.", + "error-server-unreachable-title": "உங்கள் Outline சேவையகத்துடன் இணைக்க முடியவில்லை", + "error-servers-removed": "இனி உங்கள் DigitalOcean கணக்கில் {serverNames} ஆகிய சேவையகங்கள் கிடைக்காது.", + "error-set-data-limit": "இயல்புத் தரவு வரம்பை அமைக்க முடியவில்லை", + "error-set-per-key-limit": "இந்த அணுகல் குறியீட்டுக்குத் தரவு வரம்பை அமைக்க முடியாது", + "error-unexpected": "எதிர்பாராத பிழை ஏற்பட்டது.", + "experimental": "பரிசோதனை முயற்சி", + "experiments": "பரிசோதனைகள்", + "experiments-description": "புதிய அம்சங்களைப் பரிசோதித்துப் பார்த்து அவை வெளியிடப்படுவதற்கு முன்பே உங்கள் கருத்தை எங்களுக்கு அனுப்பலாம்.", + "experiments-disclaimer": "பரிசோதனைகள் மேம்பாட்டு நிலையில் உள்ளன. அவை ஆப்ஸில் இருந்து வேறுபடலாம் அல்லது அகற்றப்படலாம். தற்போது நீங்கள் அளவீடுகளைத் தெரிவித்தால் பரிசோதனை அம்சங்களின் பயன்பாடும் சேர்க்கப்படும். கூடுதல் தகவல்களுக்கு {openLink}தரவுச் சேகரிப்புக் கொள்கையைப்{closeLink} பார்க்கவும்.", + "experiments-feedback": "கருத்துகள் உள்ளனவா? {openLink}இங்கே கருத்தைச் சமர்ப்பியுங்கள்.{closeLink}", + "feedback-cloud-provider": "கிளவுடு வழங்குநரைத் தேர்ந்தெடுங்கள்", + "feedback-cloud-provider-error": "கிளவுடு வழங்குநரைத் தேர்ந்தெடுக்கவும்.", + "feedback-connection": "எனது சேவையகத்துடன் இணைக்க முடியவில்லை", + "feedback-connection-others": "மற்றவர்களால் எனது சேவையகத்துடன் இணைக்க முடியவில்லை", + "feedback-disclaimer": "கவனத்திற்கு: உங்கள் கருத்துகளுக்கு ஆங்கிலத்தில் மட்டுமே எங்கள் குழுவால் பதிலளிக்க முடியும்.", + "feedback-email": "மின்னஞ்சல் முகவரி (விரும்பினால்)", + "feedback-error": "கருத்தை வழங்கவும்.", + "feedback-explanation-install": "உங்கள் சேவையகத்தில் Outlineனை நிறுவ முயலும்போது பிழை ஏற்பட்டது. இதற்கான தீர்வைக் கண்டறிய முடியவில்லை எனில் உங்கள் கருத்தையும் மின்னஞ்சல் முகவரியையும் (விரும்பினால்) எங்களுக்கு அனுப்புங்கள். இதன் மூலம் உங்களைத் தொடர்புகொள்வோம்.", + "feedback-general": "பொதுவான கருத்து", + "feedback-install": "Outlineனை நிறுவுவதில் சிக்கல் உள்ளது", + "feedback-label": "உங்கள் கருத்து", + "feedback-management": "எனது சேவையகத்தை நிர்வகிப்பதில் சிக்கல் உள்ளது", + "feedback-other": "பிற", + "feedback-privacy": "உங்கள் கருத்து, மின்னஞ்சல் முகவரி (வழங்கப்பட்டிருந்தால்), {openLink}தனியுரிமைக் கொள்கையில்{closeLink} குறிப்பிடப்பட்டுள்ள கூடுதல் தகவல்கள் ஆகியவை Outline குழுவுக்கு அனுப்பப்படும்.", + "feedback-submit": "சமர்ப்பி", + "feedback-suggestion": "பரிந்துரைகள்", + "feedback-title-generic": "கருத்தை அனுப்புதல்", + "feedback-title-install": "Outline சேவையகத்தை நிறுவ முடியவில்லை", + "gcp-billing-action": "அடுத்து", + "gcp-billing-body": "நீங்கள் {openLink}Google Cloudல் பில்லிங் கணக்கைச் சேர்ப்பதற்காகக்{closeLink} காத்திருக்கிறோம்", + "gcp-billing-description": "தொடர, {openLink}Cloud Console பில்லிங் பக்கத்தைத் திறந்து{closeLink} கணக்கைச் சேர்க்கவும்.", + "gcp-billing-error": "பில்லிங் தகவலைப் பெற முடியவில்லை", + "gcp-billing-error-zero": "தொடர்வதற்கு முன் பில்லிங் கணக்கைச் சேர்க்க வேண்டும்.", + "gcp-click-create": "'உருவாக்கு' (Create) என்பதைக் கிளிக் செய்யவும்.", + "gcp-create-new-project": "{openLink}புதிய Google Cloud திட்டப்பணியை உருவாக்குதல்{closeLink}.", + "gcp-create-new-vm": "{openLink}புதிய VM இன்ஸ்டன்ஸை உருவாக்குதல்{closeLink}.", + "gcp-create-project": "Google Cloud திட்டப்பணியை உருவாக்குதல்", + "gcp-create-server": "Google Cloud திட்டப்பணியை உருவாக்குதல்", + "gcp-create-vm": "VM இன்ஸ்டன்ஸை உருவாக்குதல்", + "gcp-disconnect-account": "Google Cloud Platform கணக்கின் இணைப்பைத் துண்டித்தல்", + "gcp-firewall-create-0": "உங்கள் Compute Engine திட்டப்பணிக்குப் {openLink}புதிய ஃபயர்வால் விதியைச் சேர்க்கவும்{closeLink}.", + "gcp-firewall-create-1": "'பெயர்' (Name) புலத்தில் 'outline' என டைப் செய்யவும்.", + "gcp-firewall-create-2": "'குறிச்சொற்களை இலக்கிடுதல்' (Target tags) புலத்தில் 'outline' என டைப் செய்யவும்.", + "gcp-firewall-create-3": "'மூல IP வரம்புகள்' (Source IP ranges) புலத்தில் '0.0.0.0/0' என்று டைப் செய்யவும்.", + "gcp-firewall-create-4": "'நெறிமுறைகள் மற்றும் போர்ட்டுகள்' (Protocols and ports) என்பதன் கீழுள்ள 'அனைத்தையும் அனுமதி' (Allow all) என்பதைத் தேர்ந்தெடுக்கவும்.", + "gcp-name-your-project": "'திட்டப்பணிப் பெயர்' (Project name) புலத்தில் உங்கள் திட்டப்பணிக்குப் பெயரை வழங்கவும்.", + "gcp-project-setup-error": "உங்கள் Google Cloud திட்டப்பணியை அமைக்கும்போது பிழை ஏற்பட்டது", + "gcp-select-machine-type": "'மெஷின் வகை' (Machine type) என்பதற்குக் கீழ் 'f1-மைக்ரோ' என்பதைத் தேர்ந்தெடுக்கவும்", + "gcp-select-networking": "'நிர்வாகம், பாதுகாப்பு, டிஸ்குகள், நெட்வொர்க்கிங், சோல் டெனன்சி' (Management, security, disks, networking, sole tenancy) ஆகியவற்றைக் கிளிக் செய்தபிறகு 'நெட்வொர்க்கிங்' (Networking) என்பதைக் கிளிக் செய்யவும்", + "gcp-select-region": "சேவையகத்தின் பயனர்களுக்கு அருகில் உள்ள இடத்தைத் தேர்ந்தெடுக்கவும். இது 'இடம்' (Region) என்பதற்குக் கீழ் இருக்கும்.", + "gcp-type-network-tag": "'நெட்வொர்க் குறிச்சொற்கள்' (Network tags) புலத்தில் 'outline' என டைப் செய்யவும்", + "gcp-type-outline-server": "'பெயர்' (Name) புலத்தில் 'outline-server' என டைப் செய்யவும்.", + "geo-amsterdam": "ஆம்ஸ்டர்டாம்", + "geo-bangalore": "பெங்களூரு", + "geo-changhua-county": "சங்வா கவுண்டி", + "geo-delhi": "டெல்லி", + "geo-eemshaven": "ஈம்ஷாவன்", + "geo-frankfurt": "ஃபிராங்க்ஃபர்ட்", + "geo-hamina": "ஹமினா", + "geo-hk": "ஹாங்காங்", + "geo-iowa": "அயோவா", + "geo-jakarta": "ஜகார்ட்டா", + "geo-jurong-west": "மேற்கு ஜுராங்", + "geo-las-vegas": "லாஸ் வேகாஸ்", + "geo-london": "லண்டன்", + "geo-los-angeles": "லாஸ் ஏஞ்சல்ஸ்", + "geo-melbourne": "மெல்போர்ன்", + "geo-montreal": "மாண்ட்ரியல்", + "geo-mumbai": "மும்பை", + "geo-new-york-city": "நியூயார்க்", + "geo-northern-virginia": "வடக்கு வர்ஜீனியா", + "geo-oregon": "ஓரிகன்", + "geo-osaka": "ஒசாகா", + "geo-salt-lake-city": "சால்ட் லேக் சிட்டி", + "geo-san-francisco": "சான் ஃபிரான்சிஸ்கோ", + "geo-sao-paulo": "சாவ் பாலோ", + "geo-seoul": "சியோல்", + "geo-sg": "சிங்கப்பூர்", + "geo-south-carolina": "தெற்கு கரோலினா", + "geo-st-ghislain": "செயிண்ட் கிலைன்", + "geo-sydney": "சிட்னி", + "geo-tokyo": "டோக்கியோ", + "geo-toronto": "டொராண்டோ", + "geo-warsaw": "வார்சா", + "geo-zurich": "ஜூரிக்", + "key": "{keyId} குறியீடு", + "manual-server-assign-firewall": "ஃபயர்வால் விதியை ஒதுக்குதல்", + "manual-server-assign-group": "பாதுகாப்புக் குழுவை ஒதுக்குதல்", + "manual-server-create-firewall": "ஃபயர்வால் விதியை உருவாக்குதல்", + "manual-server-create-group": "பாதுகாப்புக் குழுவை உருவாக்குதல்", + "manual-server-description": "{cloudProvider} Linux சேவையகத்தில் Outlineனை நிறுவ இந்த வழிமுறைகள் உங்களுக்கு உதவும்.", + "manual-server-firewall": "ஃபயர்வாலை உள்ளமைத்தல்", + "manual-server-install-paste": "நிறுவல் அவுட்புட்டை இங்கே ஒட்டவும்.", + "manual-server-install-run": "உங்கள் சேவையகத்தில் உள்நுழைந்து இந்தக் கட்டளையை இயக்குங்கள்.", + "manual-server-instructions": "வழிமுறைகள்", + "manual-server-show-me": "எங்கே எனக் காட்டு", + "manual-server-title": "பின்வரும் வழிமுறைகளைப் பின்பற்றவும்", + "metrics-description": "உங்களுக்கும் நீங்கள் சேவையகத்தைப் பகிர்ந்த பிறருக்கும் Outlineனின் நம்பகத்தன்மையையும் செயல்திறனையும் மேம்படுத்த உதவ அடையாளம் நீக்கப்பட்ட அளவீடுகளைப் பகிரும். {openLink}மேலும் தெரிந்துகொள்ளுங்கள்.{closeLink}", + "metrics-share": "அளவீடுகளைப் பகிர்", + "metrics-skip": "தவிர்", + "metrics-title": "அளவீடுகளைப் பகிர்தல்", + "nav-about": "விவரங்கள்", + "nav-data-collection": "தரவுச் சேகரிப்பு", + "nav-feedback": "கருத்து", + "nav-help": "உதவி", + "nav-licenses": "உரிமங்கள்", + "nav-privacy": "தனியுரிமை", + "nav-terms": "விதிமுறைகள்", + "no-data-limit": "எதுவுமில்லை", + "notification-app-update": "Outline Managerரின் புதுப்பிக்கப்பட்ட பதிப்பு பதிவிறக்கப்பட்டது. ஆப்ஸை மீண்டும் தொடங்கும்போது அது நிறுவப்படும்.", + "notification-feedback-thanks": "மேம்படுத்த உதவியதற்கு நன்றி! உங்கள் கருத்தைத் தொடர்ந்து கேட்க விரும்புகிறோம்.", + "notification-key-added": "குறியீடு சேர்க்கப்பட்டது", + "notification-key-removed": "குறியீடு அகற்றப்பட்டது", + "notification-server-destroyed": "சேவையகம் அழிக்கப்பட்டது", + "notification-server-exists": "சேவையகம் ஏற்கெனவே சேர்க்கப்பட்டது", + "notification-server-removed": "சேவையகம் அகற்றப்பட்டது", + "oauth-account-active": "உங்கள் DigitalOcean கணக்கு இயக்கப்பட்டது.", + "oauth-account-active-tag": "கணக்கு இயக்கப்பட்டது! சேவையக இடங்களை ஏற்றுகிறது...", + "oauth-activate-account": "DigitalOcean கணக்கை இயக்குதல்.", + "oauth-billing": "உங்கள் பில்லிங் தகவலை digitalocean.com என்ற இணையதளத்தில் டைப் செய்தபிறகு ஆப்ஸிற்குச் செல்லவும்.", + "oauth-billing-tag": "பில்லிங் தகவல்களை டைப் செய்யவும்...", + "oauth-connect-description": "உங்கள் கணக்கு மூலம், சேவையகத்தை உருவாக்குவதையும் இணைப்பதையும் Outline எளிதாக்கும்.", + "oauth-connect-tag": "உங்கள் கணக்கை இணைக்கக் காத்திருக்கிறது...", + "oauth-connect-title": "DigitalOceanனில் உள்நுழையுங்கள் அல்லது கணக்கை உருவாக்குங்கள்.", + "oauth-sign-out": "வெளியேறு", + "oauth-verify": "DigitalOcean உங்களுக்கு மின்னஞ்சல் அனுப்பியுள்ளதா என இன்பாக்ஸைப் பார்க்கவும். மின்னஞ்சலில் உள்ள இணைப்பைக் கிளிக் செய்து உங்கள் கணக்கை உறுதிப்படுத்தவும்.", + "oauth-verify-tag": "உங்கள் மின்னஞ்சல் முகவரியை உறுதிப்படுத்துங்கள்...", + "okay": "சரி", + "per-key-data-limit-dialog-set-custom": "பிரத்தியேகத் தரவு வரம்பை அமை", + "per-key-data-limit-dialog-title": "தரவு வரம்பு - {keyName}", + "region-best-value": "சிறந்த மதிப்பு", + "region-description": "இங்கிருந்துதான் உங்களுக்கான இணைய அனுபவம் கிடைக்கும்.", + "region-setup": "Outlineனை அமை", + "region-title": "உங்கள் சேவையகத்தின் இடத்தைத் தேர்ந்தெடுத்தல்.", + "remove": "அகற்று", + "retry": "மீண்டும் முயலவும்", + "save": "சேமி", + "saved": "சேமிக்கப்பட்டது", + "saving": "சேமிக்கிறது...", + "server-access": "சேவையக அணுகல்", + "server-access-key-new": "புதிய குறியீட்டைச் சேர்", + "server-access-key-rename": "பெயர் மாற்று", + "server-access-keys": "அணுகல் குறியீடுகள்", + "server-connections": "இணைப்புகள்", + "server-data-transfer": "தரவுப் பரிமாற்றம்/கடந்த 30 நாட்களில்", + "server-data-used": "பரிமாற்றப்பட்ட தரவு/கடந்த 30 நாட்களில்", + "server-destroy": "சேவையகத்தை அழி", + "server-help-access-key-description": "உங்கள் நண்பர்களுக்கு அணுகல் குறியீடுகளைப் பகிர்வதன் மூலம் உங்கள் Outline சேவையகத்துடன் அவர்கள் இணைக்கலாம். அவர்கள் பயன்படுத்தும் சாதனங்கள் அனைத்திலும் இதே அணுகல் குறியீட்டைப் பயன்படுத்தலாம்.", + "server-help-access-key-next": "அடுத்து", + "server-help-access-key-title": "குறியீடுகளை உருவாக்கி அணுகலைப் பகிருங்கள்", + "server-help-connection-description": "Outline சேவையகத்திற்கான உங்கள் தனிப்பட்ட அணுகல் குறியீட்டைப் பயன்படுத்தி Outline கிளையண்ட் ஆப்ஸை நிறுவ இங்கே கிளிக் செய்யவும்.", + "server-help-connection-ok": "புரிந்தது!", + "server-help-connection-title": "நீங்கள் இன்னும் இணைக்கப்படவில்லை!", + "server-keys": "குறியீடுகள்", + "server-my-access-key": "எனது அணுகல் குறியீடு", + "server-name": "Outline சேவையகம் - {serverLocation}", + "server-remove": "சேவையகத்தை அகற்று", + "server-settings": "அமைப்புகள்", + "server-unreachable": "சேவையகத்தைத் தொடர்புகொள்ள முடியவில்லை", + "server-unreachable-description": "இந்தச் சேவையகத்துடன் இணைப்பதில் சிக்கல்கள் உள்ளன.", + "server-unreachable-managed-description": "மீண்டும் முயலவும் அல்லது ஆப்ஸில் இருந்து இந்தச் சேவையகத்தை அகற்றவும்.", + "server-unreachable-manual-description": "மீண்டும் முயலவும் அல்லது இந்தச் சேவையகத்தையும் விர்ச்சுவல் ஹோஸ்ட்டையும் அழிக்கவும்.", + "server-usage": "உபயோகம் (கடந்த 30 நாட்களில்)", + "servers-add": "சேவையகத்தைச் சேர்", + "servers-digitalocean": "DigitalOcean சேவையகங்கள்", + "servers-gcp": "Google Cloud Platform சேவையகங்கள்", + "servers-manual": "சேவையகங்கள்", + "settings-access-key-port": "புதிய அணுகல் குறியீடுகளுக்கான போர்ட்", + "settings-metrics-header": "அடையாளம் நீக்கப்பட்ட அளவீடுகளைப் பகிர்தல்", + "settings-server-api-url": "Management API URL", + "settings-server-cost": "மாதாந்திரக் கட்டணம்", + "settings-server-creation": "உருவாக்கப்பட்ட தேதி", + "settings-server-hostname": "ஹோஸ்ட்பெயர்", + "settings-server-id": "சேவையக ஐடி", + "settings-server-info": "சேவையகத் தகவல்கள்", + "settings-server-location": "சேவையகத்தின் இடம்", + "settings-server-name": "பெயர்", + "settings-server-rename": "உங்கள் சேவையகத்திற்குப் புதிய பெயரை அமைக்கலாம். கவனத்திற்கு: நீங்கள் சேவையகத்துடன் இணைக்க அழைத்தவர்களின் சாதனங்களில் இந்தப் பெயர் காட்டப்படாது.", + "settings-server-version": "சேவையகப் பதிப்பு", + "settings-transfer-limit": "தரவுப் பரிமாற்ற வரம்பு", + "setup-action": "அமை", + "setup-advanced": "மேம்பட்ட தொழில்நுட்ப வழிமுறைகள்", + "setup-anywhere": "எங்கு வேண்டுமானாலும் Outlineனை அமைத்திடுங்கள்", + "setup-cancel": "எப்போது வேண்டுமானாலும் ரத்துசெய்யலாம்", + "setup-create": "சேவையகத்தை உருவாக்கு", + "setup-description": "சேவையகம் இல்லையா? DigitalOceanனில் கணக்கை உருவாக்குங்கள்.", + "setup-do-cost": "மாதத்திற்கு US$6 மட்டுமே", + "setup-do-create": "1 டெ.பை. தரவுப் பரிமாற்றத்திற்கு 30 நாட்களுக்கு US$6 கூடுதலாகச் செலுத்தி உங்கள் DigitalOcean கணக்கு மூலம் புதிய சேவையகத்தை உருவாக்கலாம்.", + "setup-do-data": "1 டெ.பை. தரவுப் பரிமாற்ற வரம்பைப் பெறலாம்", + "setup-do-description": "இதற்குச் சில நிமிடங்கள் ஆகலாம். நீங்கள் இந்தச் சேவையகத்தை எப்போது வேண்டுமானாலும் அழிக்கலாம்.", + "setup-do-easiest": "அமைப்பது மிகவும் எளிது", + "setup-do-title": "Outlineனை அமைக்கிறது.", + "setup-firewall-instructions": "ஃபயர்வால் வழிமுறைகள்", + "setup-gcp-create": "Google கணக்கு மூலம் புதிய சேவையகத்தை உருவாக்கலாம். இடத்திற்கும் உபயோகத்திற்கும் ஏற்ப கட்டணங்கள் மாறுபடலாம்.", + "setup-gcp-easy": "அமைப்பது எளிது", + "setup-gcp-free-tier": "{openLinkFreeTier}இலவச உபயோகத் திட்டத்தில்{closeLink} {openLinkIpPrice}US$3/மாதம்{closeLink} என்ற கட்டணத்தில் இருந்து உங்கள் முதல் சேவையகம் தொடங்குகிறது", + "setup-gcp-free-trial": "புதிய பயனர்களுக்கு {openLinkFreeTrial}90 நாட்கள் இலவச உபயோகம்{closeLink}", + "setup-gcp-promo": "Google Cloudக்கான புதிய தானியங்கி Outline சேவையக உருவாக்க வழிமுறைகளைப் பயன்படுத்திப் பாருங்கள்", + "setup-recommended": "பரிந்துரைக்கப்படுகிறது", + "setup-simple-commands": "நிறுவுவதற்கான எளிய கட்டளைகள்", + "setup-step-by-step": "படிப்படியாக அமைப்பதற்கான வழிகாட்டி", + "setup-tested": "VULTR, Linode, Liquid Web ஆகியவற்றில் பரிசோதிக்கப்பட்டது", + "setup-title": "Outlineனை அமைக்க கிளவுடு சேவையைத் தேர்வுசெய்யவும்.", + "share-description": "இந்த அழைப்பை நகலெடுத்து உங்களுக்கு நம்பகமான தகவல்தொடர்புக் கருவியில் இருந்து அனுப்பவும். {openLink}உதவி தேவையா?{closeLink}", + "share-invite-access-key-copied": "கிளிப்போர்டுக்கு அணுகல் குறியீடு நகலெடுக்கப்பட்டது", + "share-invite-copied": "கிளிப்போர்டிற்கு அழைப்பு நகலெடுக்கப்பட்டது", + "share-invite-copy": "அழைப்பை நகலெடு", + "share-invite-copy-access-key": "அணுகல் குறியீட்டை நகலெடு", + "share-invite-html": "பொது இணையத்தைப் பாதுகாப்பாக அணுக இந்தச் சேவையகத்தைப் பயன்படுத்துங்கள்:

1) உங்கள் சாதனத்தில் Outline ஆப்ஸைப் பதிவிறக்கி நிறுவவும்:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Androidக்கான மாற்று இணைப்பு: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) ss:// எனத் தொடங்கும் அணுகல் குறியீட்டைப் பெறுவீர்கள். இதைப் பெற்றதும் அந்த அணுகல் குறியீட்டை நகலெடுக்கவும்.

3) Outline கிளையண்ட் ஆப்ஸைத் திறக்கவும். உங்கள் அணுகல் குறியீடு தானாகவே காட்டப்பட்டால் \"இணை\" என்பதைத் தட்டித் தொடரவும். உங்கள் அணுகல் குறியீடு தானாகக் காட்டப்படவில்லை எனில் புலத்தில் அதை ஒட்டியபிறகு \"இணை\" என்பதைத் தட்டித் தொடரவும்.

பொது இணையத்தைப் பயன்படுத்தத் தயாராகிவிட்டீர்கள்! சேவையகத்துடன் இணைக்கப்பட்டிருப்பதை உறுதிசெய்துகொள்ள Google Searchசில் \"what is my ip\" எனத் தேடிப் பார்க்கலாம். Googleளில் காட்டப்படும் IP முகவரி Outline கிளையண்ட் ஆப்ஸில் இருக்கும் IP முகவரியுடன் பொருந்த வேண்டும்.

இங்கே Outlineனைப் பற்றி மேலும் தெரிந்துகொள்ளுங்கள்: https://getoutline.org/", + "share-invite-instructions": "GitHubல் அழைப்புக்கான எங்களின் வழிமுறைகளைப் பின்பற்றவும்:", + "share-invite-trouble": "அழைப்புக்கான இணைப்பை அணுகுவதில் சிக்கல் உள்ளதா?", + "share-title": "அணுகலைப் பகிர்தல்", + "survey-data-limits-title": "தரவு வரம்புகளை எப்படி மேம்படுத்துவது என்பதைப் புரிந்துகொள்ள உதவுங்கள்", + "survey-decline": "மூடுக", + "survey-disclaimer": "தொடர்க என்பதைக் கிளிக் செய்தால் சிறிய Google Forms கருத்துக்கணிப்பு காட்டப்படும். Outlineனுடன் இணைக்கப்பட்டிருக்கும்போதே கருத்துக்கணிப்பில் பங்கேற்குமாறு பரிந்துரைக்கிறோம்.", + "survey-go-to-survey": "கருத்துக்கணிப்பைக் காட்டு", + "terms-of-service": "{openLink}Outline சேவை விதிமுறைகளைப்{closeLink} படித்துப் புரிந்துகொண்டேன்" +} diff --git a/server_manager/messages/th.json b/server_manager/messages/th.json new file mode 100644 index 0000000000..5dd2d6c51f --- /dev/null +++ b/server_manager/messages/th.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline คือโครงการโอเพนซอร์สที่ Jigsaw สร้างขึ้นเพื่อให้สำนักข่าวและนักข่าวเข้าถึงอินเทอร์เน็ตได้อย่างปลอดภัย

Outline ขับเคลื่อนโดย Shadowsocks และยังเป็นผลิตภัณฑ์ที่พัฒนาในระยะเริ่มต้น คุณมีส่วนร่วมในการเขียนโค้ดได้ใน GitHub และติดตามเราได้ที่ Reddit และ Medium เพื่อรับข่าวสารเมื่อเราขยายบริการไปยังแพลตฟอร์มอื่นๆ และเพิ่มฟีเจอร์ใหม่ๆ", + "about-version": "เวอร์ชัน {version}", + "aws-lightsail-firewall-0": "ไปที่หน้าจออินสแตนซ์ {openLink}Amazon Lightsail{closeLink}", + "aws-lightsail-firewall-1": "คลิกอินสแตนซ์ที่ต้องการฝาก Outline", + "aws-lightsail-firewall-2": "ไปที่แท็บ \"การสร้างเครือข่าย (Networking)\"", + "aws-lightsail-firewall-3": "ในส่วน \"ไฟร์วอลล์ (Firewall)\" ให้คลิก \"เพิ่มอีกรายการ (Add another)\"", + "aws-lightsail-firewall-4": "กำหนดค่า \"แอปพลิเคชัน (Application)\" เป็น \"All TCP+UDP\"", + "aws-lightsail-firewall-5": "คลิก \"บันทึก (Save)\"", + "cancel": "ยกเลิก", + "close": "ปิด", + "confirmation-server-destroy": "ผู้ใช้ปัจจุบันจะเข้าถึงไม่ได้อีก การดำเนินการนี้ยกเลิกไม่ได้", + "confirmation-server-destroy-title": "ลบเซิร์ฟเวอร์ไหม", + "confirmation-server-remove": "การดำเนินการนี้จะนำเซิร์ฟเวอร์ของคุณออกจาก Outline Manager แต่ไม่ได้บล็อกการเข้าถึงพร็อกซีของผู้ใช้ คุณยังต้องลบเซิร์ฟเวอร์ Outline ออกจากเครื่องโฮสต์ด้วยตัวเอง", + "confirmation-server-remove-title": "นำเซิร์ฟเวอร์ออกไหม", + "data-limit": "ขีดจำกัดของข้อมูล", + "data-limit-per-key": "ขีดจำกัดของข้อมูลต่อคีย์", + "data-limits": "ขีดจำกัดของข้อมูล", + "data-limits-description": "กำหนดขีดจำกัดการโอนข้อมูลต่อท้ายเป็น 30 วันสำหรับคีย์การเข้าถึงในเซิร์ฟเวอร์นี้", + "data-limits-dialog-text": "ไปที่แท็บการตั้งค่าเพื่อกำหนดขีดจำกัดการโอนข้อมูลสำหรับคีย์การเข้าถึงในเซิร์ฟเวอร์นี้", + "data-limits-dialog-title": "หลีกเลี่ยงข้อมูลที่เก่าเกินไป", + "data-limits-disclaimer": "ระบบจะใช้ฟีเจอร์ขีดจำกัดของข้อมูลเนื่องจากกำลังมีการรายงานเมตริกอยู่ในขณะนี้ โปรดดูรายละเอียดเพิ่มเติมใน{openLink}นโยบายการเก็บรวบรวมข้อมูล{closeLink}", + "data-limits-usage": "ใช้ไป {used} จาก {total}", + "destroy": "ลบ", + "digitalocean-disconnect-account": "ยกเลิกการเชื่อมต่อบัญชี DigitalOcean", + "digitalocean-unreachable": "ข้อผิดพลาดนี้อาจเกิดจากไฟร์วอลล์ในเครือข่ายของคุณหรือปัญหาชั่วคราวในการเชื่อมต่อกับ digitalocean.com", + "disabled": "ปิดใช้", + "disconnect": "ยกเลิกการเชื่อมต่อ", + "done": "เสร็จสิ้น", + "enabled": "เปิดใช้", + "error-connectivity": "เกิดปัญหาในการเชื่อมต่อกับบัญชี DigitalOcean ซึ่งอาจเกิดจากปัญหาของ DigitalOcean หรือการเชื่อมต่ออินเทอร์เน็ตของคุณ หากลองใหม่แล้วยังไม่ได้ผล ให้เข้าสู่ระบบ DigitalOcean อีกครั้งอาจช่วยแก้ปัญหานี้ได้", + "error-connectivity-title": "ปัญหาการเชื่อมต่อ", + "error-do-account-info": "ดึงข้อมูลบัญชี DigitalOcean ไม่สำเร็จ", + "error-do-auth": "ตรวจสอบสิทธิ์กับ DigitalOcean ไม่สำเร็จ", + "error-do-limit": "บัญชี DigitalOcean ของคุณถึงขีดจํากัดที่ {num} แล้ว คุณสามารถส่งคําขอเพิ่มได้ที่ https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "พบปัญหาในการแสดงรายการภูมิภาคที่พร้อมให้บริการ", + "error-do-warning": "คําเตือน DigitalOcean: \"{message}\"", + "error-feedback": "ส่งความคิดเห็นไม่สำเร็จ โปรดลองอีกครั้ง", + "error-gcp-auth": "การตรวจสอบสิทธิ์กับ Google Cloud Platform ไม่สำเร็จ", + "error-hostname-invalid": "ต้องเป็นที่อยู่ IP หรือชื่อโฮสต์ที่ถูกต้อง", + "error-key-add": "เพิ่มคีย์ไม่สำเร็จ", + "error-key-remove": "ลบคีย์ไม่สำเร็จ", + "error-key-rename": "เปลี่ยนชื่อคีย์ไม่สำเร็จ", + "error-keys-get": "โหลดคีย์ไม่ได้", + "error-keys-port-bad-input": "พอร์ตต้องเป็นจำนวนเต็มตั้งแต่ 1 ถึง 65,535", + "error-keys-port-in-use": "พอร์ตนี้มีการใช้ในเซิร์ฟเวอร์แล้ว", + "error-licenses": "โหลดใบอนุญาตไม่สำเร็จ", + "error-metrics": "เกิดข้อผิดพลาดในการเปิดหรือปิดใช้เมตริก", + "error-network": "เกิดข้อผิดพลาดกับเครือข่าย", + "error-not-saved": "ยังไม่บันทึก", + "error-remove-data-limit": "ปิดใช้ขีดจำกัดของข้อมูลเริ่มต้นไม่ได้", + "error-remove-per-key-limit": "นำขีดจำกัดของข้อมูลออกจากคีย์การเข้าถึงนี้ไม่ได้", + "error-server-creation": "เกิดปัญหาในการสร้างเซิร์ฟเวอร์ Outline", + "error-server-destroy": "ลบเซิร์ฟเวอร์ไม่สำเร็จ", + "error-server-removed": "{serverName} ไม่อยู่ในบัญชี DigitalOcean ของคุณแล้ว", + "error-server-rename": "เปลี่ยนชื่อเซิร์ฟเวอร์ไม่สำเร็จ", + "error-server-unreachable": "คุณติดตั้งเซิร์ฟเวอร์ Outline ถูกต้องแล้ว แต่เราเชื่อมต่อเซิร์ฟเวอร์ไม่ได้ ส่วนใหญ่ปัญหานี้เกิดจากการที่กฎไฟร์วอลล์ของเซิร์ฟเวอร์บล็อกการเชื่อมต่อขาเข้า โปรดตรวจสอบว่ากฎอนุญาตให้มีการเชื่อมต่อ TCP ขาเข้าในพอร์ตที่ 1024 ถึง 65535", + "error-server-unreachable-title": "เชื่อมต่อกับเซิร์ฟเวอร์ Outline ไม่ได้", + "error-servers-removed": "{serverNames} ไม่อยู่ในบัญชี DigitalOcean ของคุณแล้ว", + "error-set-data-limit": "กำหนดขีดจำกัดของข้อมูลเริ่มต้นไม่ได้", + "error-set-per-key-limit": "กำหนดขีดจำกัดของข้อมูลสำหรับคีย์การเข้าถึงนี้ไม่ได้", + "error-unexpected": "เกิดข้อผิดพลาดที่ไม่คาดคิด", + "experimental": "ทดลอง", + "experiments": "การทดลอง", + "experiments-description": "ทดสอบฟีเจอร์ใหม่และส่งความคิดเห็นให้เราก่อนเผยแพร่", + "experiments-disclaimer": "การทดสอบอยู่ในช่วงพัฒนาซอฟต์แวร์และอาจมีการเปลี่ยนแปลงหรือนำออกจากแอปได้ หากคุณกำลังรายงานเมตริก การใช้ฟีเจอร์ทดสอบจะรวมอยู่ในรายงานด้วย โปรดดูรายละเอียดเพิ่มเติมใน{openLink}นโยบายการเก็บรวบรวมข้อมูล{closeLink}", + "experiments-feedback": "หากมีคำแนะนำ {openLink}โปรดส่งความคิดเห็นที่นี่{closeLink}", + "feedback-cloud-provider": "เลือกผู้ให้บริการคลาวด์", + "feedback-cloud-provider-error": "โปรดเลือกผู้ให้บริการคลาวด์", + "feedback-connection": "เชื่อมต่อกับเซิร์ฟเวอร์ของฉันไม่ได้", + "feedback-connection-others": "คนอื่นเชื่อมต่อกับเซิร์ฟเวอร์ของฉันไม่ได้", + "feedback-disclaimer": "โปรดทราบว่าทีมงานของเราจะตอบกลับความคิดเห็นที่เป็นภาษาอังกฤษเท่านั้น", + "feedback-email": "ที่อยู่อีเมล (ไม่บังคับ)", + "feedback-error": "โปรดป้อนความคิดเห็น", + "feedback-explanation-install": "เกิดข้อผิดพลาดขณะพยายามติดตั้ง Outline ในเซิร์ฟเวอร์ของคุณ หากยังหาวิธีแก้ไขไม่ได้ โปรดส่งความคิดเห็นถึงเราพร้อมแจ้งอีเมลของคุณ (ไม่บังคับ) เพื่อให้เราติดต่อกลับ", + "feedback-general": "ความคิดเห็นทั่วไป", + "feedback-install": "มีปัญหาในการติดตั้ง Outline", + "feedback-label": "ความคิดเห็นของคุณ", + "feedback-management": "พบปัญหาในการจัดการเซิร์ฟเวอร์ของฉัน", + "feedback-other": "อื่นๆ", + "feedback-privacy": "ระบบจะส่งความคิดเห็นของคุณ รวมถึงอีเมล (หากระบุไว้) และข้อมูลเพิ่มเติมที่อ้างอิงใน{openLink}นโยบายความเป็นส่วนตัว{closeLink}ไปให้ทีม Outline", + "feedback-submit": "ส่ง", + "feedback-suggestion": "คำแนะนำ", + "feedback-title-generic": "ส่งความคิดเห็น", + "feedback-title-install": "ติดตั้งเซิร์ฟเวอร์ Outline ไม่สำเร็จ", + "gcp-billing-action": "ถัดไป", + "gcp-billing-body": "กำลังรอให้คุณ{openLink}เพิ่มบัญชีสำหรับการเรียกเก็บเงินใน Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}เปิดหน้าเรียกเก็บเงินใน Cloud Console{closeLink} แล้วเพิ่มบัญชีเพื่อดำเนินการต่อ", + "gcp-billing-error": "ไม่สามารถเรียกดูข้อมูลสำหรับการเรียกเก็บเงิน", + "gcp-billing-error-zero": "คุณต้องเพิ่มบัญชีสำหรับการเรียกเก็บเงินก่อนดำเนินการต่อ", + "gcp-click-create": "คลิก \"สร้าง\"", + "gcp-create-new-project": "{openLink}สร้างโครงการ Google Cloud ใหม่{closeLink}", + "gcp-create-new-vm": "{openLink}สร้างอินสแตนซ์ VM ใหม่{closeLink}", + "gcp-create-project": "สร้างโครงการ Google Cloud", + "gcp-create-server": "สร้างโครงการ Google Cloud ของคุณ", + "gcp-create-vm": "สร้างอินสแตนซ์ VM", + "gcp-disconnect-account": "ยกเลิกการเชื่อมต่อบัญชี Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}เพิ่มกฎไฟร์วอลล์ใหม่{closeLink}ในโครงการ Compute Engine", + "gcp-firewall-create-1": "พิมพ์ \"outline\" ในช่อง \"ชื่อ\"", + "gcp-firewall-create-2": "พิมพ์ \"outline\" ในช่อง \"แท็กเป้าหมาย\"", + "gcp-firewall-create-3": "พิมพ์ \"0.0.0.0/0\" ในช่อง \"ช่วง IP ต้นทาง\"", + "gcp-firewall-create-4": "เลือก \"อนุญาตทั้งหมด\" ในส่วนของ \"โปรโตคอลและพอร์ต\"", + "gcp-name-your-project": "ตั้งชื่อโครงการในช่อง \"ชื่อโครงการ (Project name)\"", + "gcp-project-setup-error": "เกิดข้อผิดพลาดขณะตั้งค่าโครงการ Google Cloud", + "gcp-select-machine-type": "เลือก \"f1-micro\" ในส่วน \"ประเภทเครื่อง (Machine type)\"", + "gcp-select-networking": "คลิก \"การจัดการ (Management), ความปลอดภัย (Security), ดิสก์ (Disks), การสร้างเครือข่าย (Networking), กลุ่มผู้ใช้กลุ่มเดียว (Sole tenancy)\" จากนั้นคลิก \"การสร้างเครือข่ายเครือข่าย (Networking)\"", + "gcp-select-region": "ในส่วน \"ภูมิภาค (Region)\" ให้เลือกภูมิภาคที่ใกล้กับตำแหน่งที่ผู้ใช้ของเซิร์ฟเวอร์จะอยู่", + "gcp-type-network-tag": "พิมพ์ \"outline\" ในช่อง \"แท็กเครือข่าย (Network tags)\"", + "gcp-type-outline-server": "พิมพ์ \"outline-server\" ในช่อง \"ชื่อ (Name)\"", + "geo-amsterdam": "อัมสเตอร์ดัม", + "geo-bangalore": "บังคาลอร์", + "geo-changhua-county": "ชางฮัวเคาน์ตี", + "geo-delhi": "เดลี", + "geo-eemshaven": "เอมส์ฮาเวน", + "geo-frankfurt": "แฟรงก์เฟิร์ต", + "geo-hamina": "ฮามินา", + "geo-hk": "ฮ่องกง", + "geo-iowa": "ไอโอวา", + "geo-jakarta": "จาการ์ตา", + "geo-jurong-west": "จูรงเวสต์", + "geo-las-vegas": "ลาสเวกัส", + "geo-london": "ลอนดอน", + "geo-los-angeles": "ลอสแอนเจลิส", + "geo-melbourne": "เมลเบิร์น", + "geo-montreal": "มอนทรีออล", + "geo-mumbai": "มุมไบ", + "geo-new-york-city": "นิวยอร์ก", + "geo-northern-virginia": "เวอร์จิเนียตอนเหนือ", + "geo-oregon": "ออริกอน", + "geo-osaka": "โอซากา", + "geo-salt-lake-city": "ซอลต์เลกซิตี", + "geo-san-francisco": "ซานฟรานซิสโก", + "geo-sao-paulo": "เซาเปาโล", + "geo-seoul": "โซล", + "geo-sg": "สิงคโปร์", + "geo-south-carolina": "เซาท์แคโรไลนา", + "geo-st-ghislain": "เซนต์กิสเลน", + "geo-sydney": "ซิดนีย์", + "geo-tokyo": "โตเกียว", + "geo-toronto": "โทรอนโต", + "geo-warsaw": "วอร์ซอ", + "geo-zurich": "ซูริก", + "key": "คีย์ {keyId}", + "manual-server-assign-firewall": "กำหนดกฎไฟร์วอลล์", + "manual-server-assign-group": "กำหนดกลุ่มรักษาความปลอดภัย", + "manual-server-create-firewall": "สร้างกฎไฟร์วอลล์", + "manual-server-create-group": "สร้างกลุ่มรักษาความปลอดภัย", + "manual-server-description": "ขั้นตอนเหล่านี้จะช่วยคุณในการติดตั้ง Outline ในเซิร์ฟเวอร์ Linux ของ {cloudProvider}", + "manual-server-firewall": "กำหนดค่าไฟร์วอลล์", + "manual-server-install-paste": "วางเอาต์พุตจากการติดตั้งที่นี่", + "manual-server-install-run": "เข้าสู่ระบบเซิร์ฟเวอร์แล้วเรียกใช้คำสั่งนี้", + "manual-server-instructions": "วิธีการ", + "manual-server-show-me": "แสดงตำแหน่ง", + "manual-server-title": "โปรดทำตามวิธีการด้านล่าง", + "metrics-description": "แชร์เมตริกแบบไม่ระบุชื่อเพื่อช่วยปรับปรุงความน่าเชื่อถือและประสิทธิภาพของ Outline ให้คุณและคนที่คุณแชร์เซิร์ฟเวอร์ด้วย {openLink}ดูข้อมูลเพิ่มเติม{closeLink}", + "metrics-share": "แชร์เมตริก", + "metrics-skip": "ข้าม", + "metrics-title": "การแชร์เมตริก", + "nav-about": "ข้อมูล", + "nav-data-collection": "การรวบรวมข้อมูล", + "nav-feedback": "ความคิดเห็น", + "nav-help": "ความช่วยเหลือ", + "nav-licenses": "ใบอนุญาต", + "nav-privacy": "ความเป็นส่วนตัว", + "nav-terms": "ข้อกำหนด", + "no-data-limit": "ไม่มี", + "notification-app-update": "ดาวน์โหลด Outline Manager เวอร์ชันอัปเดตแล้ว และจะติดตั้งเมื่อคุณรีสตาร์ทแอปพลิเคชัน", + "notification-feedback-thanks": "ขอขอบคุณที่ช่วยเราปรับปรุงบริการ! เรายินดีรับฟังความคิดเห็นจากคุณ", + "notification-key-added": "เพิ่มคีย์แล้ว", + "notification-key-removed": "นำคีย์ออกแล้ว", + "notification-server-destroyed": "ลบเซิร์ฟเวอร์แล้ว", + "notification-server-exists": "มีเซิร์ฟเวอร์นี้อยู่แล้ว", + "notification-server-removed": "นำเซิร์ฟเวอร์ออกแล้ว", + "oauth-account-active": "เปิดใช้บัญชี DigitalOcean ของคุณแล้ว", + "oauth-account-active-tag": "เปิดใช้บัญชีแล้ว กำลังโหลดตำแหน่งเซิร์ฟเวอร์...", + "oauth-activate-account": "เปิดใช้บัญชี DigitalOcean", + "oauth-billing": "ป้อนข้อมูลสำหรับการเรียกเก็บเงินของคุณใน digitalocean.com แล้วกลับไปที่แอปเมื่อเสร็จแล้ว", + "oauth-billing-tag": "ป้อนข้อมูลสำหรับการเรียกเก็บเงิน...", + "oauth-connect-description": "เมื่อมีบัญชีแล้ว Outline จะช่วยให้คุณสร้างเซิร์ฟเวอร์และเชื่อมต่อได้อย่างง่ายดาย", + "oauth-connect-tag": "กำลังรอเชื่อมต่อบัญชี...", + "oauth-connect-title": "ลงชื่อเข้าใช้หรือสร้างบัญชีกับ DigitalOcean", + "oauth-sign-out": "ออกจากระบบ", + "oauth-verify": "โปรดตรวจดูกล่องจดหมายเพื่อหาอีเมลจาก DigitalOcean แล้วคลิกลิงก์ในอีเมลเพื่อยืนยันบัญชี", + "oauth-verify-tag": "ยืนยันอีเมลของคุณ...", + "okay": "ตกลง", + "per-key-data-limit-dialog-set-custom": "กำหนดขีดจำกัดของข้อมูลแบบกำหนดเองไม่ได้", + "per-key-data-limit-dialog-title": "ขีดจำกัดของข้อมูล - {keyName}", + "region-best-value": "คุ้มค่าที่สุด", + "region-description": "นี่เป็นต้นทางสำหรับประสบการณ์การใช้งานอินเทอร์เน็ตของคุณ", + "region-setup": "ติดตั้ง Outline", + "region-title": "เลือกตำแหน่งเซิร์ฟเวอร์ของคุณ", + "remove": "นำออก", + "retry": "ลองใหม่", + "save": "บันทึก", + "saved": "บันทึกแล้ว", + "saving": "กำลังบันทึก...", + "server-access": "สิทธิ์เข้าถึงเซิร์ฟเวอร์", + "server-access-key-new": "เพิ่มคีย์ใหม่", + "server-access-key-rename": "เปลี่ยนชื่อ", + "server-access-keys": "คีย์การเข้าถึง", + "server-connections": "การเชื่อมต่อ", + "server-data-transfer": "โอนข้อมูลแล้ว / 30 วันที่ผ่านมา", + "server-data-used": "ปริมาณที่ใช้ไป / 30 วันที่ผ่านมา", + "server-destroy": "ลบเซิร์ฟเวอร์", + "server-help-access-key-description": "แชร์คีย์การเข้าถึงกับเพื่อน เพื่อให้เพื่อนเชื่อมต่อเซิร์ฟเวอร์ Outline ของคุณได้ โดยให้ใช้คีย์การเข้าถึงเดียวกันนี้กับอุปกรณ์ทุกเครื่อง", + "server-help-access-key-next": "ถัดไป", + "server-help-access-key-title": "สร้างคีย์และแชร์สิทธิ์เข้าถึง", + "server-help-connection-description": "คลิกที่นี่เพื่อติดตั้งแอปไคลเอ็นต์ Outline โดยใช้คีย์การเข้าถึงเซิร์ฟเวอร์ Outline ส่วนตัวของคุณ", + "server-help-connection-ok": "รับทราบ", + "server-help-connection-title": "คุณยังไม่ได้เชื่อมต่อ", + "server-keys": "คีย์", + "server-my-access-key": "คีย์การเข้าถึงของฉัน", + "server-name": "เซิร์ฟเวอร์ Outline {serverLocation}", + "server-remove": "นำเซิร์ฟเวอร์ออก", + "server-settings": "การตั้งค่า", + "server-unreachable": "เข้าถึงเซิร์ฟเวอร์ไม่ได้", + "server-unreachable-description": "เกิดปัญหาในการเชื่อมต่อกับเซิร์ฟเวอร์นี้", + "server-unreachable-managed-description": "ลองอีกครั้ง หรือนำเซิร์ฟเวอร์นี้ออกจากแอปพลิเคชัน", + "server-unreachable-manual-description": "ลองอีกครั้ง หรือลบเซิร์ฟเวอร์นี้และโฮสต์เสมือน", + "server-usage": "การใช้งาน (30 วันที่ผ่านมา)", + "servers-add": "เพิ่มเซิร์ฟเวอร์", + "servers-digitalocean": "เซิร์ฟเวอร์ DigitalOcean", + "servers-gcp": "เซิร์ฟเวอร์ของ Google Cloud Platform", + "servers-manual": "เซิร์ฟเวอร์", + "settings-access-key-port": "พอร์ตสำหรับคีย์การเข้าถึงใหม่", + "settings-metrics-header": "แชร์เมตริกแบบไม่ระบุชื่อ", + "settings-server-api-url": "Management API URL", + "settings-server-cost": "ค่าใช้จ่ายรายเดือน", + "settings-server-creation": "วันที่สร้าง", + "settings-server-hostname": "ชื่อโฮสต์", + "settings-server-id": "รหัสเซิร์ฟเวอร์", + "settings-server-info": "ข้อมูลเซิร์ฟเวอร์", + "settings-server-location": "ตำแหน่งเซิร์ฟเวอร์", + "settings-server-name": "ชื่อ", + "settings-server-rename": "ตั้งชื่อใหม่ให้เซิร์ฟเวอร์ โปรดทราบว่าชื่อนี้จะไม่แสดงในอุปกรณ์ของผู้ใช้ที่คุณเชิญให้เชื่อมต่อกับเซิร์ฟเวอร์", + "settings-server-version": "เวอร์ชันของเซิร์ฟเวอร์", + "settings-transfer-limit": "การโอนข้อมูลที่ใช้ได้", + "setup-action": "ติดตั้ง", + "setup-advanced": "ขั้นสูง", + "setup-anywhere": "ติดตั้ง Outline ได้ทุกที่", + "setup-cancel": "ยกเลิกได้ทุกเมื่อ", + "setup-create": "สร้างเซิร์ฟเวอร์", + "setup-description": "หากยังไม่มีเซิร์ฟเวอร์ โปรดสร้างบัญชีกับ DigitalOcean", + "setup-do-cost": "เพียงเดือนละ US$6", + "setup-do-create": "สร้างเซิร์ฟเวอร์ใหม่ด้วยบัญชี DigitalOcean และทุกๆ US$6/30 วัน คุณจะโอนข้อมูลได้ 1 TB", + "setup-do-data": "ปริมาณการโอนข้อมูลที่ใช้ได้ 1 TB", + "setup-do-description": "การดำเนินการนี้อาจใช้เวลาหลายนาที คุณจะลบเซิร์ฟเวอร์นี้ได้ทุกเมื่อ", + "setup-do-easiest": "กระบวนการติดตั้งแบบง่ายที่สุด", + "setup-do-title": "การติดตั้งใช้งาน Outline", + "setup-firewall-instructions": "วิธีการตั้งค่าไฟร์วอลล์", + "setup-gcp-create": "สร้างเซิร์ฟเวอร์ใหม่ด้วยบัญชี Google ของคุณ ต้นทุนจะแตกต่างกันไปตามสถานที่ตั้งและการใช้งาน", + "setup-gcp-easy": "กระบวนการติดตั้งแบบง่าย", + "setup-gcp-free-tier": "เมื่อใช้{openLinkFreeTier}รุ่นฟรี{closeLink} เซิร์ฟเวอร์แรกของคุณจะได้ราคาเริ่มต้นที่ {openLinkIpPrice}3 USD/เดือน{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}ช่วงทดลองใช้ฟรี 90 วัน{closeLink} สำหรับผู้ใช้ใหม่", + "setup-gcp-promo": "ลองกระบวนการสร้างเซิร์ฟเวอร์ Outline โดยอัตโนมัติแบบใหม่สำหรับ Google Cloud", + "setup-recommended": "แนะนำ", + "setup-simple-commands": "คำสั่งติดตั้งแบบพื้นฐาน", + "setup-step-by-step": "คำแนะนำในการติดตั้งทีละขั้นตอน", + "setup-tested": "ผ่านการทดสอบใน VULTR, Linode และ Liquid Web แล้ว", + "setup-title": "เลือกบริการคลาวด์ที่จะติดตั้ง Outline", + "share-description": "คัดลอกคำเชิญนี้ แล้วส่งผ่านเครื่องมือสื่อสารที่คุณเชื่อถือ {openLink}หากต้องการความช่วยเหลือ{closeLink}", + "share-invite-access-key-copied": "คัดลอกคีย์การเข้าถึงไปยังคลิปบอร์ดแล้ว", + "share-invite-copied": "คัดลอกคําเชิญไปยังคลิปบอร์ดแล้ว", + "share-invite-copy": "คัดลอกคำเชิญ", + "share-invite-copy-access-key": "คัดลอกคีย์การเข้าถึง", + "share-invite-html": "ใช้เซิร์ฟเวอร์นี้เพื่อเข้าถึงอินเทอร์เน็ตได้อย่างปลอดภัยและเป็นอิสระมากขึ้น โดยทำดังนี้

1) ดาวน์โหลดและติดตั้งแอป Outline สําหรับอุปกรณ์ของคุณ:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- ลิงก์ทางเลือกของ Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) คุณจะได้รับคีย์การเข้าถึงที่ขึ้นต้นด้วย ss:// และเมื่อได้รับแล้ว ให้คัดลอกคีย์การเข้าถึงนี้

3) เปิดแอปไคลเอ็นต์ Outline หากระบบตรวจพบคีย์การเข้าถึงโดยอัตโนมัติ ให้แตะ \"เชื่อมต่อ\" แล้วดําเนินการต่อ หากระบบไม่พบคีย์การเข้าถึงโดยอัตโนมัติ ให้วางคีย์ดังกล่าวลงในช่อง จากนั้นแตะ \"เชื่อมต่อ\" แล้วดําเนินการต่อ

คุณพร้อมที่จะใช้อินเทอร์เน็ตได้อย่างอิสระแล้ว เพื่อให้แน่ใจว่าคุณเชื่อมต่อกับเซิร์ฟเวอร์สำเร็จแล้ว ให้ลองค้นหาคําว่า \"IP ของฉันคืออะไร\" ใน Google Search ที่อยู่ IP ที่แสดงใน Google ควรตรงกับที่อยู่ IP ในไคลเอ็นต์ Outline

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Outline ได้ที่ https://getoutline.org/", + "share-invite-instructions": "โปรดทำตามวิธีการในคำเชิญบน GitHub ดังนี้", + "share-invite-trouble": "หากมีปัญหาในการเข้าถึงลิงก์คำเชิญ", + "share-title": "แชร์สิทธิ์เข้าถึง", + "survey-data-limits-title": "ช่วยเราทำความเข้าใจเกี่ยวกับวิธีการเพิ่มขีดจำกัดของข้อมูล", + "survey-decline": "ปฏิเสธ", + "survey-disclaimer": "เมื่อคลิกต่อไป ระบบจะนำคุณไปยังแบบสำรวจสั้นๆ ใน Google ฟอร์ม เราขอแนะนำให้ทำแบบสำรวจในขณะที่เชื่อมต่อกับ Outline", + "survey-go-to-survey": "ทำแบบสำรวจ", + "terms-of-service": "ฉันได้อ่านและเข้าใจ{openLink}ข้อกำหนดในการให้บริการของ Outline{closeLink} แล้ว" +} diff --git a/server_manager/messages/tr.json b/server_manager/messages/tr.json new file mode 100644 index 0000000000..0380be5024 --- /dev/null +++ b/server_manager/messages/tr.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline, haber kuruluşlarının ve gazetecilerin internete erişmesi için daha güvenli bir yol sunmak amacıyla Jigsaw tarafından oluşturulan bir açık kaynak projesidir.

Outline, Shadowsocks tarafından desteklenmektedir ve hâlâ geliştirme aşamasında olan bir üründür. GitHub sitesindeki koda katkıda bulunabilir, uygulama daha fazla platformda kullanıma sunulduğunda ve yeni özellikler eklendiğinde haberdar olmak için bizi Reddit ve Medium üzerinden takip edebilirsiniz.", + "about-version": "Sürüm {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} örnekleri ekranına gidin.", + "aws-lightsail-firewall-1": "Outline'ı barındırmak istediğiniz örneği tıklayın.", + "aws-lightsail-firewall-2": "\"Ağ iletişimi\" (Networking) sekmesine gidin.", + "aws-lightsail-firewall-3": "\"Güvenlik duvarı\" (Firewall) bölümünde, \"Başka bir kural daha ekle\" (Add another) seçeneğini tıklayın.", + "aws-lightsail-firewall-4": "\"Uygulama\" (Application) değerini \"Tüm TCP+UDP\" (All TCP+UDP) olarak ayarlayın.", + "aws-lightsail-firewall-5": "\"Kaydet\" (Save) seçeneğini tıklayın.", + "cancel": "İptal", + "close": "Kapat", + "confirmation-server-destroy": "Mevcut kullanıcılar erişimi kaybedecek. Bu işlem geri alınamaz.", + "confirmation-server-destroy-title": "Sunucu Silinsin mi?", + "confirmation-server-remove": "Bu işlemle sunucunuz Outline Manager'dan kaldırılacak, ancak kullanıcılar için proxy erişimi engellenmeyecek. Outline sunucusunu ana makineden yine manuel olarak silmeniz gerekecek.", + "confirmation-server-remove-title": "Sunucu Kaldırılsın mı?", + "data-limit": "Veri Sınırı", + "data-limit-per-key": "Anahtar başına veri limiti", + "data-limits": "Veri sınırları", + "data-limits-description": "Bu sunucudaki erişim anahtarları için 30 gün izlemeli veri aktarımı sınırı belirleyin.", + "data-limits-dialog-text": "Bu sunucudaki erişim anahtarları için bir veri aktarımı sınırı belirlemek üzere Ayarlar sekmesine gidin.", + "data-limits-dialog-title": "Fazla veri kullanımından kaçının", + "data-limits-disclaimer": "Şu anda metrik raporlaması yapmakta olduğunuzdan veri limiti özelliğinin kullanımı dahil edilecek. Daha ayrıntılı bilgi için lütfen {openLink}veri toplama politikasını{closeLink} inceleyin.", + "data-limits-usage": "{used}/{total} kullanılıyor", + "destroy": "Sil", + "digitalocean-disconnect-account": "DigitalOcean hesabının bağlantısını kesin", + "digitalocean-unreachable": "Bu hatanın nedeni ağınızdaki bir güvenlik duvarı veya digitalocean.com sitesiyle ilgili geçici bağlantı sorunları olabilir.", + "disabled": "Devre dışı", + "disconnect": "Bağlantıyı kes", + "done": "Bitti", + "enabled": "Etkin", + "error-connectivity": "DigitalOcean hesabınıza bağlanma konusunda sorun yaşıyoruz. Bu bazen DigitalOcean'la veya internet bağlantınızla ilgili olan geçici bir sorundur. İşlemi yeniden denemek işe yaramazsa DigitalOcean'a tekrar giriş yapmak sorunu çözecektir.", + "error-connectivity-title": "Bağlantı sorunu", + "error-do-account-info": "DigitalOcean hesabı bilgileri alınamadı", + "error-do-auth": "DigitalOcean ile kimlik doğrulama başarısız oldu", + "error-do-limit": "DigitalOcean hesabınız {num} Droplet sınırına ulaştı. https://cloud.digitalocean.com/account/team/droplet_limit_increase adresine giderek artış isteğinde bulunabilirsiniz", + "error-do-regions": "Kullanılabilir bölgelerin listesi alınamadı", + "error-do-warning": "DigitalOcean uyarısı: \"{message}\"", + "error-feedback": "Geri bildirim gönderilemedi. Lütfen tekrar deneyin.", + "error-gcp-auth": "Google Cloud Platform kimlik doğrulaması başarısız oldu", + "error-hostname-invalid": "Bir IP adresi veya geçerli ana makine adı olmalıdır.", + "error-key-add": "Anahtar eklenemedi", + "error-key-remove": "Anahtar kaldırılamadı", + "error-key-rename": "Anahtar yeniden adlandırılamadı", + "error-keys-get": "Anahtarlar yüklenemedi", + "error-keys-port-bad-input": "Bağlantı noktası 1 ile 65.535 arasında bir tam sayı olmalıdır.", + "error-keys-port-in-use": "Bağlantı noktası sunucuda zaten kullanılıyor.", + "error-licenses": "Lisanslar yüklenemedi.", + "error-metrics": "Metrikleri belirleme etkinleştirilirken hata oluştu", + "error-network": "Bir ağ hatası oluştu.", + "error-not-saved": "Kaydedilmedi", + "error-remove-data-limit": "Varsayılan veri limiti devre dışı bırakılamadı", + "error-remove-per-key-limit": "Bu erişim anahtarındaki veri limiti kaldırılamadı", + "error-server-creation": "Outline sunucunuz oluşturulurken hata meydana geldi.", + "error-server-destroy": "Sunucu silinemedi", + "error-server-removed": "{serverName} artık DigitalOcean hesabınızda mevcut değil.", + "error-server-rename": "Sunucu yeniden adlandırılamadı", + "error-server-unreachable": "Outline Sunucunuz doğru şekilde yüklenmiş, ancak sunucuya bağlanılamadı. Bunun nedeni büyük olasılıkla sunucunuzun güvenlik duvarı kurallarının gelen bağlantıları engelliyor olmasıdır. Lütfen ilgili kuralları inceleyin ve 1024 - 65535 arasındaki bağlantı noktalarında gelen TCP bağlantılarına izin verildiğinden emin olun.", + "error-server-unreachable-title": "Outline Sunucunuza bağlanılamadı", + "error-servers-removed": "{serverNames} artık DigitalOcean hesabınızda mevcut değil.", + "error-set-data-limit": "Varsayılan veri limiti ayarlanamadı", + "error-set-per-key-limit": "Bu erişim anahtarı için veri limiti ayarlanamadı", + "error-unexpected": "Beklenmeyen bir hata oluştu.", + "experimental": "Deneysel", + "experiments": "Denemeler", + "experiments-description": "Kullanıma sunulmadan önce yeni özellikleri test edin ve bize geri bildirimde bulunun.", + "experiments-disclaimer": "Denemeler geliştirilme aşamasındadır ve değiştirilebilir veya uygulamadan kaldırılabilir. Şu anda metrik raporlaması yapıyorsanız deneysel özelliklerin kullanımı dahil edilir. Daha ayrıntılı bilgi için lütfen {openLink}veri toplama politikasını{closeLink} inceleyin.", + "experiments-feedback": "Önerileriniz mi var? {openLink}Buradan geri bildirim gönderin.{closeLink}", + "feedback-cloud-provider": "Bulut sağlayıcıyı seçin", + "feedback-cloud-provider-error": "Lütfen bir bulut sağlayıcı seçin.", + "feedback-connection": "Sunucuma bağlanamıyorum", + "feedback-connection-others": "Diğer kullanıcılar sunucuma bağlanamıyor", + "feedback-disclaimer": "Ekibimizin yalnızca İngilizce geri bildirimleri cevaplayabildiğini belirtmek isteriz.", + "feedback-email": "E-posta adresi (isteğe bağlı)", + "feedback-error": "Lütfen geri bildirim girin.", + "feedback-explanation-install": "Sunucunuza Outline yüklenmeye çalışılırken bir hata oluştu. Bir çözüm bulamadıysanız lütfen bize geri bildirim gönderin ve size dönüş yapabilmemiz için e-posta adresinizi bildirin (isteğe bağlı).", + "feedback-general": "Genel geri bildirim", + "feedback-install": "Outline'ı yükleme konusunda sorun yaşıyorum", + "feedback-label": "Geri bildiriminiz", + "feedback-management": "Sunucumu yönetme konusunda sorun yaşıyorum", + "feedback-other": "Diğer", + "feedback-privacy": "Geri bildiriminiz, e-posta adresiniz (sağlandıysa) ve {openLink}gizlilik politikasında{closeLink} belirtilen ek bilgiler Outline ekibine gönderilecektir.", + "feedback-submit": "Gönder", + "feedback-suggestion": "Öneriler", + "feedback-title-generic": "Geri Bildirim Gönder", + "feedback-title-install": "Outline Sunucusu Yüklenemedi", + "gcp-billing-action": "Sonraki", + "gcp-billing-body": "{openLink}Google Cloud'da bir faturalandırma hesabı eklemeniz{closeLink} bekleniyor", + "gcp-billing-description": "Devam etmek için {openLink}Cloud Console faturalandırma sayfasını açın{closeLink} ve bir hesap ekleyin.", + "gcp-billing-error": "Fatura bilgileri alınamadı", + "gcp-billing-error-zero": "Devam etmeden önce bir faturalandırma hesabı eklemelisiniz.", + "gcp-click-create": "\"Create\" (Oluştur) seçeneğini tıklayın.", + "gcp-create-new-project": "{openLink}Yeni bir Google Cloud Projesi oluşturun{closeLink}.", + "gcp-create-new-vm": "{openLink}Yeni bir VM örneği oluşturun{closeLink}.", + "gcp-create-project": "Bir Google Cloud projesi oluşturun", + "gcp-create-server": "Google Cloud Projenizi oluşturun", + "gcp-create-vm": "Sanal Makine Örneği oluşturun", + "gcp-disconnect-account": "Google Cloud Platform hesabının bağlantısını kesin", + "gcp-firewall-create-0": "Compute Engine projenize {openLink}yeni bir güvenlik duvarı ekleyin{closeLink}.", + "gcp-firewall-create-1": "\"Name\" (Ad) alanına \"outline\" yazın.", + "gcp-firewall-create-2": "\"Target tags\" (Hedef etiketler) alanına \"outline\" yazın.", + "gcp-firewall-create-3": "\"Source IP ranges\" (Kaynak IP aralıkları) alanına \"0.0.0.0/0\" yazın.", + "gcp-firewall-create-4": "\"Protocols and ports\" (Protokoller ve bağlantı noktaları) bölümünde \"Allow all\" (Tümüne izin ver) seçeneğini belirleyin.", + "gcp-name-your-project": "\"Proje adı\" (Project name) alanına projeniz için bir ad girin.", + "gcp-project-setup-error": "Google Cloud projeniz oluşturulurken bir hata meydana geldi", + "gcp-select-machine-type": "\"Makine türü\" (Machine type) bölümünde \"f1-micro\" seçeneğini belirleyin", + "gcp-select-networking": "Önce \"Yönetim, güvenlik, diskler, ağ iletişimi, tek kiracılı\" (Management, security, disks, networking, sole tenancy), ardından \"Ağ iletişimi\" (Networking) seçeneğini tıklayın", + "gcp-select-region": "\"Bölge\" (Region) altında, sunucunun kullanıcılarının olacağı yere yakın bir bölge seçin.", + "gcp-type-network-tag": "\"Ağ etiketleri\" (Network tags) alanına \"outline\" yazın", + "gcp-type-outline-server": "\"Ad\" (Name) alanına \"outline-server\" yazın.", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Changhua İlçesi", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Cakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "Londra", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montreal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Kuzey Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Salt Lake City", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seul", + "geo-sg": "Singapur", + "geo-south-carolina": "Güney Carolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sidney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Varşova", + "geo-zurich": "Zürih", + "key": "{keyId} kimlikli anahtar", + "manual-server-assign-firewall": "Güvenlik duvarı kuralı atayın", + "manual-server-assign-group": "Güvenlik Grubu Atayın", + "manual-server-create-firewall": "Bir güvenlik duvarı kuralı oluşturun", + "manual-server-create-group": "Güvenlik Grubu Oluşturun", + "manual-server-description": "Bu adımlar, Outline'ı bir {cloudProvider} Linux sunucusuna yüklemenize yardımcı olacaktır.", + "manual-server-firewall": "Güvenlik duvarınızı yapılandırın", + "manual-server-install-paste": "Kurulum işleminizin çıktısını buraya yapıştırın.", + "manual-server-install-run": "Sunucunuza giriş yapın ve bu komutu çalıştırın.", + "manual-server-instructions": "Talimatlar", + "manual-server-show-me": "Nerede olduğunu göster", + "manual-server-title": "Aşağıdaki talimatları uygulayın", + "metrics-description": "Outline'ın güvenilirliğini ve performansını hem sizin hem de sunucuyu paylaştığınız kişiler için iyileştirmemize yardımcı olmak üzere anonim metrikler paylaşın. {openLink}Daha fazla bilgi.{closeLink}", + "metrics-share": "Metrikleri paylaş", + "metrics-skip": "Atla", + "metrics-title": "Metrik paylaşımı", + "nav-about": "Hakkında", + "nav-data-collection": "Veri toplama", + "nav-feedback": "Geri bildirim", + "nav-help": "Yardım", + "nav-licenses": "Lisanslar", + "nav-privacy": "Gizlilik", + "nav-terms": "Şartlar", + "no-data-limit": "Yok", + "notification-app-update": "Outline Manager'ın güncel bir sürümü indirildi. Uygulamayı yeniden başlattığınızda güncel sürüm yüklenecek.", + "notification-feedback-thanks": "Hizmetimizi iyileştirmemize yardımcı olduğunuz için teşekkürler! Sizlerden geri bildirim almayı seviyoruz.", + "notification-key-added": "Anahtar eklendi", + "notification-key-removed": "Anahtar kaldırıldı", + "notification-server-destroyed": "Sunucu silindi", + "notification-server-exists": "Sunucu zaten eklendi", + "notification-server-removed": "Sunucu kaldırıldı", + "oauth-account-active": "DigitalOcean hesabınız etkinleştirildi.", + "oauth-account-active-tag": "Hesap etkinleştirildi! Sunucu konumları yükleniyor...", + "oauth-activate-account": "DigitalOcean hesabınızı etkinleştirin.", + "oauth-billing": "digitalocean.com sitesinde faturalandırma bilgilerinizi girin ve işiniz bittiğinde uygulamaya dönün.", + "oauth-billing-tag": "Fatura bilgilerini girin...", + "oauth-connect-description": "Outline, hesabınızla, sunucu oluşturmayı ve bağlantı kurmayı kolaylaştırır.", + "oauth-connect-tag": "Hesabınıza bağlanılması bekleniyor...", + "oauth-connect-title": "Oturum açın veya DigitalOcean ile bir hesap oluşturun.", + "oauth-sign-out": "Oturumu Kapat", + "oauth-verify": "Gelen kutunuzda DigitalOcean'dan gelen e-postayı bulun ve içerdiği bağlantıyı tıklayarak hesabınızı onaylayın.", + "oauth-verify-tag": "E-posta adresinizi onaylayın...", + "okay": "Tamam", + "per-key-data-limit-dialog-set-custom": "Özel bir veri sınırı belirle", + "per-key-data-limit-dialog-title": "Veri Limiti - {keyName}", + "region-best-value": "En Uygun Fiyat", + "region-description": "Bu, internet deneyiminizi yaşayacağınız sunucunun konumudur.", + "region-setup": "Outline'ı kur", + "region-title": "Sunucunuzun konumunu seçin.", + "remove": "Kaldır", + "retry": "Yeniden dene", + "save": "Kaydet", + "saved": "Kaydedildi", + "saving": "Kaydediliyor...", + "server-access": "Sunucu erişimi", + "server-access-key-new": "Yeni anahtar ekle", + "server-access-key-rename": "Yeniden adlandır", + "server-access-keys": "Erişim anahtarları", + "server-connections": "Bağlantılar", + "server-data-transfer": "Aktarılan veri miktarı/son 30 gün", + "server-data-used": "Kullanılan veri miktarı/son 30 gün", + "server-destroy": "Sunucuyu sil", + "server-help-access-key-description": "Outline sunucunuza bağlanabilmeleri için erişim anahtarlarınızı arkadaşlarınızla paylaşın. Arkadaşlarınız tüm cihazlarında aynı erişim anahtarını kullanabilir.", + "server-help-access-key-next": "Sonraki", + "server-help-access-key-title": "Anahtarlar oluşturun, erişimi paylaşın", + "server-help-connection-description": "Outline sunucunuza ait kişisel erişim anahtarını kullanarak Outline istemci uygulamasını yüklemek için burayı tıklayın.", + "server-help-connection-ok": "Tamam, anladım!", + "server-help-connection-title": "Henüz bağlanmadınız!", + "server-keys": "Anahtar sayısı", + "server-my-access-key": "Erişim anahtarım", + "server-name": "Outline Sunucusu {serverLocation}", + "server-remove": "Sunucuyu kaldır", + "server-settings": "Ayarlar", + "server-unreachable": "Sunucuya ulaşılamıyor", + "server-unreachable-description": "Bu sunucuya bağlanma konusunda sorun yaşıyoruz.", + "server-unreachable-managed-description": "Tekrar deneyin veya bu sunucuyu uygulamadan kaldırın.", + "server-unreachable-manual-description": "Tekrar deneyin veya bu sunucuyu ve sanal ana makineyi silin.", + "server-usage": "Kullanım (son 30 gün)", + "servers-add": "Sunucu ekle", + "servers-digitalocean": "DigitalOcean sunucuları", + "servers-gcp": "Google Cloud Platform sunucuları", + "servers-manual": "Sunucular", + "settings-access-key-port": "Yeni erişim anahtarları için bağlantı noktası", + "settings-metrics-header": "Anonim metrikleri paylaşın", + "settings-server-api-url": "Management API URL'si", + "settings-server-cost": "Aylık maliyet", + "settings-server-creation": "Oluşturulma tarihi", + "settings-server-hostname": "Ana Makine Adı", + "settings-server-id": "Sunucu Kimliği", + "settings-server-info": "Sunucu Bilgileri", + "settings-server-location": "Sunucu konumu", + "settings-server-name": "Ad", + "settings-server-rename": "Sunucunuz için yeni bir ad belirtin. Bu adın, ilgili sunucuya bağlanmak üzere davet ettiğiniz kullanıcıların cihazlarına yansıtılmayacağını belirtmek isteriz.", + "settings-server-version": "Sunucu sürümü", + "settings-transfer-limit": "Veri aktarımı hakkı", + "setup-action": "Kur", + "setup-advanced": "Gelişmiş", + "setup-anywhere": "Outline'ı dilediğiniz yere kurun", + "setup-cancel": "Dilediğiniz zaman iptal edebilirsiniz", + "setup-create": "Sunucu oluştur", + "setup-description": "Bir sunucunuz yok mu? DigitalOcean ile hesap oluşturun.", + "setup-do-cost": "Ayda yalnızca 6 ABD doları", + "setup-do-create": "1 TB veri aktarımı için fazladan 6 ABD doları/30 gün tutarında ücret ödeyerek DigitalOcean hesabınızla yeni bir sunucu oluşturun.", + "setup-do-data": "1 TB veri aktarımı hakkı", + "setup-do-description": "Bu işlem birkaç dakika sürebilir. Bu sunucuyu istediğiniz zaman silebilirsiniz.", + "setup-do-easiest": "En kolay kurulum işlemi", + "setup-do-title": "Outline kuruluyor.", + "setup-firewall-instructions": "Güvenlik duvarı talimatları", + "setup-gcp-create": "Google hesabınızla yeni bir sunucu oluşturun. Maliyetler konuma ve kullanıma göre değişiklik gösterir.", + "setup-gcp-easy": "Kolay kurulum işlemi", + "setup-gcp-free-tier": "{openLinkFreeTier}Ücretsiz Katman{closeLink} ile, ilk sunucunuzun ücreti {openLinkIpPrice}3 ABD doları/ay{closeLink} fiyattan başlar", + "setup-gcp-free-trial": "Yeni kullanıcılar için {openLinkFreeTrial}90 günlük ücretsiz deneme{closeLink}", + "setup-gcp-promo": "Google Cloud için yeni otomatik Outline sunucusu oluşturma işlemini deneyin", + "setup-recommended": "Önerilir", + "setup-simple-commands": "Basit yükleme komutları", + "setup-step-by-step": "Adım adım kurulum kılavuzu", + "setup-tested": "VULTR, Linode ve Liquid Web'de test edilmiştir", + "setup-title": "Outline'ı kurmak için bir bulut hizmeti seçin.", + "share-description": "Bu davetiyeyi kopyalayıp güvendiğiniz bir iletişim aracından gönderin. {openLink}Yardıma mı ihtiyacınız var?{closeLink}", + "share-invite-access-key-copied": "Erişim anahtarı panoya kopyalandı", + "share-invite-copied": "Davetiye panoya kopyalandı", + "share-invite-copy": "Davetiyeyi kopyala", + "share-invite-copy-access-key": "Erişim anahtarını kopyala", + "share-invite-html": "Açık internete güvenli bir şekilde erişmek için bu sunucuyu kullanın:

1) Cihazınıza Outline uygulamasını indirip yükleyin:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Alternatif Android bağlantısı: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) ss:// ile başlayan bir erişim anahtarı alırsınız. Aldıktan sonra bu erişim anahtarını kopyalayın.

3) Outline istemcisi uygulamasını açın. Erişim anahtarınız otomatik olarak algılanırsa \"Bağlan\"a dokunup devam edin. Erişim anahtarınız otomatik olarak algılanmazsa alana yapıştırın, ardından \"Bağlan\"a dokunup devam edin.

Açık interneti kullanmaya hazırsınız. Sunucuya başarılı bir şekilde bağlandığınızdan emin olmak için Google Arama'da \"what is my ip\" ifadesini aramayı deneyin. Google'da gösterilen IP adresi, Outline istemcisindeki IP adresiyle aynı olmalıdır.

Outline hakkında daha fazla bilgiyi buradan edinebilirsiniz: https://getoutline.org/", + "share-invite-instructions": "GitHub'daki davetiye talimatlarımızı uygulayın:", + "share-invite-trouble": "Davetiye bağlantısına erişme konusunda sorun mu yaşıyorsunuz?", + "share-title": "Erişimi paylaşın", + "survey-data-limits-title": "Veri sınırlarını nasıl iyileştirebileceğimizi anlamamıza yardımcı olun", + "survey-decline": "Reddet", + "survey-disclaimer": "Devam'ı tıkladığınızda Google Formlar'daki kısa bir ankete yönlendirileceksiniz. Anketi, Outline'a bağlıyken doldurmanız önerilir.", + "survey-go-to-survey": "Ankete git", + "terms-of-service": "{openLink}Outline Hizmet Şartları{closeLink}'nı okuyup anladım" +} diff --git a/server_manager/messages/uk.json b/server_manager/messages/uk.json new file mode 100644 index 0000000000..58c82b5722 --- /dev/null +++ b/server_manager/messages/uk.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline – це проект із відкритим кодом, створений командою Jigsaw, щоб надати службам новин і журналістам безпечніший доступ до Інтернету.

Outline працює на платформі Shadowsocks та зараз перебуває на ранній стадії розробки. Ви можете долучитися до створення коду у веб-сервісі GitHub, а також підписатися на наші оновлення в Reddit і Medium, щоб отримувати інформацію про розширення переліку підтримуваних платформ і нові функції.", + "about-version": "Версія {version}", + "aws-lightsail-firewall-0": "Перейдіть на екран екземплярів {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Виберіть екземпляр, на якому потрібно розмістити Outline.", + "aws-lightsail-firewall-2": "Перейдіть на вкладку \"Мережі\" (Networking).", + "aws-lightsail-firewall-3": "У розділі \"Брандмауер\" (Firewall) натисніть \"Додати інше\" (Add another).", + "aws-lightsail-firewall-4": "Установіть \"All TCP+UDP\" як значення для параметра \"Застосування\" (Application).", + "aws-lightsail-firewall-5": "Натисніть \"Зберегти\" (Save).", + "cancel": "Скасувати", + "close": "Закрити", + "confirmation-server-destroy": "Наявні користувачі втратять доступ. Цю дію не можна скасувати.", + "confirmation-server-destroy-title": "Видалити сервер?", + "confirmation-server-remove": "Ваш сервер буде вилучено з Диспетчера Outline, але доступ користувачів до Інтернету через цей сервер Outline заблоковано не буде. Вам знадобиться вручну видалити його зі свого хост-комп'ютера.", + "confirmation-server-remove-title": "Вилучити сервер?", + "data-limit": "Обмеження обсягу даних", + "data-limit-per-key": "Обмеження обсягу даних для ключів доступу", + "data-limits": "Обмеження трафіку", + "data-limits-description": "Установіть 30-денне обмеження на перенесення даних для ключів доступу на цьому сервері.", + "data-limits-dialog-text": "Перейдіть на вкладку \"Налаштування\", щоб установити обмеження на перенесення даних для ключів доступу на цьому сервері.", + "data-limits-dialog-title": "Уникайте перевищення обсягу даних", + "data-limits-disclaimer": "Оскільки ви зараз надсилаєте звіти про показники, у них включатиметься функція обмеження обсягу даних. Щоб отримати докладні відомості, перегляньте {openLink}правила збору даних{closeLink}.", + "data-limits-usage": "Використано {used} з {total}", + "destroy": "Видалити", + "digitalocean-disconnect-account": "Відключити обліковий запис DigitalOcean", + "digitalocean-unreachable": "Цю помилку може спричиняти брандмауер у вашій мережі або тимчасові проблеми з'єднання з digitalocean.com.", + "disabled": "Вимкнено", + "disconnect": "Відключити", + "done": "Готово", + "enabled": "Увімкнено", + "error-connectivity": "Виникли проблеми з підключенням до вашого облікового запису DigitalOcean. Це може бути викликано тимчасовою проблемою з DigitalOcean або з вашим інтернет-з'єднанням. Повторіть спробу. Якщо це не допоможе, спробуйте ще раз увійти в DigitalOcean.", + "error-connectivity-title": "Проблема з підключенням", + "error-do-account-info": "Не вдалось отримати дані облікового запису DigitalOcean", + "error-do-auth": "Помилка автентифікації в DigitalOcean", + "error-do-limit": "У вашому обліковому записі DigitalOcean уже додано максимальну кількість місць ({num}). Запит на збільшення можна надіслати на сторінці https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Не вдалось отримати список доступних регіонів", + "error-do-warning": "Попередження DigitalOcean: {message}", + "error-feedback": "Не вдалося надіслати відгук. Повторіть спробу.", + "error-gcp-auth": "Помилка автентифікації з Google Cloud Platform", + "error-hostname-invalid": "Потрібно вказати IP-адресу або дійсне ім'я хосту.", + "error-key-add": "Не вдалося додати ключ", + "error-key-remove": "Не вдалося видалити ключ", + "error-key-rename": "Не вдалося перейменувати ключ", + "error-keys-get": "Не вдалося завантажити ключі", + "error-keys-port-bad-input": "Номер порту має бути цілим числом від 1 до 65 535.", + "error-keys-port-in-use": "Цей номер порту вже використовується на сервері.", + "error-licenses": "Не вдалося завантажити ліцензії.", + "error-metrics": "Помилка ввімкнення показників", + "error-network": "Сталася помилка мережі.", + "error-not-saved": "Не збережено", + "error-remove-data-limit": "Не вдалося вимкнути обмеження обсягу даних за умовчанням", + "error-remove-per-key-limit": "Не вдалося вилучити обмеження обсягу даних для цього ключа доступу", + "error-server-creation": "Під час створення сервера Outline сталася помилка.", + "error-server-destroy": "Не вдалося видалити сервер", + "error-server-removed": "Сервера {serverName} більше немає у вашому обліковому запису DigitalOcean.", + "error-server-rename": "Не вдалося перейменувати сервер", + "error-server-unreachable": "Ваш сервер Outline встановлено правильно, але не вдалося підключитися до нього. Найвірогідніша причина: правила брандмауера вашого сервера блокують вхідні підключення. Перевірте їх і переконайтеся, що вхідні підключення TCP для портів 1024–65535 дозволено.", + "error-server-unreachable-title": "Не вдалося підключитися до вашого сервера Outline", + "error-servers-removed": "Серверів {serverNames} більше немає у вашому обліковому запису DigitalOcean.", + "error-set-data-limit": "Не вдалося встановити обмеження обсягу даних за умовчанням", + "error-set-per-key-limit": "Не вдалося встановити обмеження обсягу даних для цього ключа доступу", + "error-unexpected": "Сталася неочікувана помилка.", + "experimental": "Експериментальна функція", + "experiments": "Експериментальні функції", + "experiments-description": "Протестуйте нові функції до їх випуску та надішліть нам відгук.", + "experiments-disclaimer": "Експериментальні функції ще розробляються, і ми можемо змінювати або вилучати їх із додатка. Якщо зараз ви надсилаєте звіти про показники, у них включатиметься використання експериментальних функцій. Щоб отримати докладні відомості, перегляньте {openLink}політику щодо збору даних{closeLink}.", + "experiments-feedback": "Маєте пропозиції? {openLink}Надішліть відгук.{closeLink}", + "feedback-cloud-provider": "Виберіть постачальника хмарних послуг", + "feedback-cloud-provider-error": "Виберіть постачальника хмарних послуг.", + "feedback-connection": "Не вдається підключитися до свого сервера", + "feedback-connection-others": "Інші користувачі не можуть підключитися до мого сервера", + "feedback-disclaimer": "Зверніть увагу: наша команда відповідає на відгуки лише англійською мовою.", + "feedback-email": "Електронна адреса (необов’язково)", + "feedback-error": "Введіть відгук.", + "feedback-explanation-install": "Сталася помилка під час спроби встановити Outline на ваш сервер. Якщо ви не змогли вирішити цю проблему, радимо надіслати нам відгук і повідомити свою електронну адресу (необов'язково), щоб ми могли зв'язатися з вами.", + "feedback-general": "Загальний відгук", + "feedback-install": "Проблеми з встановленням Outline", + "feedback-label": "Ваш відгук", + "feedback-management": "Проблеми з керуванням моїм сервером", + "feedback-other": "Інше", + "feedback-privacy": "Ваш відгук, електронну адресу (якщо ви її вказали) і додаткову інформацію, описану в {openLink}Політиці конфіденційності{closeLink}, буде надіслано команді Outline.", + "feedback-submit": "Надіслати", + "feedback-suggestion": "Пропозиції", + "feedback-title-generic": "Надіслати відгук", + "feedback-title-install": "Не вдалося встановити сервер Outline", + "gcp-billing-action": "Далі", + "gcp-billing-body": "{openLink}Додайте платіжний обліковий запис у Google Cloud{closeLink}", + "gcp-billing-description": "Щоб продовжити, {openLink}відкрийте сторінку платежів у Cloud Console{closeLink} і додайте обліковий запис.", + "gcp-billing-error": "Не вдалось отримати платіжну інформацію", + "gcp-billing-error-zero": "Щоб продовжити, додайте платіжний обліковий запис.", + "gcp-click-create": "Натисніть \"Create\" (Створити).", + "gcp-create-new-project": "{openLink}Створіть новий хмарний проект Google{closeLink}.", + "gcp-create-new-vm": "{openLink}Створіть нову віртуальну машину{closeLink}.", + "gcp-create-project": "Створіть хмарний проект Google", + "gcp-create-server": "Створіть хмарний проект Google", + "gcp-create-vm": "Створіть віртуальну машину", + "gcp-disconnect-account": "Від’єднайте обліковий запис Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Додайте нове правило брандмауера{closeLink} до свого проекту Compute Engine.", + "gcp-firewall-create-1": "Введіть \"outline\" у полі \"Name\" (Назва).", + "gcp-firewall-create-2": "Введіть \"outline\" у полі \"Target tags\" (Цільові теги).", + "gcp-firewall-create-3": "Введіть \"0.0.0.0/0\" у полі \"Source IP ranges\" (Вихідні діапазони IP-адрес).", + "gcp-firewall-create-4": "У розділі \"Protocols and ports\" (Протоколи й порти) виберіть \"Allow all\" (Дозволити всі).", + "gcp-name-your-project": "Введіть назву в полі \"Назва проекту\" (Project name).", + "gcp-project-setup-error": "Не вдалося налаштувати проект Google Cloud", + "gcp-select-machine-type": "У розділі \"Тип машини\" (Machine type) виберіть \"f1-micro\"", + "gcp-select-networking": "Натисніть \"Керування, безпека, диски, мережі, одноосібне володіння\" (Management, security, disks, networking, sole tenancy), а потім \"Мережі\" (Networking)", + "gcp-select-region": "У полі \"Регіон\" (Region) виберіть регіон, близький до того, де перебувають користувачі сервера.", + "gcp-type-network-tag": "Введіть outline у полі \"Теги мережі\" (Network tags)", + "gcp-type-outline-server": "Введіть outline-server в полі \"Назва\" (Name).", + "geo-amsterdam": "Амстердам", + "geo-bangalore": "Бангалор", + "geo-changhua-county": "Повіт Чжанхуа", + "geo-delhi": "Делі", + "geo-eemshaven": "Емсхавен", + "geo-frankfurt": "Франкфурт", + "geo-hamina": "Хаміна", + "geo-hk": "Гонконг", + "geo-iowa": "Айова", + "geo-jakarta": "Джакарта", + "geo-jurong-west": "Джурон-Вест", + "geo-las-vegas": "Лас-Вегас", + "geo-london": "Лондон", + "geo-los-angeles": "Лос-Анджелес", + "geo-melbourne": "Мельбурн", + "geo-montreal": "Монреаль", + "geo-mumbai": "Мумбаї", + "geo-new-york-city": "Нью-Йорк", + "geo-northern-virginia": "Північна Вірджинія", + "geo-oregon": "Орегон", + "geo-osaka": "Осака", + "geo-salt-lake-city": "Солт-Лейк-Сіті", + "geo-san-francisco": "Сан-Франциско", + "geo-sao-paulo": "Сан-Паулу", + "geo-seoul": "Сеул", + "geo-sg": "Сінгапур", + "geo-south-carolina": "Південна Кароліна", + "geo-st-ghislain": "Сен-Гілен", + "geo-sydney": "Сідней", + "geo-tokyo": "Токіо", + "geo-toronto": "Торонто", + "geo-warsaw": "Варшава", + "geo-zurich": "Цюрих", + "key": "Ключ {keyId}", + "manual-server-assign-firewall": "Призначте правило брандмауера", + "manual-server-assign-group": "Призначте групу безпеки", + "manual-server-create-firewall": "Створіть правило брандмауера", + "manual-server-create-group": "Створіть групу безпеки", + "manual-server-description": "Тут описано, як встановити Outline на Linux-сервері {cloudProvider}.", + "manual-server-firewall": "Налаштуйте брандмауер", + "manual-server-install-paste": "Вставте тут вихідні дані сценарію встановлення.", + "manual-server-install-run": "Увійдіть на свій сервер і виконайте цю команду.", + "manual-server-instructions": "Вказівки", + "manual-server-show-me": "Показати місцезнаходження", + "manual-server-title": "Виконайте наведені нижче інструкції", + "metrics-description": "Поділіться анонімними показниками, щоб допомогти нам покращити надійність та ефективність Outline для вас і тих, кому ви надаєте доступ до свого сервера. {openLink}Докладніше.{closeLink}", + "metrics-share": "Поділитися показниками", + "metrics-skip": "Пропустити", + "metrics-title": "Доступ до показників", + "nav-about": "Про додаток", + "nav-data-collection": "Збір даних", + "nav-feedback": "Відгук", + "nav-help": "Довідка", + "nav-licenses": "Ліцензії", + "nav-privacy": "Конфіденційність", + "nav-terms": "Умови", + "no-data-limit": "Немає", + "notification-app-update": "Завантажено оновлену версію Диспетчера Outline. Її буде встановлено, коли ви перезапустите додаток.", + "notification-feedback-thanks": "Дякуємо, що допомагаєте нам ставати кращими. Ми цінуємо ваш відгук.", + "notification-key-added": "Ключ додано", + "notification-key-removed": "Ключ вилучено", + "notification-server-destroyed": "Сервер видалено", + "notification-server-exists": "Сервер уже додано", + "notification-server-removed": "Сервер вилучено", + "oauth-account-active": "Ваш обліковий запис DigitalOcean активовано.", + "oauth-account-active-tag": "Обліковий запис активовано. Завантаження місцезнаходжень серверів…", + "oauth-activate-account": "Активуйте свій обліковий запис DigitalOcean.", + "oauth-billing": "Введіть свою платіжну інформацію на сайті digitalocean.com, а потім поверніться в цей додаток.", + "oauth-billing-tag": "Введіть платіжну інформацію…", + "oauth-connect-description": "Outline допоможе легко створити сервер і підключитися до нього, використовуючи ваш обліковий запис.", + "oauth-connect-tag": "Очікування підключення облікового запису…", + "oauth-connect-title": "Увійдіть або створіть обліковий запис DigitalOcean.", + "oauth-sign-out": "Вийти", + "oauth-verify": "Знайдіть лист від DigitalOcean у своїй папці \"Вхідні\" та натисніть посилання в ньому, щоб підтвердити свій обліковий запис.", + "oauth-verify-tag": "Підтвердьте свою електронну адресу…", + "okay": "ОК", + "per-key-data-limit-dialog-set-custom": "Установити спеціальне обмеження трафіку", + "per-key-data-limit-dialog-title": "Обмеження обсягу даних – {keyName}", + "region-best-value": "Найкраща ціна", + "region-description": "Ви використовуватимете цей сервер для доступу до Інтернету.", + "region-setup": "Налаштувати Outline", + "region-title": "Виберіть місцезнаходження свого сервера.", + "remove": "Вилучити", + "retry": "Повторити спробу", + "save": "Зберегти", + "saved": "Збережено", + "saving": "Зберігання…", + "server-access": "Доступ до сервера", + "server-access-key-new": "Додати новий ключ", + "server-access-key-rename": "Перейменувати", + "server-access-keys": "Ключі доступу", + "server-connections": "Підключення", + "server-data-transfer": "Перенесено даних за 30 днів", + "server-data-used": "Використано ліміту за 30 днів", + "server-destroy": "Видалити сервер", + "server-help-access-key-description": "Поділіться ключами доступу з друзями, щоб вони могли підключатися до вашого сервера Outline. Вони можуть використовувати один ключ доступу на всіх своїх пристроях.", + "server-help-access-key-next": "Далі", + "server-help-access-key-title": "Створіть ключі та надайте доступ", + "server-help-connection-description": "Натисніть тут, щоб встановити клієнтський додаток Outline, використовуючи особистий ключ доступу до свого сервера Outline.", + "server-help-connection-ok": "Зрозуміло", + "server-help-connection-title": "Ви ще не підключилися до сервера", + "server-keys": "Ключі", + "server-my-access-key": "Мій ключ доступу", + "server-name": "Сервер Outline {serverLocation}", + "server-remove": "Вилучити сервер", + "server-settings": "Налаштування", + "server-unreachable": "Не вдалося зв'язатися із сервером", + "server-unreachable-description": "Виникли проблеми з підключенням до цього сервера.", + "server-unreachable-managed-description": "Повторіть спробу або вилучіть цей сервер із додатка.", + "server-unreachable-manual-description": "Повторіть спробу або видаліть цей сервер і віртуальний хост.", + "server-usage": "Використано (за останні 30 днів)", + "servers-add": "Додати сервер", + "servers-digitalocean": "Сервери DigitalOcean", + "servers-gcp": "Сервери Google Cloud Platform", + "servers-manual": "Сервери", + "settings-access-key-port": "Порт для нових ключів доступу", + "settings-metrics-header": "Поділіться анонімними показниками", + "settings-server-api-url": "URL-адреса API керування", + "settings-server-cost": "Вартість на місяць", + "settings-server-creation": "Створено", + "settings-server-hostname": "Ім'я хосту", + "settings-server-id": "Ідентифікатор сервера", + "settings-server-info": "Відомості про сервер", + "settings-server-location": "Місцезнаходження сервера", + "settings-server-name": "Назва", + "settings-server-rename": "Укажіть нову назву для свого сервера. Зверніть увагу: користувачі, яких ви запросили підключитися до нього, не побачать цю назву на своїх пристроях.", + "settings-server-version": "Версія сервера", + "settings-transfer-limit": "Ліміт трафіку", + "setup-action": "Налаштувати", + "setup-advanced": "Додатково", + "setup-anywhere": "Налаштуйте Outline будь-де", + "setup-cancel": "Ви можете будь-коли скасувати налаштування", + "setup-create": "Створити сервер", + "setup-description": "Немає сервера? Створіть обліковий запис DigitalOcean.", + "setup-do-cost": "Лише за 6 $ на міс.", + "setup-do-create": "Створіть новий сервер, використовуючи свій обліковий запис DigitalOcean, і отримайте додатково 1 TБ трафіку на 30 днів за 6 $.", + "setup-do-data": "Ліміт трафіку 1 TB", + "setup-do-description": "Це може зайняти кілька хвилин. Ви можете будь-коли видалити цей сервер.", + "setup-do-easiest": "Найпростіша процедура налаштування", + "setup-do-title": "Налаштування Outline.", + "setup-firewall-instructions": "Вказівки щодо брандмауера", + "setup-gcp-create": "Створіть новий сервер за допомогою свого облікового запису Google. Вартість залежить від місцезнаходження та способу використання.", + "setup-gcp-easy": "Просте налаштування", + "setup-gcp-free-tier": "З {openLinkFreeTier}безкоштовним планом{closeLink} ціна на перший сервер становить від {openLinkIpPrice}3 дол. США на місяць{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Перші 90 днів безкоштовно{closeLink} для нових користувачів", + "setup-gcp-promo": "Спробуйте новий автоматичний процес створення серверів Outline для Google Cloud", + "setup-recommended": "Рекомендовано", + "setup-simple-commands": "Прості команди для встановлення", + "setup-step-by-step": "Покроковий посібник із встановлення", + "setup-tested": "Перевірено для VULTR, Linode і Liquid Web", + "setup-title": "Виберіть хмарний сервіс, щоб налаштувати Outline.", + "share-description": "Скопіюйте це запрошення та надішліть, використовуючи свій улюблений засіб зв'язку. {openLink}Потрібна довідка?{closeLink}", + "share-invite-access-key-copied": "Ключ доступу скопійовано в буфер обміну", + "share-invite-copied": "Запрошення скопійовано в буфер обміну", + "share-invite-copy": "Копіювати запрошення", + "share-invite-copy-access-key": "Копіювати ключ доступу", + "share-invite-html": "Використовуйте цей сервер, щоб безпечно користуватися відкритим Інтернетом. Для цього:

1) Завантажте та встановіть додаток Outline для свого пристрою.

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Android (альтернативне посилання): https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Ви отримаєте ключ доступу, який починається з ss://. Скопіюйте цей ключ.

3) Відкрийте додаток Клієнт Outline. Якщо ключ доступу буде виявлено автоматично, натисніть Connect (Підключити). Якщо ключ доступу не виявлено, вставте його в поле й натисніть Connect (Підключити).

Ви готові користуватися відкритим Інтернетом! Щоб переконатися, що ви під’єдналися до сервера, введіть у Пошуку Google запит \"яка в мене IP-адреса\". IP-адреса, що показується в Google, має відповідати IP-адресі в Клієнті Outline.

Докладніше про Outline: https://getoutline.org/", + "share-invite-instructions": "Виконайте вказівки із запрошення на сайті GitHub:", + "share-invite-trouble": "Не можете відкрити посилання в запрошенні?", + "share-title": "Надати доступ", + "survey-data-limits-title": "Допоможіть нам удосконалити функцію обмеження обсягу даних", + "survey-decline": "Відхилити", + "survey-disclaimer": "Продовживши, ви перейдете до короткого опитування в Google Формах. Опитування рекомендується проходити, підключившись до Outline.", + "survey-go-to-survey": "Перейти до опитування", + "terms-of-service": "Я знаю та розумію {openLink}Умови використання Outline{closeLink}" +} diff --git a/server_manager/messages/ur.json b/server_manager/messages/ur.json new file mode 100644 index 0000000000..d34a04ff74 --- /dev/null +++ b/server_manager/messages/ur.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline ایک اوپن سورس پروجیکٹ ہے جو Jigsaw کی جانب سے خبر رساں اداروں اور صحافیوں کو انٹرنیٹ پر محفوظ رسائی دینے کیلئے بنایا گیا ہے۔

Outline کو Shadowsocks کی جانب سے طاقت مہیا کی جاتی ہے اور ابھی یہ اپنی تکمیل کے ابتدائی مراحل میں ہے۔ آپ GitHub پر کوڈ میں تعاون کر سکتے ہیں، اور یہ جاننے کیلئے کہ ہم کب مزید پلیٹ فارمز شامل کریں گے اور نئی خصوصیات شامل کریں گے، Reddit اور Medium پر ہماری پیروی بھی کر سکتے ہیں۔", + "about-version": "ورژن {version}", + "aws-lightsail-firewall-0": "{openLink}Amazon Lightsail{closeLink} نمونوں کی اسکرین میں نیویگیٹ کریں۔", + "aws-lightsail-firewall-1": "اس نمونے پر کلک کریں جس پر آپ Outline کی میزبانی کرنا چاہتے ہیں۔", + "aws-lightsail-firewall-2": "نیٹ ورکنگ ('Networking') ٹیب پر نیویگیٹ کریں۔", + "aws-lightsail-firewall-3": "فائروال ('Firewall') سیکشن میں، دوسرا شامل کریں ('Add another') پر کلک کریں۔", + "aws-lightsail-firewall-4": "'All TCP+UDP' میں ایپلیکیشن ('Application') کی قدر سیٹ کریں۔", + "aws-lightsail-firewall-5": "'محفوظ کریں' (SAVE) پر کلک کریں۔", + "cancel": "منسوخ کریں", + "close": "بند کریں", + "confirmation-server-destroy": "موجودہ صارفین رسائی سے محروم ہو جائیں گے۔ اس کارروائی کو کالعدم نہیں کیا جا سکتا۔", + "confirmation-server-destroy-title": "سرور کو حذف کریں؟", + "confirmation-server-remove": "یہ عمل آپ کے سرور کو Outline مینیجر سے ہٹاتا ہے، لیکن صارفین کے لیے پراکسی رسائی کو مسدود نہیں کرتا۔ آپ کو ابھی بھی اپنی میزبان مشین سے Outline سرور کو دستی طور پر حذف کرنے کی ضرورت ہوگی۔", + "confirmation-server-remove-title": "سرور ہٹائیں؟", + "data-limit": "ڈیٹا کی حد", + "data-limit-per-key": "فی کلید ڈیٹا کی حد", + "data-limits": "ڈیٹا کی حدود", + "data-limits-description": "اس سرور پر رسائی کی کلید کے لیے 30 دن کی ٹریلنگ ڈیٹا ٹرانسفر کی حد مقرر کریں۔", + "data-limits-dialog-text": "اس سروس پر رسائی کی کلید کی ڈیٹا ٹرانسفر کی حد مقرر کرنے کے لیے ترتیبات کے ٹیب میں جائیں۔", + "data-limits-dialog-title": "ڈیٹا کی حد سے تجاوز کرنے سے گریز کریں", + "data-limits-disclaimer": "چونکہ آپ فی الحال میٹرکس کی اطلاع دے رہے ہیں، اس لئے ڈیٹا کی حدود خصوصیت کا استعمال شامل کیا جائے گا۔ مزید تفصیلات کے لیے براہ کرم {openLink}ڈیٹا کی جمع آوری کی پالیسی{closeLink} دیکھیں۔", + "data-limits-usage": "{total} میں سے {used} استعمال کیا گیا", + "destroy": "حذف کریں", + "digitalocean-disconnect-account": "DigitalOcean اکاؤنٹ غیر منسلک کریں", + "digitalocean-unreachable": "یہ خرابی آپ کے نیٹ ورک پر فائروال یا digitalocean.com کے ساتھ عارضی کنیکٹوٹی کے مسائل کی وجہ سے ہوسکتی ہے۔", + "disabled": "غیر فعال ہے", + "disconnect": "غیر منسلک کریں", + "done": "ہو گیا", + "enabled": "فعال ہے", + "error-connectivity": "ہمیں آپ کے DigitalOcean اکاؤنٹ سے منسلک ہونے میں دشواری پیش آ رہی ہے۔ کبھی کبھی یہ DigitalOcean یا آپ کے انٹرنیٹ کنکشن کے ساتھ عارضی پریشانی ہوتی ہے۔ اگر دوبارہ کوشش کرنا کام نہیں کرتا ہے، تو DigitalOcean میں دوبارہ لاگ ان ہونے سے پریشانی درست ہونی چاہیے۔", + "error-connectivity-title": "کنکشن میں دشواری", + "error-do-account-info": "DigitalOcean اکاؤنٹ کی معلومات حاصل کرنے میں ناکام", + "error-do-auth": "DigitalOcean کے ساتھ تصدیق کرنے میں ناکام", + "error-do-limit": "آپ کا DigitalOcean اکاؤنٹ اپنے {num} Droplets کی حد کو پہنچ گیا ہے۔ آپ https://cloud.digitalocean.com/account/team/droplet_limit_increase پر اضافے کی درخواست کر سکتے ہیں", + "error-do-regions": "دستیاب علاقوں کی فہرست حاصل کرنے میں ناکام", + "error-do-warning": "DigitalOcean وارننگ: \"{message}\"", + "error-feedback": "تاثرات جمع کرنے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔", + "error-gcp-auth": "Google Cloud Platform کے ساتھ توثیق ناکام ہو گئی", + "error-hostname-invalid": "IP پتہ یا درست میزبان کا نام ہونا چاہیے۔", + "error-key-add": "کلید شامل کرنے میں ناکام", + "error-key-remove": "کلید ہٹانے میں ناکام", + "error-key-rename": "کلید کا نام تبدیل کرنے میں ناکام", + "error-keys-get": "کلیدیں لوڈ نہیں ہو سکیں", + "error-keys-port-bad-input": "پورٹ لازمی طور پر 1 اور 65،535 کے درمیان ایک عدد صحیح ہونا چاہیے۔", + "error-keys-port-in-use": "پورٹ سرور پر پہلے ہی استعمال میں ہے۔", + "error-licenses": "لائسنسز لوڈ نہیں کیے جا سکے۔", + "error-metrics": "میٹرکس کی ترتیبات کو فعال کرنے میں خرابی", + "error-network": "ایک نیٹ ورک کی خرابی پیش آ گئی۔", + "error-not-saved": "محفوظ نہیں کیا گیا", + "error-remove-data-limit": "ڈیفالٹ ڈیٹا کی حد کو غیر فعال نہیں کیا جا سکا", + "error-remove-per-key-limit": "رسائی کی اس کلید سے ڈیٹا کی حد کو ہٹایا نہیں جا سکا", + "error-server-creation": "آپ کا Outline سرور تخلیق کرنے میں ایک خرابی پیش آ گئی۔", + "error-server-destroy": "سرور حذف کرنے میں ناکام", + "error-server-removed": "آپ کے DigitalOcean اکاؤنٹ میں {serverName} اب مزید موجود نہیں ہے۔", + "error-server-rename": "سرور کا نام تبدیل کرنے میں ناکام", + "error-server-unreachable": "آپ کا Outline سرور درست طریقے سے انسٹال ہوا تھا، لیکن ہم اس سے منسلک نہیں ہو پا رہے ہیں۔ قوی امکان یہ ہے کہ آپ کے سرور کے فائر وال اصول آنے والے کنکشنز کو مسدود کر رہے ہیں۔ 1024 سے 65535 تک کے رینج والے پورٹس پر آنے والے TCP کنکشنز کی اجازت کا براہ کرم جائزہ لیں اور یقینی بنائیں۔", + "error-server-unreachable-title": "آپ کے آؤٹ لائن سرور سے منسلک ہونے سے قاصر ہے", + "error-servers-removed": "آپ کے DigitalOcean اکاؤنٹ میں {serverNames} اب مزید موجود نہیں ہے۔", + "error-set-data-limit": "ڈیفالٹ ڈیٹا کی حد کو سیٹ نہیں کیا جا سکا", + "error-set-per-key-limit": "رسائی کی اس کلید کیلئے ڈیٹا کی حد سیٹ نہیں کر سکا", + "error-unexpected": "ایک غیر متوقع خرابی پیش آ گئی۔", + "experimental": "تجرباتی", + "experiments": "تجربات", + "experiments-description": "نئی خصوصیات کی جانچ کریں اور ان کے ریلیز ہونے سے قبل تاثرات کے ساتھ ہمیں فراہم کریں۔", + "experiments-disclaimer": "تجربات ترقی میں ہیں اور ممکن ہے کہ تبدیل ہو جائیں یا ایپ سے ہٹا دیے جائیں۔ اگر آپ فی الحال میٹرک کی اطلاع دے رہے ہیں تو، تجرباتی خصوصیات کا استعمال شامل کیا جائے گا۔ مزید تفصیلات کے لیے براہ کرم {openLink}ڈیٹا کی جمع آوری کی پالیسی{closeLink} دیکھیں۔", + "experiments-feedback": "کیا آپ کے پاس تجاویز ہیں؟ {openLink}تاثرات یہاں جمع کرائیں۔{closeLink}", + "feedback-cloud-provider": "کلاؤڈ فراہم کنندہ منتخب کریں", + "feedback-cloud-provider-error": "براہ کرم کلاؤڈ فراہم کنندہ منتخب کریں۔", + "feedback-connection": "میرے سرور سے منسلک نہیں ہو رہا", + "feedback-connection-others": "دوسرے میرے سرور سے منسلک نہیں ہو سکتے ہیں", + "feedback-disclaimer": "براہ کرم نوٹ فرمالیں کہ ہماری ٹیم صرف انگریزی میں جوابی تاثرات فراہم کر سکتی ہے۔", + "feedback-email": "ای میل پتہ (اختیاری)", + "feedback-error": "براہ کرم تاثرات درج کریں۔", + "feedback-explanation-install": "آپ کے سرور پر Outline انسٹال کرنے کی کوشش کے دوران ایک خرابی پیش آ گئی۔ اگر آپ کوئی حل تلاش نہیں کر پاتے ہیں، تو براہ کرم ہمیں تاثرات بھیجنے اور اپنا ای میل پتہ (اختیاری) بتانے پر غور کریں تاکہ ہم آپ سے دوبارہ رابطہ کر سکیں۔", + "feedback-general": "عمومی تاثرات", + "feedback-install": "Outline کو انسٹال کرنے میں دشواری پیش آ رہی ہے", + "feedback-label": "آپ کے تاثرات", + "feedback-management": "میرے سرور کا نظم کرنے میں دشواری پیش آ رہی ہے", + "feedback-other": "دیگر", + "feedback-privacy": "آپ کے تاثرات، ای میل پتہ (اگر فراہم کیا گیا ہو) اور {openLink}رازداری کی پالیسی{closeLink} میں حوالہ کردہ اضافی معلومات Outline ٹیم کو بھیجی جائے گی۔", + "feedback-submit": "جمع کرائیں", + "feedback-suggestion": "تجاویز", + "feedback-title-generic": "تاثرات بھیجیں", + "feedback-title-install": "Outline سرور انسٹال کرنے میں ناکام", + "gcp-billing-action": "آگے", + "gcp-billing-body": "آپ کے {openLink}Google کلاؤڈ پر بلنگ اکاؤنٹ شامل{closeLink} کرنے کے منتظر ہیں", + "gcp-billing-description": "آگے بڑھنے کے لیے {openLink}Cloud Console کا بلنگ صفحہ کھولیں{closeLink} ایک اکاؤنٹ شامل کریں۔", + "gcp-billing-error": "بلنگ کی معلومات بازیافت کرنے سے قاصر", + "gcp-billing-error-zero": "آگے بڑھنے سے پہلے آپ کو ایک بلنگ اکاؤنٹ شامل کرنا ہوگا۔", + "gcp-click-create": "'تخلیق کریں (Create)' پر کلک کریں۔", + "gcp-create-new-project": "{openLink}ایک نیا Google کلاؤڈ پروجیکٹ تخلیق کریں{closeLink}۔", + "gcp-create-new-vm": "{openLink}ایک نیا VM نمونہ تخلیق کریں{closeLink}۔", + "gcp-create-project": "Google کلاؤڈ پروجیکٹ تخلیق کریں", + "gcp-create-server": "اپنا Google Cloud پروجیکٹ تخلیق کریں", + "gcp-create-vm": "ایک VM نمونہ تخلیق کریں", + "gcp-disconnect-account": "Google Cloud Platform اکاؤنٹ غیر منسلک کریں", + "gcp-firewall-create-0": "اپنے Compute Engine پروجیکٹ میں {openLink}ایک نیا فائر وال اصول شامل کریں{closeLink}۔", + "gcp-firewall-create-1": "'نام Name' فیلڈ میں 'Outline' ٹائپ کریں۔", + "gcp-firewall-create-2": "'Target tags ہدف ٹیگز' فیلڈ میں 'Outline' ٹائپ کریں۔", + "gcp-firewall-create-3": "'سورس IP رینجز Source IP ranges' فیلڈ میں '0.0.0.0/0' ٹائپ کریں۔", + "gcp-firewall-create-4": "'پروٹوکولز اور پورٹس Protocols and ports' کے اندر 'سبھی اجازت Allow all' منتخب کریں۔", + "gcp-name-your-project": "پرو جیکٹ کے نام ('Project name') کے فیلڈ میں اپنے پروجیکٹ کو نام دیں۔", + "gcp-project-setup-error": "اپنا Google Cloud پروجیکٹ سیٹ اپ کرنے کے دوران ایک خرابی پیش آ گئی", + "gcp-select-machine-type": "مشین کی قسم ('Machine type') کے تحت 'f1-micro' منتخب کریں", + "gcp-select-networking": "'مینیجمنٹ (Management)، سیکیورٹی (security)، ڈسکس (disks)، نیٹ ورکنگ (networking)، سول ٹیننسی (sole tenancy)'، پھر نیٹ ورکنگ 'Networking' پرکلک کریں", + "gcp-select-region": "علاقہ ('Region') کے تحت قریب کا ایک علاقہ منتخب کریں جہاں سرور کے صارفین ہوں گے۔", + "gcp-type-network-tag": "'نیٹ ورک ٹیگز Network tags' فیلڈ میں 'Outline' ٹائپ کریں", + "gcp-type-outline-server": "'نام' (Name) فیلڈ میں 'outline-server' ٹائپ کریں۔", + "geo-amsterdam": "ایمسٹرڈم", + "geo-bangalore": "بنگلور", + "geo-changhua-county": "جنگوا کاؤنٹی", + "geo-delhi": "دہلی", + "geo-eemshaven": "امشوان", + "geo-frankfurt": "فرینکفرٹ", + "geo-hamina": "حمینہ", + "geo-hk": "ہانگ کانگ", + "geo-iowa": "آئیووا", + "geo-jakarta": "جکارتہ", + "geo-jurong-west": "جورونگ ویسٹ", + "geo-las-vegas": "لاس ویگاس", + "geo-london": "لندن", + "geo-los-angeles": "لاس اینجلس", + "geo-melbourne": "ملبورن", + "geo-montreal": "مونٹریال", + "geo-mumbai": "ممبئی", + "geo-new-york-city": "نیو یارک", + "geo-northern-virginia": "شمالی ورجینیا", + "geo-oregon": "اوریگون", + "geo-osaka": "اوساکا", + "geo-salt-lake-city": "سالٹ لیک سٹی", + "geo-san-francisco": "سان فرانسسکو", + "geo-sao-paulo": "ساؤ پالو", + "geo-seoul": "سیؤل", + "geo-sg": "سنگاپور", + "geo-south-carolina": "جنوبی کیرولینا", + "geo-st-ghislain": "سینٹ گیزلن", + "geo-sydney": "سڈنی", + "geo-tokyo": "ٹوکیو", + "geo-toronto": "ٹورنٹو", + "geo-warsaw": "وارسا", + "geo-zurich": "زیورخ", + "key": "کلید {keyId}", + "manual-server-assign-firewall": "فائروال اصول تفویض کریں", + "manual-server-assign-group": "سیکیورٹی گروپ تفویض کریں", + "manual-server-create-firewall": "فائروال اصول تخلیق کریں", + "manual-server-create-group": "سیکیورٹی گروپ تخلیق کریں", + "manual-server-description": "یہ اقدامات آپ کو {cloudProvider} Linux سرور پر Outline انسٹال کرنے میں مدد کریں گے۔", + "manual-server-firewall": "اپنے فائروال کو ترتیب دیں", + "manual-server-install-paste": "اپنا انسٹالیشن آؤٹ پٹ یہاں پیسٹ کریں۔", + "manual-server-install-run": "اپنے سرور میں لاگ ان کریں، اور اس ہدایت کو چلائیں۔", + "manual-server-instructions": "ہدایات", + "manual-server-show-me": "کہاں ہے مجھے دکھائیں", + "manual-server-title": "درج ذیل ہدایات کی پیروی کریں", + "metrics-description": "اپنے لیے اور ان لوگوں کے لیے جن کے ساتھ آپ اپنے سرور کا اشتراک کرتے ہیں، Outline کو قابل اعتبار اور کارکردگی کو بہتر بنانے میں مدد کے لیے گمنام میٹرکس کا اشتراک کریں۔ {openLink}مزید جانیں۔{closeLink}", + "metrics-share": "میٹرکس کا اشتراک کریں", + "metrics-skip": "نظر انداز کریں", + "metrics-title": "میٹرکس کا اشتراک", + "nav-about": "تفصیل", + "nav-data-collection": "ڈیٹا کا مجموعہ", + "nav-feedback": "تاثرات", + "nav-help": "مدد", + "nav-licenses": "لائسنسز", + "nav-privacy": "رازداری", + "nav-terms": "شرائط", + "no-data-limit": "کوئی نہیں", + "notification-app-update": "Outline مینیجر کا اپ ڈیٹ کردہ ورژن ڈاؤن لوڈ کیا جا چکا ہے۔ جب آپ ایپلیکیشن کو ری سٹارٹ کریں گے تو یہ انسٹال ہو جائے گا۔", + "notification-feedback-thanks": "بہتر بنانے میں مدد کرنے کا شکریہ! آپ کی رائے جان کر ہمیں خوشی ہوتی ہے۔", + "notification-key-added": "کلید شامل کی گئی", + "notification-key-removed": "کلید ہٹائی گئی", + "notification-server-destroyed": "سرور حذف ہو گیا", + "notification-server-exists": "سرور پہلے سے ہی شامل ہے", + "notification-server-removed": "سرور ہٹایا گیا", + "oauth-account-active": "آپ کا DigitalOcean اکاؤنٹ فعال کیا جا چکا ہے۔", + "oauth-account-active-tag": "اکاوٴنٹ فعال ہو گیا! سرور کے مقامات لوڈ ہو رہے ہیں...", + "oauth-activate-account": "اپنا DigitalOcean اکاؤنٹ فعال کریں۔", + "oauth-billing": "digitalocean.com پر اپنی بلنگ کی معلومات درج کریں اور کام ختم ہو جانے کے بعد ایپ پر واپس آجائیں۔", + "oauth-billing-tag": "بلنگ کی معلومات درج کریں...", + "oauth-connect-description": "آپ کے اکاؤنٹ کے ساتھ، Outline سرور تخلیق کرنے اور منسلک ہونے کو آسان بناتا ہے۔", + "oauth-connect-tag": "آپ کے اکاؤنٹ سے منسلک ہونے کا انتظار کر رہا ہے...", + "oauth-connect-title": "سائن ان کریں یا DigitalOcean کے ساتھ ایک اکاؤنٹ تخلیق کریں۔", + "oauth-sign-out": "سائن آؤٹ کریں", + "oauth-verify": "اپنے اکاؤنٹ کی تصدیق کے لیے اپنے ان باکس میں DigitalOcean کی ای میل چیک کریں، اور اس میں موجود لنک پر کلک کریں۔", + "oauth-verify-tag": "اپنی ای میل تصدیق کریں...", + "okay": "ٹھیک ہے", + "per-key-data-limit-dialog-set-custom": "حسب ضرورت ڈیٹا کی حد سیٹ کریں", + "per-key-data-limit-dialog-title": "ڈیٹا کی حد - {keyName}", + "region-best-value": "بہترین قدر", + "region-description": "یہ وہ جگہ ہے جہاں سے آپ کے انٹرنیٹ کا تجربہ آتا ہے۔", + "region-setup": "Outline سیٹ اپ کریں", + "region-title": "اپنے سرور کا مقام منتخب کریں۔", + "remove": "ہٹائیں", + "retry": "دوبارہ کوشش کریں", + "save": "محفوظ کریں", + "saved": "محفوظ کر دیا گیا", + "saving": "محفوظ ہو رہا ہے...", + "server-access": "سرور تک رسائی", + "server-access-key-new": "نئی کلید شامل کریں", + "server-access-key-rename": "دوبارہ نام دیں", + "server-access-keys": "رسائی کی کلیدیں", + "server-connections": "کنکشنز", + "server-data-transfer": "ڈیٹا کی منتقلی / آخری 30 دن", + "server-data-used": "استعمال کردہ الاؤنس / آخری 30 دن", + "server-destroy": "سرور حذف کریں", + "server-help-access-key-description": "دوستوں کے ساتھ رسائی کی کلیدوں کا اشتراک کریں، تاکہ وہ آپ کے Outline سرور سے منسلک ہو سکیں۔ وہ اپنے سبھی آلات پر رسائی کی مماثل کلید کا استعمال کر سکتے ہیں۔", + "server-help-access-key-next": "اگلا", + "server-help-access-key-title": "کلیدیں تخلیق کریں، رسائی کا اشتراک کریں", + "server-help-connection-description": "اپنے Outline سرور پر کی ذاتی رسائی کی کلید کا استعمال کرتے ہوئے، Outline کلائنٹ ایپ کو انسٹال کرنے کے لیے یہاں کلک کریں۔", + "server-help-connection-ok": "ٹھیک ہے، سمجھ آ گئی!", + "server-help-connection-title": "آپ ابھی تک منسلک نہیں ہیں!", + "server-keys": "کلیدیں", + "server-my-access-key": "میری رسائی کی کلید", + "server-name": "Outline سرور {serverLocation}", + "server-remove": "سرور ہٹائیں", + "server-settings": "ترتیبات", + "server-unreachable": "ناقابل رسائی سرور", + "server-unreachable-description": "ہمیں اس سرور سے منسلک ہونے میں مسائل پیش آ رہے ہیں۔", + "server-unreachable-managed-description": "دوبارہ کوشش کریں یا اس سرور کو ایپلیکیشن سے ہٹائیں۔", + "server-unreachable-manual-description": "دوبارہ کوشش کریں یا اس سرور اور ورچوئل میزبان کو حذف کر دیں۔", + "server-usage": "استعمال (آخری 30 دن)", + "servers-add": "سرور شامل کریں", + "servers-digitalocean": "DigitalOcean سرورز", + "servers-gcp": "Google Cloud Platform کے سرورز", + "servers-manual": "سرورز", + "settings-access-key-port": "رسائی کی نئی کلیدوں کے لیے پورٹ کریں", + "settings-metrics-header": "گمنام میٹرکس کا اشتراک کریں", + "settings-server-api-url": "API URL مینیجمنٹ", + "settings-server-cost": "ماہانہ قیمت", + "settings-server-creation": "تخلیق کردہ", + "settings-server-hostname": "میزبان کا نام", + "settings-server-id": "سرور ID", + "settings-server-info": "سرور کی معلومات", + "settings-server-location": "سرور کا مقام", + "settings-server-name": "نام", + "settings-server-rename": "اپنے سرور کے لیے ایک نیا نام ترتیب دیں۔ نوٹ کریں کہ یہ ان صارفین کے آلات پر ظاہر نہیں ہوگا جن کو آپ نے اس سے منسلک ہونے کے لیے مدعو کیا تھا۔", + "settings-server-version": "سرور کا ورژن", + "settings-transfer-limit": "ڈیٹا ٹرانسفر کا الاؤنس", + "setup-action": "سیٹ اپ کریں", + "setup-advanced": "جدید ترین", + "setup-anywhere": "Outline کہیں بھی سیٹ اپ کریں", + "setup-cancel": "کسی بھی وقت منسوخ کریں", + "setup-create": "سرور تخلیق کریں", + "setup-description": "سرور نہیں ہے؟ DigitalOcean کے ساتھ ایک اکاؤنٹ تخلیق کریں۔", + "setup-do-cost": "صرف امریکی ‎$6 ماہانہ", + "setup-do-create": "1 TB ڈیٹا کی منتقلی کے لیے ہر 30 دن میں اضافی امریکی ‎$6 دے کر اپنے DigitalOcean اکاؤنٹ کے ساتھ ایک نیا سرور تخلیق کریں۔", + "setup-do-data": "1 TB ڈیٹا کی منتقلی کا الاؤنس", + "setup-do-description": "اس میں کئی منٹ لگ سکتے ہیں۔ آپ کسی بھی وقت اس سرور کو حذف کر سکتے ہیں۔", + "setup-do-easiest": "سیٹ اپ کرنے کی سب سے آسان کارروائی", + "setup-do-title": "Outline کو سیٹ اپ کیا جا رہا ہے۔", + "setup-firewall-instructions": "فائر وال کی ہدایات", + "setup-gcp-create": "اپنے Google اکاؤنٹ کے ساتھ ایک نیا سرور تخلیق کریں۔ مقام اور استعمال کے لحاظ سے قیمتیں مختلف ہو سکتی ہیں۔", + "setup-gcp-easy": "سیٹ اپ کرنے کی آسان کارروائی", + "setup-gcp-free-tier": "{openLinkFreeTier}فری ٹیئر{closeLink} کے ساتھ، آپ کا پہلا سرور {openLinkIpPrice}3 امریکی ڈالر فی ماہ{closeLink} سے شروع ہوتا ہے", + "setup-gcp-free-trial": "{openLinkFreeTrial}نئے صارفین کیلئے 90 دن کا مفت ٹرائل{closeLink}", + "setup-gcp-promo": "Google کلاؤڈ کے لیے خودکار طور پر آؤٹ لائن سرور تخلیق کرنے کی نئی کارروائی آزمائیں", + "setup-recommended": "تجویز کردہ", + "setup-simple-commands": "ہدایات کو آسانی سے انسٹال کریں", + "setup-step-by-step": "مرحلہ در مرحلہ سیٹ اپ گائیڈ", + "setup-tested": "VULTR، Linode اور Liquid ویب پر ٹیسٹ کردہ", + "setup-title": "Outline سیٹ اپ کرنے کے لیے کلاؤڈ سروس منتخب کریں۔", + "share-description": "اس دعوت نامے کو کاپی کریں اور اسے مواصلت کے اس ٹول سے بھیجیں جس پر آپ بھروسہ کرتے ہیں۔ {openLink}مدد کی ضرورت ہے؟{closeLink}", + "share-invite-access-key-copied": "رسائی کی کلید کو کلپ بورڈ پر کاپی کیا گیا", + "share-invite-copied": "دعوت نامے کو کلپ بورڈ پر کاپی کیا گیا", + "share-invite-copy": "دعوت نامہ کاپی کریں", + "share-invite-copy-access-key": "رسائی کی کلید کو کاپی کریں", + "share-invite-html": "اوپن انٹرنیٹ تک محفوظ طریقے سے رسائی کے لیے اس سرور کا استعمال کریں:

1) اپنے آلے کے لیے Outline ایپ ڈاؤن لوڈ اور انسٹال کریں:

- iOS: https://itunes.apple.com/app/outline-app/id1356177741
- MacOS: https://itunes.apple.com/app/outline-app/id1356178125
- Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android: https://play.google.com/store/apps/details?id=org.outline.android.client
- Android alternative link: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) آپ کو ss سے شروع ہونے والی ایک رسائی کلید ملے گی://۔ اسے موصول ہونے کے بعد یہ رسائی کلید کاپی کریں۔

3)Outline کلائنٹ ایپ کھولیں ۔ اگر آپ کی رسائی کلید کا خودکار طور پر پتا چل جاتا ہے تو \"Connect\" کو تھپتھپائیں اور آگے بڑھیں۔ اگر آپ کی رسائی کلید کا خودکار طور پر پتا نہیں چلتا ہے تو اسے فیلڈ میں پیسٹ کریں، پھر \"Connect\" پر تھپتھپائیں اور آگے بڑھیں۔

آپ اوپن انٹرنیٹ استعمال کرنے کے لیے تیار ہیں! یہ یقینی بنانے کے لیے کہ آپ سرور سے کامیابی کے ساتھ منسلک ہو گئے ہیں،Google تلاش پر \"میرا ip کیا ہے\" تلاش کرنے کی کوشش کریں۔ Google میں دکھایا گیا IP پتہ Outline کلائنٹ کے IP پتےسے مماثل ہونا چاہیے۔

Outline کے بارے میں یہاں مزید جانیں: https://getoutline.org/", + "share-invite-instructions": "GitHub پر ہماری دعوت کی ہدایات کی پیروی کریں:", + "share-invite-trouble": "دعوت کے لنک تک رسائی حاصل کرنے میں دشواری پیش آ رہی ہے؟", + "share-title": "رسائی کا اشتراک کریں", + "survey-data-limits-title": "ڈیٹا کی حدود کو بہتر بنانے کے طریقے کو سمجھنے میں ہماری مدد کریں", + "survey-decline": "مسترد کریں", + "survey-disclaimer": "'جاری رکھیں' پر کلک کر کے، آپ Google Forms پر ایک مختصر سروے کو بھیجیں گے۔ ہم اس بات کی تجویز کرتے ہیں کہ Outline سے منسلک ہونے پر سروے کو پورا کریں۔", + "survey-go-to-survey": "سروے پر جائيں", + "terms-of-service": "میں نے {openLink}Outline سروس کی شرائط{closeLink} کو پڑھ اور سمجھ لیا ہے" +} diff --git a/server_manager/messages/vi.json b/server_manager/messages/vi.json new file mode 100644 index 0000000000..f9304610ab --- /dev/null +++ b/server_manager/messages/vi.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline là một dự án nguồn mở do Jigsaw tạo ra nhằm mang đến một phương thức truy cập Internet an toàn hơn cho các cơ quan báo chí và nhà báo.

Outline chạy trên nền tảng Shadowsocks và vẫn là một sản phẩm ở giai đoạn đầu. Bạn có thể đóng góp mã trên GitHub và theo dõi chúng tôi trên RedditMedium để nhận tin tức khi chúng tôi mở rộng ra nhiều nền tảng khác và thêm các tính năng mới.", + "about-version": "Phiên bản {version}", + "aws-lightsail-firewall-0": "Chuyển đến màn hình phiên bản {openLink}Amazon Lightsail{closeLink}.", + "aws-lightsail-firewall-1": "Nhấp vào phiên bản mà bạn muốn lưu trữ Outline.", + "aws-lightsail-firewall-2": "Chuyển đến thẻ 'Kết nối mạng' (Networking).", + "aws-lightsail-firewall-3": "Trong phần 'Tường lửa' (Firewall), hãy nhấp vào mục 'Thêm quy tắc khác' (Add another).", + "aws-lightsail-firewall-4": "Đặt giá trị 'Ứng dụng' (Application) thành 'Tất cả TCP+UDP' (All TCP+UDP).", + "aws-lightsail-firewall-5": "Nhấp vào phần 'Lưu' (Save).", + "cancel": "Hủy", + "close": "Đóng", + "confirmation-server-destroy": "Người dùng hiện có sẽ mất quyền truy cập. Bạn không thể hủy hành động này sau khi đã thực hiện.", + "confirmation-server-destroy-title": "Hủy máy chủ?", + "confirmation-server-remove": "Hành động này sẽ xóa máy chủ của bạn khỏi ứng dụng Quản lý Outline, nhưng không chặn quyền truy cập thông qua proxy đối với người dùng. Bạn vẫn cần tự xóa máy chủ Outline khỏi máy chủ của bạn.", + "confirmation-server-remove-title": "Xóa máy chủ?", + "data-limit": "Hạn mức dữ liệu", + "data-limit-per-key": "Hạn mức dữ liệu trên mỗi khóa", + "data-limits": "Giới hạn dữ liệu", + "data-limits-description": "Đặt giới hạn chuyển dữ liệu kéo dài 30 ngày cho các khóa truy cập trên máy chủ này.", + "data-limits-dialog-text": "Chuyển đến thẻ Cài đặt để đặt giới hạn chuyển dữ liệu cho các khóa truy cập trên máy chủ này.", + "data-limits-dialog-title": "Tránh tình trạng dùng quá mức dữ liệu", + "data-limits-disclaimer": "Vì bạn hiện đang báo cáo số liệu, hãy đưa thông tin về việc sử dụng tính năng hạn mức dữ liệu vào báo cáo. Vui lòng xem {openLink}chính sách thu thập dữ liệu{closeLink} để biết thêm chi tiết.", + "data-limits-usage": "Đã dùng {used}/{total}", + "destroy": "Hủy", + "digitalocean-disconnect-account": "Hủy kết nối tài khoản DigitalOcean", + "digitalocean-unreachable": "Lỗi này có thể do tường lửa trong mạng của bạn hoặc lỗi tạm thời khi kết nối với digitalocean.com.", + "disabled": "Đã vô hiệu hóa", + "disconnect": "Ngắt kết nối", + "done": "Xong", + "enabled": "Đã kích hoạt", + "error-connectivity": "Chúng tôi đang gặp sự cố khi kết nối với tài khoản DigitalOcean của bạn. Đôi khi, đây là sự cố tạm thời đối với DigitalOcean hoặc kết nối Internet của bạn. Nếu thử lại nhưng vẫn không thành công, bạn có thể khắc phục sự cố này bằng cách đăng nhập lại vào DigitalOcean.", + "error-connectivity-title": "Sự cố kết nối", + "error-do-account-info": "Không lấy được thông tin tài khoản DigitalOcean", + "error-do-auth": "Không xác thực được bằng DigitalOcean", + "error-do-limit": "Tài khoản DigitalOcean của bạn đã dùng hết hạn mức {num} máy chủ Droplet. Bạn có thể yêu cầu tăng thêm máy chủ tại https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "Không lấy được danh sách các khu vực có thể triển khai", + "error-do-warning": "Cảnh báo của DigitalOcean: \"{message}\"", + "error-feedback": "Không gửi được phản hồi. Vui lòng thử lại.", + "error-gcp-auth": "Không xác thực được bằng Google Cloud Platform", + "error-hostname-invalid": "Phải là một địa chỉ IP hoặc tên máy chủ hợp lệ.", + "error-key-add": "Không thêm được khóa", + "error-key-remove": "Không xóa được khóa", + "error-key-rename": "Không đổi tên được khóa", + "error-keys-get": "Không thể tải khóa", + "error-keys-port-bad-input": "Cổng phải là một số nguyên nằm trong khoảng từ 1 đến 65.535.", + "error-keys-port-in-use": "Cổng này đã được sử dụng trên máy chủ.", + "error-licenses": "Không thể tải giấy phép.", + "error-metrics": "Xảy ra lỗi khi bật hoặc tắt tính năng báo cáo chỉ số của máy chủ", + "error-network": "Đã xảy ra lỗi mạng.", + "error-not-saved": "Chưa lưu", + "error-remove-data-limit": "Không thể vô hiệu hóa hạn mức dữ liệu mặc định", + "error-remove-per-key-limit": "Không thể xóa hạn mức dữ liệu khỏi khóa truy cập này", + "error-server-creation": "Xảy ra lỗi khi tạo máy chủ Outline của bạn.", + "error-server-destroy": "Không hủy được máy chủ", + "error-server-removed": "{serverName} không còn xuất hiện trong tài khoản DigitalOcean của bạn nữa.", + "error-server-rename": "Không đổi được tên máy chủ", + "error-server-unreachable": "Máy chủ Outline của bạn đã được cài đặt chính xác, nhưng không thể kết nối. Nhiều khả năng lỗi này là do quy tắc tường lửa trên máy chủ của bạn đang chặn kết nối đến. Vui lòng xem lại các quy tắc và đảm bảo cho phép kết nối TCP đến ở các cổng từ 1024 đến 65535.", + "error-server-unreachable-title": "Không thể kết nối với Máy chủ Outline của bạn", + "error-servers-removed": "{serverNames} không còn xuất hiện trong tài khoản DigitalOcean của bạn nữa.", + "error-set-data-limit": "Không thể đặt hạn mức dữ liệu mặc định", + "error-set-per-key-limit": "Không thể đặt hạn mức dữ liệu cho khóa truy cập này", + "error-unexpected": "Đã xảy ra lỗi không mong muốn.", + "experimental": "Thử nghiệm", + "experiments": "Tính năng thử nghiệm", + "experiments-description": "Thử nghiệm các tính năng mới và cung cấp cho chúng tôi ý kiến phản hồi trước khi chúng tôi phát hành các tính năng này.", + "experiments-disclaimer": "Các tính năng thử nghiệm đang trong quá trình phát triển và có thể thay đổi hoặc bị xóa khỏi ứng dụng. Nếu bạn đang báo cáo số liệu, hãy đưa thông tin về việc sử dụng các tính năng thử nghiệm vào báo cáo. Vui lòng xem {openLink}chính sách thu thập dữ liệu{closeLink} để biết thêm chi tiết.", + "experiments-feedback": "Bạn muốn đưa ra nội dung đề xuất? {openLink}Gửi ý kiến phản hồi tại đây.{closeLink}", + "feedback-cloud-provider": "Chọn nhà cung cấp dịch vụ đám mây", + "feedback-cloud-provider-error": "Hãy chọn một nhà cung cấp dịch vụ đám mây.", + "feedback-connection": "Không thể kết nối với máy chủ của tôi", + "feedback-connection-others": "Người khác không thể kết nối với máy chủ của tôi", + "feedback-disclaimer": "Xin lưu ý rằng nhóm của chúng tôi chỉ có thể trả lời phản hồi bằng tiếng Anh.", + "feedback-email": "Địa chỉ email (không bắt buộc)", + "feedback-error": "Vui lòng nhập phản hồi.", + "feedback-explanation-install": "Xảy ra lỗi trong quá trình cài đặt Outline trên máy chủ của bạn. Nếu bạn chưa tìm ra giải pháp, hãy cân nhắc việc gửi ý kiến phản hồi cho chúng tôi kèm theo địa chỉ email của bạn (không bắt buộc) để chúng tôi có thể liên hệ lại với bạn.", + "feedback-general": "Phản hồi chung", + "feedback-install": "Gặp trục trặc khi cài đặt Outline", + "feedback-label": "Phản hồi của bạn", + "feedback-management": "Gặp trục trặc khi quản lý máy chủ của tôi", + "feedback-other": "Khác", + "feedback-privacy": "Nội dung phản hồi, địa chỉ email (nếu bạn cung cấp) và các thông tin bổ sung của bạn liên quan tới {openLink}chính sách quyền riêng tư{closeLink} sẽ được gửi đến nhóm Outline.", + "feedback-submit": "Gửi", + "feedback-suggestion": "Đề xuất", + "feedback-title-generic": "Gửi ý kiến phản hồi", + "feedback-title-install": "Không cài đặt được máy chủ Outline", + "gcp-billing-action": "Tiếp theo", + "gcp-billing-body": "Đang chờ bạn {openLink}thêm một tài khoản thanh toán trên Google Cloud{closeLink}", + "gcp-billing-description": "{openLink}Mở trang thanh toán Cloud Console{closeLink} và thêm một tài khoản để tiếp tục.", + "gcp-billing-error": "Không thể lấy thông tin thanh toán", + "gcp-billing-error-zero": "Bạn phải thêm một tài khoản thanh toán trước khi tiếp tục.", + "gcp-click-create": "Nhấp vào phần \"Tạo\" (Create).", + "gcp-create-new-project": "{openLink}Tạo dự án mới trên Google Cloud{closeLink}.", + "gcp-create-new-vm": "{openLink}Tạo phiên bản máy ảo mới{closeLink}.", + "gcp-create-project": "Tạo dự án trên Google Cloud", + "gcp-create-server": "Tạo dự án của bạn trên Google Cloud", + "gcp-create-vm": "Tạo một phiên bản máy chủ", + "gcp-disconnect-account": "Ngắt kết nối tài khoản Google Cloud Platform", + "gcp-firewall-create-0": "{openLink}Thêm một quy tắc tường lửa mới{closeLink} vào dự án Compute Engine của bạn.", + "gcp-firewall-create-1": "Nhập \"outline\" vào trường \"Tên\" (Name).", + "gcp-firewall-create-2": "Nhập \"outline\" vào trường \"Thẻ đích\" (Target tags).", + "gcp-firewall-create-3": "Nhập \"0.0.0.0/0\" vào trường \"Phạm vi IP nguồn\" (Source IP ranges).", + "gcp-firewall-create-4": "Chọn phần \"Cho phép tất cả\" (Allow all) trong phần \"Giao thức và cổng\" (Protocols and ports).", + "gcp-name-your-project": "Đặt tên cho dự án của bạn trong trường 'Tên dự án' (Project name).", + "gcp-project-setup-error": "Đã xảy ra lỗi khi thiết lập dự án Google Cloud của bạn", + "gcp-select-machine-type": "Chọn 'f1-micro' trong phần 'Loại máy' (Machine type)", + "gcp-select-networking": "Nhấp vào phần 'Quản lý, bảo mật, ổ đĩa, kết nối mạng, miền thuê duy nhất' (Management, security, disks, networking, sole tenancy), sau đó chọn phần 'Kết nối mạng' (Networking)", + "gcp-select-region": "Chọn một khu vực gần vị trí của người dùng máy chủ trong phần 'Khu vực' (Region).", + "gcp-type-network-tag": "Nhập 'outline' vào trường 'Thẻ mạng' (Network tags)", + "gcp-type-outline-server": "Nhập 'outline-server' vào trường 'Tên' (Name).", + "geo-amsterdam": "Amsterdam", + "geo-bangalore": "Bangalore", + "geo-changhua-county": "Huyện Chương Hóa", + "geo-delhi": "Delhi", + "geo-eemshaven": "Eemshaven", + "geo-frankfurt": "Frankfurt", + "geo-hamina": "Hamina", + "geo-hk": "Hong Kong", + "geo-iowa": "Iowa", + "geo-jakarta": "Jakarta", + "geo-jurong-west": "Jurong West", + "geo-las-vegas": "Las Vegas", + "geo-london": "London", + "geo-los-angeles": "Los Angeles", + "geo-melbourne": "Melbourne", + "geo-montreal": "Montréal", + "geo-mumbai": "Mumbai", + "geo-new-york-city": "New York", + "geo-northern-virginia": "Bắc Virginia", + "geo-oregon": "Oregon", + "geo-osaka": "Osaka", + "geo-salt-lake-city": "Thành phố Salt Lake", + "geo-san-francisco": "San Francisco", + "geo-sao-paulo": "São Paulo", + "geo-seoul": "Seoul", + "geo-sg": "Singapore", + "geo-south-carolina": "Nam Carolina", + "geo-st-ghislain": "St. Ghislain", + "geo-sydney": "Sydney", + "geo-tokyo": "Tokyo", + "geo-toronto": "Toronto", + "geo-warsaw": "Warsaw", + "geo-zurich": "Zürich", + "key": "Khóa {keyId}", + "manual-server-assign-firewall": "Gán quy tắc tường lửa", + "manual-server-assign-group": "Gán nhóm bảo mật", + "manual-server-create-firewall": "Tạo quy tắc cho tường lửa", + "manual-server-create-group": "Tạo một Nhóm bảo mật", + "manual-server-description": "Các bước này sẽ giúp bạn cài đặt Outline trên máy chủ Linux của {cloudProvider}.", + "manual-server-firewall": "Định cấu hình tường lửa", + "manual-server-install-paste": "Dán dữ liệu đầu ra của tập lệnh cài đặt tại đây.", + "manual-server-install-run": "Đăng nhập vào máy chủ của bạn và chạy lệnh này.", + "manual-server-instructions": "Hướng dẫn", + "manual-server-show-me": "Hiển thị vị trí", + "manual-server-title": "Hãy làm theo các hướng dẫn bên dưới", + "metrics-description": "Chia sẻ các chỉ số ẩn danh để giúp cải thiện độ tin cậy và hiệu suất của Outline, cho bạn và cho những người mà bạn chia sẻ máy chủ. {openLink}Tìm hiểu thêm.{closeLink}", + "metrics-share": "Chia sẻ chỉ số", + "metrics-skip": "Bỏ qua", + "metrics-title": "Chia sẻ chỉ số", + "nav-about": "Giới thiệu", + "nav-data-collection": "Thu thập dữ liệu", + "nav-feedback": "Phản hồi", + "nav-help": "Trợ giúp", + "nav-licenses": "Giấy phép", + "nav-privacy": "Quyền riêng tư", + "nav-terms": "Điều khoản", + "no-data-limit": "Không có", + "notification-app-update": "Đã tải phiên bản cập nhật của ứng dụng Quản lý Outline xuống. Hệ thống sẽ cài đặt phiên bản cập nhật này khi bạn khởi động lại ứng dụng.", + "notification-feedback-thanks": "Cảm ơn bạn đã giúp chúng tôi cải thiện sản phẩm! Chúng tôi rất vui khi nhận được phản hồi của bạn.", + "notification-key-added": "Đã thêm khóa", + "notification-key-removed": "Đã xóa khóa", + "notification-server-destroyed": "Đã hủy máy chủ", + "notification-server-exists": "Đã thêm máy chủ", + "notification-server-removed": "Đã xóa máy chủ", + "oauth-account-active": "Đã kích hoạt tài khoản DigitalOcean của bạn.", + "oauth-account-active-tag": "Đã kích hoạt tài khoản! Đang tải các vị trí của máy chủ...", + "oauth-activate-account": "Kích hoạt tài khoản DigitalOcean của bạn.", + "oauth-billing": "Nhập thông tin thanh toán của bạn trên digitalocean.com và quay lại ứng dụng khi bạn đã xong.", + "oauth-billing-tag": "Nhập thông tin thanh toán...", + "oauth-connect-description": "Thông qua tài khoản của bạn, Outline sẽ giúp bạn tạo một máy chủ và kết nối một cách dễ dàng.", + "oauth-connect-tag": "Đang đợi kết nối tài khoản của bạn...", + "oauth-connect-title": "Đăng nhập hoặc tạo một tài khoản bằng DigitalOcean.", + "oauth-sign-out": "Đăng xuất", + "oauth-verify": "Kiểm tra email từ DigitalOcean trong hộp thư đến và nhấp vào đường liên kết trong email đó để xác nhận tài khoản của bạn.", + "oauth-verify-tag": "Xác nhận email của bạn...", + "okay": "OK", + "per-key-data-limit-dialog-set-custom": "Đặt hạn mức dữ liệu tùy chỉnh", + "per-key-data-limit-dialog-title": "Hạn mức dữ liệu – {keyName}", + "region-best-value": "Giá rẻ nhất", + "region-description": "Đây là nơi mà bạn sẽ kết nối Internet từ đó.", + "region-setup": "Thiết lập Outline", + "region-title": "Chọn vị trí của máy chủ.", + "remove": "Xóa", + "retry": "Thử lại", + "save": "Lưu", + "saved": "Đã lưu", + "saving": "Đang lưu...", + "server-access": "Khóa truy cập máy chủ", + "server-access-key-new": "Thêm khóa mới", + "server-access-key-rename": "Đổi tên", + "server-access-keys": "Khóa truy cập", + "server-connections": "Kết nối", + "server-data-transfer": "Dữ liệu đã chuyển/30 ngày qua", + "server-data-used": "Hạn mức sử dụng/30 ngày qua", + "server-destroy": "Hủy máy chủ", + "server-help-access-key-description": "Chia sẻ khóa truy cập với bạn bè để họ có thể kết nối với máy chủ Outline của bạn. Họ có thể dùng cùng một khóa truy cập trên tất cả thiết bị.", + "server-help-access-key-next": "Tiếp", + "server-help-access-key-title": "Tạo khóa, chia sẻ quyền truy cập", + "server-help-connection-description": "Nhấp vào đây để cài đặt ứng dụng Outline, sử dụng khóa truy cập cá nhân vào máy chủ Outline của bạn.", + "server-help-connection-ok": "Đã hiểu!", + "server-help-connection-title": "Bạn vẫn chưa kết nối!", + "server-keys": "Khóa", + "server-my-access-key": "Khóa truy cập của tôi", + "server-name": "Máy chủ Outline {serverLocation}", + "server-remove": "Xóa máy chủ", + "server-settings": "Cài đặt", + "server-unreachable": "Không thể kết nối với máy chủ", + "server-unreachable-description": "Chúng tôi đang gặp sự cố khi kết nối với máy chủ này.", + "server-unreachable-managed-description": "Hãy thử lại hoặc xóa máy chủ này khỏi ứng dụng.", + "server-unreachable-manual-description": "Hãy thử lại hoặc hủy máy chủ này và máy chủ ảo.", + "server-usage": "Mức sử dụng (30 ngày qua)", + "servers-add": "Thêm máy chủ", + "servers-digitalocean": "Máy chủ DigitalOcean", + "servers-gcp": "Máy chủ Google Cloud Platform", + "servers-manual": "Máy chủ", + "settings-access-key-port": "Cổng cho khóa truy cập mới", + "settings-metrics-header": "Chia sẻ chỉ số ẩn danh", + "settings-server-api-url": "URL của API quản lý", + "settings-server-cost": "Phí hàng tháng", + "settings-server-creation": "Đã tạo", + "settings-server-hostname": "Tên máy chủ", + "settings-server-id": "Mã máy chủ", + "settings-server-info": "Thông tin máy chủ", + "settings-server-location": "Địa điểm của máy chủ", + "settings-server-name": "Tên", + "settings-server-rename": "Đặt một tên mới cho máy chủ của bạn. Xin lưu ý rằng tên mới này sẽ không xuất hiện trên các thiết bị của người dùng mà bạn đã mời kết nối.", + "settings-server-version": "Phiên bản máy chủ", + "settings-transfer-limit": "Hạn mức chuyển dữ liệu", + "setup-action": "Thiết lập", + "setup-advanced": "Nâng cao", + "setup-anywhere": "Thiết lập Outline ở mọi nơi", + "setup-cancel": "Hủy bất cứ lúc nào", + "setup-create": "Tạo máy chủ", + "setup-description": "Bạn chưa có máy chủ? Hãy tạo một tài khoản bằng DigitalOcean.", + "setup-do-cost": "Chỉ 6 USD/tháng", + "setup-do-create": "Tạo một máy chủ mới bằng tài khoản DigitalOcean. Bạn sẽ phải thanh toán thêm 6 USD/30 ngày để chuyển 1 TB dữ liệu.", + "setup-do-data": "Hạn mức chuyển dữ liệu 1 TB", + "setup-do-description": "Quá trình này có thể mất vài phút. Bạn có thể hủy máy chủ này bất cứ lúc nào.", + "setup-do-easiest": "Quá trình thiết lập dễ dàng nhất", + "setup-do-title": "Đang thiết lập Outline.", + "setup-firewall-instructions": "Hướng dẫn cách định cấu hình tường lửa", + "setup-gcp-create": "Tạo một máy chủ mới bằng Tài khoản Google của bạn. Chi phí thay đổi tùy theo vị trí và mức sử dụng.", + "setup-gcp-easy": "Quá trình thiết lập dễ dàng", + "setup-gcp-free-tier": "Khi tham gia chương trình {openLinkFreeTier}Free Tier{closeLink}, máy chủ đầu tiên bạn sử dụng có giá khởi điểm là {openLinkIpPrice}3 USD/tháng{closeLink}", + "setup-gcp-free-trial": "{openLinkFreeTrial}Bản dùng thử miễn phí trong 90 ngày{closeLink} dành cho người dùng mới", + "setup-gcp-promo": "Thử quy trình tạo máy chủ Outline tự động mới cho Google Cloud", + "setup-recommended": "Đề xuất", + "setup-simple-commands": "Các lệnh cài đặt đơn giản", + "setup-step-by-step": "Hướng dẫn thiết lập từng bước", + "setup-tested": "Đã thử nghiệm trên VULTR, Linode và Liquid Web", + "setup-title": "Chọn một dịch vụ đám mây để thiết lập Outline.", + "share-description": "Sao chép lời mời này và gửi lời mời từ công cụ giao tiếp mà bạn tin tưởng. {openLink}Bạn cần trợ giúp?{closeLink}", + "share-invite-access-key-copied": "Đã sao chép khoá truy cập vào bảng nhớ tạm", + "share-invite-copied": "Đã sao chép lời mời vào bảng nhớ tạm", + "share-invite-copy": "Sao chép phần hướng dẫn cách mời", + "share-invite-copy-access-key": "Sao chép khoá truy cập", + "share-invite-html": "Hãy sử dụng máy chủ này để truy cập vào không gian Internet mở một cách an toàn:

1) Tải xuống và cài đặt ứng dụng Outline cho thiết bị:

– iOS: https://itunes.apple.com/app/outline-app/id1356177741
– MacOS: https://itunes.apple.com/app/outline-app/id1356178125
– Windows: https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
– Linux: https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
– Android: https://play.google.com/store/apps/details?id=org.outline.android.client
– Đường liên kết khác dành cho Android: https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) Bạn sẽ nhận được một khoá truy cập bắt đầu bằng ss://. Sau khi bạn nhận được khoá, hãy sao chép khoá truy cập này.

3) Mở ứng dụng Outline. Nếu khoá truy cập của bạn được phát hiện tự động, hãy nhấn vào \"Kết nối\" rồi tiếp tục. Nếu khoá truy cập của bạn không được phát hiện tự động, hãy dán khoá đó vào trường tương ứng, rồi nhấn vào \"Kết nối\" để tiếp tục.

Bạn đã sẵn sàng sử dụng không gian Internet mở! Để đảm bảo rằng bạn đã kết nối được với máy chủ, hãy thử tìm \"ip của tôi là gì\" trên Google Tìm kiếm. Địa chỉ IP xuất hiện trên Google phải khớp với địa chỉ IP trong ứng dụng Outline.

Tìm hiểu thêm về Outline tại đây: https://getoutline.org/", + "share-invite-instructions": "Làm theo hướng dẫn cách mời của chúng tôi trên GitHub:", + "share-invite-trouble": "Bạn đang gặp trục trặc khi truy cập đường liên kết mời?", + "share-title": "Chia sẻ quyền truy cập", + "survey-data-limits-title": "Giúp chúng tôi biết cách cải thiện tính năng hạn mức dữ liệu", + "survey-decline": "Từ chối", + "survey-disclaimer": "Khi nhấp vào nút Tiếp tục, bạn sẽ nhận được một bản khảo sát ngắn trên Google Biểu mẫu. Bạn nên thực hiện bản khảo sát này khi đã kết nối với Outline.", + "survey-go-to-survey": "Chuyển đến bản khảo sát", + "terms-of-service": "Tôi đã đọc và hiểu {openLink}Điều khoản dịch vụ của Outline{closeLink}" +} diff --git a/server_manager/messages/zh-CN.json b/server_manager/messages/zh-CN.json new file mode 100644 index 0000000000..14add101eb --- /dev/null +++ b/server_manager/messages/zh-CN.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline 是由 Jigsaw 创立的开放源代码项目,旨在为新闻机构和记者提供更安全的互联网访问方式。

Outline 由 Shadowsocks 提供支持,目前仍处于产品的初级阶段。您可以在 GitHub 上参与代码编写,还可以通过 RedditMedium 关注我们,及时掌握我们扩展平台范围和添加新功能的最新动态。", + "about-version": "{version} 版", + "aws-lightsail-firewall-0": "转到 {openLink}Amazon Lightsail{closeLink} 实例页面。", + "aws-lightsail-firewall-1": "点击您要用来托管 Outline 的实例。", + "aws-lightsail-firewall-2": "转到“网络”(Networking) 标签页。", + "aws-lightsail-firewall-3": "在“防火墙”(Firewall) 部分,点击“添加其他规则”(Add another)。", + "aws-lightsail-firewall-4": "将“所有 TCP 和 UDP”(All TCP+UDP) 的值设为“应用”(Application)。", + "aws-lightsail-firewall-5": "点击“保存”(Save)。", + "cancel": "取消", + "close": "关闭", + "confirmation-server-destroy": "现有用户将失去访问权限。此操作无法撤消。", + "confirmation-server-destroy-title": "要删除服务器吗?", + "confirmation-server-remove": "此操作会将您的服务器从 Outline 管理器中移除,但不会屏蔽用户对代理的访问权限。您仍然需要手动将 Outline 服务器从您的主机中删除。", + "confirmation-server-remove-title": "要移除服务器吗?", + "data-limit": "流量上限", + "data-limit-per-key": "每个密钥的流量上限", + "data-limits": "流量上限", + "data-limits-description": "为此服务器上的访问密钥设置 30 天的数据传输流量浮动上限。", + "data-limits-dialog-text": "请转到“设置”标签页以为此服务器上的访问密钥设置数据传输流量上限。", + "data-limits-dialog-title": "避免超额使用流量", + "data-limits-disclaimer": "您当前正在报告有关指标的情况,因此指标会包含流量限制功能的使用情况。要了解详情,请参阅{openLink}数据收集政策{closeLink}。", + "data-limits-usage": "已使用 {used},共 {total}", + "destroy": "销毁", + "digitalocean-disconnect-account": "断开 DigitalOcean 账号与此应用的连接", + "digitalocean-unreachable": "此错误可能是由于您网络上的防火墙所致,也能是因为在与 digitalocean.com 连接时出现暂时性的问题。", + "disabled": "已停用的", + "disconnect": "断开连接", + "done": "完成", + "enabled": "已启用的", + "error-connectivity": "无法连接到您的 DigitalOcean 账号。这有时候是因为 DigitalOcean 或您的互联网连接出现了暂时性的问题。如果重试仍然失败,请重新登录 DigitalOcean,这样应该能解决问题。", + "error-connectivity-title": "连接问题", + "error-do-account-info": "未能获取 DigitalOcean 账号信息", + "error-do-auth": "未通过 DigitalOcean 的身份验证", + "error-do-limit": "您的 DigitalOcean 账号已达到 {num} 个 Droplet 的数量上限。如要申请提高配额,请访问 https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "未能获得可用区域的列表", + "error-do-warning": "DigitalOcean 警告:“{message}”", + "error-feedback": "未能提交反馈。请重试。", + "error-gcp-auth": "Google Cloud Platform 身份验证失败", + "error-hostname-invalid": "必须是 IP 地址或正确的主机名。", + "error-key-add": "未能添加密钥", + "error-key-remove": "未能移除密钥", + "error-key-rename": "未能重命名密钥", + "error-keys-get": "无法加载密钥", + "error-keys-port-bad-input": "端口号必须是介于 1 到 65535 之间的整数。", + "error-keys-port-in-use": "该端口已被此服务器使用。", + "error-licenses": "无法加载许可。", + "error-metrics": "将指标设为已启用时出错", + "error-network": "发生网络错误。", + "error-not-saved": "未能保存", + "error-remove-data-limit": "无法停用默认流量上限", + "error-remove-per-key-limit": "无法移除此访问密钥的流量上限", + "error-server-creation": "创建 Outline 服务器时发生错误。", + "error-server-destroy": "未能销毁服务器", + "error-server-removed": "您的 DigitalOcean 账号中不会再显示“{serverName}”。", + "error-server-rename": "未能重命名服务器", + "error-server-unreachable": "虽然您的 Outline 服务器已正确安装,但我们无法连接到该服务器。这很可能是因为该服务器的防火墙规则阻止接入连接。请检查防火墙规则,确保端口 1024 - 65535 均允许接入 TCP 连接。", + "error-server-unreachable-title": "无法连接到您的 Outline 服务器", + "error-servers-removed": "您的 DigitalOcean 账号中不会再显示{serverNames}。", + "error-set-data-limit": "无法设置默认流量上限", + "error-set-per-key-limit": "无法为此访问密钥设置流量上限", + "error-unexpected": "发生意外错误。", + "experimental": "实验性功能", + "experiments": "实验功能", + "experiments-description": "请在此新功能发布前进行测试并向我们提供反馈。", + "experiments-disclaimer": "实验功能正在开发中,并且可能发生变化或从应用中移除。如果您当前正在报告有关指标的情况,指标会包含实验功能的使用情况。要了解详情,请参阅{openLink}数据收集政策{closeLink}。", + "experiments-feedback": "有什么建议吗?{openLink}在此提交反馈。{closeLink}", + "feedback-cloud-provider": "选择云服务提供商", + "feedback-cloud-provider-error": "请选择云服务提供商。", + "feedback-connection": "无法连接到我的服务器", + "feedback-connection-others": "其他人无法连接到我的服务器", + "feedback-disclaimer": "请注意,我们的团队只能用英语回复反馈。", + "feedback-email": "电子邮件地址(可选)", + "feedback-error": "请输入反馈。", + "feedback-explanation-install": "尝试在您的服务器上安装 Outline 时发生错误。如果您找不到解决办法,不妨向我们发送反馈,告诉我们您的电子邮件地址(可选),以便我们回复您。", + "feedback-general": "一般反馈", + "feedback-install": "安装 Outline 时出现了问题", + "feedback-label": "您的反馈", + "feedback-management": "管理我的服务器时出现了问题", + "feedback-other": "其他", + "feedback-privacy": "系统会将您的反馈、电子邮件地址(如果提供的话)以及{openLink}隐私权政策{closeLink}中提及的其他信息发送给 Outline 团队。", + "feedback-submit": "提交", + "feedback-suggestion": "建议", + "feedback-title-generic": "发送反馈", + "feedback-title-install": "Outline 服务器安装失败", + "gcp-billing-action": "下一步", + "gcp-billing-body": "正在等待您{openLink}在 Google Cloud 中添加结算账号{closeLink}", + "gcp-billing-description": "{openLink}打开 Cloud Console 结算页面{closeLink},添加账号,然后继续。", + "gcp-billing-error": "无法检索结算信息", + "gcp-billing-error-zero": "您必须添加一个结算账号才能继续。", + "gcp-click-create": "点击“创建”(Create)。", + "gcp-create-new-project": "{openLink}新建 Google Cloud 项目{closeLink}。", + "gcp-create-new-vm": "{openLink}新建虚拟机实例{closeLink}。", + "gcp-create-project": "创建 Google Cloud 项目", + "gcp-create-server": "创建 Google Cloud 项目", + "gcp-create-vm": "创建虚拟机实例", + "gcp-disconnect-account": "断开 Google Cloud Platform 账号的连接", + "gcp-firewall-create-0": "在 Compute Engine 项目中{openLink}添加新的防火墙规则{closeLink}。", + "gcp-firewall-create-1": "在“名称”(Name) 字段输入“outline”。", + "gcp-firewall-create-2": "在“目标标记”(Target tags) 字段中输入“outline”。", + "gcp-firewall-create-3": "在“源 IP 范围”(Source IP ranges) 字段中输入“0.0.0.0/0”。", + "gcp-firewall-create-4": "在“协议和端口”(Protocols and ports) 下,选择“全部允许”(Allow all)。", + "gcp-name-your-project": "在“项目名称”(Project name) 字段为您的项目命名。", + "gcp-project-setup-error": "设置 Google Cloud 项目时出现错误", + "gcp-select-machine-type": "在“机器类型”(Machine type) 下方选择“f1-micro”", + "gcp-select-networking": "点击“管理、安全、磁盘、网络、单独租用”(Management, security, disks, networking, sole tenancy),然后点击“网络”(Networking)", + "gcp-select-region": "在“区域”(Region) 下方选择一个靠近服务器用户所在位置的区域。", + "gcp-type-network-tag": "在“网络标记”(Network tags) 字段中输入“outline”", + "gcp-type-outline-server": "在“名称”(Name) 字段中输入“outline-server”。", + "geo-amsterdam": "阿姆斯特丹", + "geo-bangalore": "班加罗尔", + "geo-changhua-county": "彰化县", + "geo-delhi": "德里", + "geo-eemshaven": "埃姆斯哈文", + "geo-frankfurt": "法兰克福", + "geo-hamina": "哈米纳", + "geo-hk": "香港", + "geo-iowa": "爱荷华", + "geo-jakarta": "雅加达", + "geo-jurong-west": "裕廊西", + "geo-las-vegas": "拉斯维加斯", + "geo-london": "伦敦", + "geo-los-angeles": "洛杉矶", + "geo-melbourne": "墨尔本", + "geo-montreal": "蒙特利尔", + "geo-mumbai": "孟买", + "geo-new-york-city": "纽约", + "geo-northern-virginia": "北弗吉尼亚", + "geo-oregon": "俄勒冈", + "geo-osaka": "大阪", + "geo-salt-lake-city": "盐湖城", + "geo-san-francisco": "旧金山", + "geo-sao-paulo": "圣保罗", + "geo-seoul": "首尔", + "geo-sg": "新加坡", + "geo-south-carolina": "南卡罗来纳", + "geo-st-ghislain": "圣吉斯兰", + "geo-sydney": "悉尼", + "geo-tokyo": "东京", + "geo-toronto": "多伦多", + "geo-warsaw": "华沙", + "geo-zurich": "苏黎世", + "key": "密钥 {keyId}", + "manual-server-assign-firewall": "指定防火墙规则", + "manual-server-assign-group": "分配安全组", + "manual-server-create-firewall": "创建防火墙规则", + "manual-server-create-group": "创建安全组", + "manual-server-description": "您可以按照以下步骤在 {cloudProvider} Linux 服务器上安装 Outline。", + "manual-server-firewall": "配置防火墙", + "manual-server-install-paste": "将安装脚本的输出结果粘贴到此处。", + "manual-server-install-run": "登录您的服务器,然后运行下面的命令。", + "manual-server-instructions": "操作说明", + "manual-server-show-me": "前往配置界面", + "manual-server-title": "请按照以下说明操作", + "metrics-description": "分享经过匿名化处理的指标,以帮助提升 Outline 的可靠性和性能,您和服务器的共享对象都能从中受益。{openLink}了解详情。{closeLink}", + "metrics-share": "共享指标", + "metrics-skip": "跳过", + "metrics-title": "指标共享", + "nav-about": "关于", + "nav-data-collection": "数据收集", + "nav-feedback": "反馈", + "nav-help": "帮助", + "nav-licenses": "许可", + "nav-privacy": "隐私权", + "nav-terms": "条款", + "no-data-limit": "无", + "notification-app-update": "已下载 Outline 管理器的更新版本。系统会在您重启该应用时安装此版本。", + "notification-feedback-thanks": "感谢您帮助我们改进产品!欢迎您随时提供反馈。", + "notification-key-added": "密钥已添加", + "notification-key-removed": "密钥已移除", + "notification-server-destroyed": "服务器已销毁", + "notification-server-exists": "服务器已添加", + "notification-server-removed": "服务器已移除", + "oauth-account-active": "您的 DigitalOcean 账号已激活。", + "oauth-account-active-tag": "账号已激活!正在加载服务器地址…", + "oauth-activate-account": "激活您的 DigitalOcean 账号。", + "oauth-billing": "在 digitalocean.com 上输入您的结算信息,输入完毕后再回到此应用。", + "oauth-billing-tag": "请输入结算信息…", + "oauth-connect-description": "授予对您账号的访问权限后,Outline 便可以帮助您轻松创建服务器并建立连接。", + "oauth-connect-tag": "正在等待连接您的账号…", + "oauth-connect-title": "登录或创建 DigitalOcean 账号。", + "oauth-sign-out": "退出", + "oauth-verify": "查看您的收件箱,找到来自 DigitalOcean 的电子邮件,点击其中的链接以确认您的账号。", + "oauth-verify-tag": "确认您的电子邮件地址…", + "okay": "确定", + "per-key-data-limit-dialog-set-custom": "设置自定义流量上限", + "per-key-data-limit-dialog-title": "流量上限 - {keyName}", + "region-best-value": "超值方案", + "region-description": "您将从该位置接入互联网。", + "region-setup": "安装 Outline", + "region-title": "选择服务器位置。", + "remove": "移除", + "retry": "重试", + "save": "保存", + "saved": "已保存", + "saving": "正在保存…", + "server-access": "服务器访问密钥", + "server-access-key-new": "添加新密钥", + "server-access-key-rename": "重命名", + "server-access-keys": "访问密钥", + "server-connections": "连接", + "server-data-transfer": "已传输流量 / 过去 30 天", + "server-data-used": "流量限额的已用比例 / 过去 30 天", + "server-destroy": "销毁服务器", + "server-help-access-key-description": "可与朋友分享您的访问密钥,让他们也能连接到您的 Outline 服务器。您的朋友在自己的所有设备上都可以使用这个访问密钥。", + "server-help-access-key-next": "下一步", + "server-help-access-key-title": "创建密钥,以共享访问权限", + "server-help-connection-description": "点击此处即可安装 Outline 客户端应用,安装过程中需要用到您的个人访问密钥来连接 Outline 服务器。", + "server-help-connection-ok": "知道了!", + "server-help-connection-title": "您尚未连接到服务器!", + "server-keys": "密钥", + "server-my-access-key": "我的访问密钥", + "server-name": "{serverLocation} Outline 服务器", + "server-remove": "移除服务器", + "server-settings": "设置", + "server-unreachable": "无法连接到服务器", + "server-unreachable-description": "无法连接到此服务器。", + "server-unreachable-managed-description": "请重试,或者将此服务器从应用中移除。", + "server-unreachable-manual-description": "请重试,或者销毁此服务器及虚拟主机。", + "server-usage": "流量使用情况(过去 30 天)", + "servers-add": "添加服务器", + "servers-digitalocean": "DigitalOcean 服务器", + "servers-gcp": "Google Cloud Platform 服务器", + "servers-manual": "服务器", + "settings-access-key-port": "用于新访问密钥的端口", + "settings-metrics-header": "共享匿名指标", + "settings-server-api-url": "管理 API 的网址", + "settings-server-cost": "每月费用", + "settings-server-creation": "创建日期", + "settings-server-hostname": "主机名", + "settings-server-id": "服务器 ID", + "settings-server-info": "服务器信息", + "settings-server-location": "服务器位置", + "settings-server-name": "名称", + "settings-server-rename": "为服务器设定新名称。请注意,如果您之前邀请了其他用户连接到此服务器,则这些用户的设备上不会相应地更新此服务器的名称。", + "settings-server-version": "服务器版本", + "settings-transfer-limit": "数据传输限额", + "setup-action": "安装", + "setup-advanced": "高级", + "setup-anywhere": "随时随地安装 Outline", + "setup-cancel": "可随时取消", + "setup-create": "创建服务器", + "setup-description": "没有服务器?您可以创建一个 DigitalOcean 账号。", + "setup-do-cost": "每月只需 6 美元", + "setup-do-create": "使用您的 DigitalOcean 账号创建一个新服务器,就能以每 30 天 6 美元的价格额外获享 1 TB 的数据传输流量。", + "setup-do-data": "1 TB 数据传输限额", + "setup-do-description": "这可能需要几分钟时间。您随时可以销毁此服务器。", + "setup-do-easiest": "最轻松的设置流程", + "setup-do-title": "正在安装 Outline。", + "setup-firewall-instructions": "防火墙配置说明", + "setup-gcp-create": "使用您的 Google 账号创建一个新服务器。费用因地点和使用情况而异。", + "setup-gcp-easy": "轻松的设置流程", + "setup-gcp-free-tier": "使用{openLinkFreeTier}免费层级{closeLink}时,您的第一个服务器价格为 {openLinkIpPrice}3 美元/月{closeLink}起", + "setup-gcp-free-trial": "新用户可享受 {openLinkFreeTrial}90 天免费试用{closeLink}", + "setup-gcp-promo": "尝试 Google Cloud 的全新自动 Outline 服务器创建流程", + "setup-recommended": "推荐", + "setup-simple-commands": "简单易用的安装命令", + "setup-step-by-step": "提供分步设置指南", + "setup-tested": "在 VULTR、Linode 和 Liquid Web 上测试过", + "setup-title": "选择用于安装 Outline 的云服务。", + "share-description": "复制此邀请,并使用您信任的通讯工具发送。{openLink}需要帮助?{closeLink}", + "share-invite-access-key-copied": "已将访问密钥复制到剪贴板", + "share-invite-copied": "已将邀请复制到剪贴板", + "share-invite-copy": "复制邀请", + "share-invite-copy-access-key": "复制访问密钥", + "share-invite-html": "使用此服务器以安全地访问开放互联网:

1) 为您的设备下载并安装 Outline 应用:

- iOS:https://itunes.apple.com/app/outline-app/id1356177741
- MacOS:https://itunes.apple.com/app/outline-app/id1356178125
- Windows:https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux:https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android:https://play.google.com/store/apps/details?id=org.outline.android.client
- Android 替代链接:https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) 您会收到一个以 ss:// 开头的访问密钥。收到该密钥后,请复制此访问密钥。

3) 打开 Outline 客户端应用。如果系统自动检测到您的访问密钥,请点按“连接”并继续。如果系统未自动检测您的访问密钥,请将其粘贴到该字段中,然后点按“连接”并继续。

您可以使用开放互联网了!为了确保您已成功连接到服务器,请尝试在 Google 搜索中搜索“what is my ip”。Google 中显示的 IP 地址应与 Outline 客户端中的 IP 地址一致。

如需详细了解 Outline,请访问 https://getoutline.org/", + "share-invite-instructions": "在 GitHub 上按照我们所发邀请中的说明操作:", + "share-invite-trouble": "无法访问邀请链接?", + "share-title": "共享访问权限", + "survey-data-limits-title": "帮助我们了解如何改进流量限制功能", + "survey-decline": "拒绝", + "survey-disclaimer": "点击“继续”后,您将转到 Google 表单并需要填写一份简短的调查问卷。我们建议您在连接到 Outline 的同时填写调查问卷。", + "survey-go-to-survey": "转到调查问卷", + "terms-of-service": "我已阅读并理解了 {openLink}Outline 服务条款{closeLink}" +} diff --git a/server_manager/messages/zh-TW.json b/server_manager/messages/zh-TW.json new file mode 100644 index 0000000000..af1bd10da5 --- /dev/null +++ b/server_manager/messages/zh-TW.json @@ -0,0 +1,275 @@ +{ + "about-outline": "Outline 是由 Jigsaw 建立的開放原始碼計劃,旨在為新聞機構和記者提供更安全的網際網路存取方式。

Outline 採用 Shadowsocks 技術,目前仍處於產品早期階段。你可以在 GitHub 上參與程式碼編寫工作,並透過 RedditMedium 追蹤我們,即時掌握我們拓展平台範圍和開發新功能的最新消息。", + "about-version": "版本:{version}", + "aws-lightsail-firewall-0": "前往 {openLink}Amazon Lightsail{closeLink} 執行個體畫面。", + "aws-lightsail-firewall-1": "按一下要用於代管 Outline 的執行個體。", + "aws-lightsail-firewall-2": "前往「Networking」(網路) 分頁。", + "aws-lightsail-firewall-3": "在「Firewall」(防火牆) 部分中按一下 [Add another] (新增其他規則)。", + "aws-lightsail-firewall-4": "將「Application」(應用程式) 的值設為 [All TCP+UDP] (皆為 TCP+UDP)。", + "aws-lightsail-firewall-5": "按一下 [Save] (儲存)。", + "cancel": "取消", + "close": "關閉", + "confirmation-server-destroy": "現有使用者將失去存取權。伺服器一經刪除後即無法復原。", + "confirmation-server-destroy-title": "要刪除伺服器嗎?", + "confirmation-server-remove": "這項操作會從 Outline Manager 中移除你的伺服器,但不會封鎖使用者對 Proxy 伺服器的存取權。因此,你仍須在主機電腦上手動刪除 Outline 伺服器。", + "confirmation-server-remove-title": "要移除伺服器嗎?", + "data-limit": "數據用量上限", + "data-limit-per-key": "每組金鑰的數據用量上限", + "data-limits": "數據用量上限", + "data-limits-description": "為這個伺服器上的存取金鑰設定 30 天追蹤資料傳輸上限。", + "data-limits-dialog-text": "前往「設定」分頁為這個伺服器上的存取金鑰設定資料傳輸上限。", + "data-limits-dialog-title": "避免超量傳輸資料", + "data-limits-disclaimer": "由於您正在回報指標,因此其中將包含資料傳輸上限功能的使用資料。詳情請參閱《{openLink}資料收集政策{closeLink}》。", + "data-limits-usage": "已使用 {used} (共 {total})", + "destroy": "刪除", + "digitalocean-disconnect-account": "取消 DigitalOcean 帳戶連結", + "digitalocean-unreachable": "導致這項錯誤的原因可能是你的網路設有防火牆,或者 digitalocean.com 暫時發生連線問題。", + "disabled": "已停用", + "disconnect": "中斷連線", + "done": "完成", + "enabled": "已啟用", + "error-connectivity": "目前無法連結你的 DigitalOcean 帳戶,這有時是因為 DigitalOcean 或你的網際網路連線暫時發生問題所導致。如果再次嘗試操作後仍無法連結帳戶,只要重新登入 DigitalOcean 應該就能解決問題。", + "error-connectivity-title": "連線問題", + "error-do-account-info": "無法取得 DigitalOcean 帳戶資訊", + "error-do-auth": "無法透過 DigitalOcean 進行驗證", + "error-do-limit": "你的 DigitalOcean 帳戶已達到 {num} 個 Droplet 的上限。如要申請更多額度,請前往以下網址:https://cloud.digitalocean.com/account/team/droplet_limit_increase", + "error-do-regions": "無法取得可用地區清單", + "error-do-warning": "DigitalOcean 警告:「{message}」", + "error-feedback": "無法提交意見回饋,請再試一次。", + "error-gcp-auth": "無法透過 Google Cloud Platform 驗證", + "error-hostname-invalid": "必須輸入 IP 位址或有效的主機名稱。", + "error-key-add": "無法新增金鑰", + "error-key-remove": "無法移除金鑰", + "error-key-rename": "無法重新命名金鑰", + "error-keys-get": "無法載入金鑰", + "error-keys-port-bad-input": "通訊埠必須是介於 1 到 65,535 的整數。", + "error-keys-port-in-use": "通訊埠已於伺服器上使用。", + "error-licenses": "無法載入授權。", + "error-metrics": "啟用設定指標回報功能時發生錯誤", + "error-network": "發生網路錯誤。", + "error-not-saved": "未儲存", + "error-remove-data-limit": "無法停用預設的數據用量上限", + "error-remove-per-key-limit": "無法移除此存取金鑰的數據用量上限", + "error-server-creation": "建立你的 Outline 伺服器時發生錯誤。", + "error-server-destroy": "無法刪除伺服器", + "error-server-removed": "你的 DigitalOcean 帳戶中不會再顯示{serverName}。", + "error-server-rename": "無法重新命名伺服器", + "error-server-unreachable": "你的 Outline 伺服器已正確安裝,但系統無法連線至該伺服器。最有可能的原因是你的伺服器防火牆規則封鎖了連入連線。請檢查防火牆規則,並確認這些規則允許 1024 到 65535 之間所有通訊埠的連入 TCP 連線。", + "error-server-unreachable-title": "無法連線至你的 Outline 伺服器", + "error-servers-removed": "你的 DigitalOcean 帳戶中不會再顯示下列伺服器:{serverNames}。", + "error-set-data-limit": "無法設定預設數據用量上限", + "error-set-per-key-limit": "無法為此存取金鑰設定數據用量上限", + "error-unexpected": "發生未預期的錯誤。", + "experimental": "實驗功能", + "experiments": "實驗", + "experiments-description": "測試尚未推出的新功能並為我們提供意見。", + "experiments-disclaimer": "實驗功能仍在開發階段,有可能變更或從應用程式中移除。如果您正在回報指標,其中將包含實驗功能的使用資料。詳情請參閱《{openLink}資料收集政策{closeLink}》。", + "experiments-feedback": "你有任何建議嗎?{openLink}按這裡提供意見{closeLink}", + "feedback-cloud-provider": "選取雲端服務供應商", + "feedback-cloud-provider-error": "請選取雲端服務供應商。", + "feedback-connection": "無法連線至我的伺服器", + "feedback-connection-others": "其他使用者無法連線至我的伺服器", + "feedback-disclaimer": "請注意,支援小組只能使用英文回覆意見。", + "feedback-email": "電子郵件地址 (選填)", + "feedback-error": "請輸入意見回饋。", + "feedback-explanation-install": "嘗試在你的伺服器上安裝 Outline 時發生錯誤。如果你無法找出解決方式,可以考慮向我們傳送意見回饋,並告訴我們你的電子郵件地址 (非強制),以便我們回信給你。", + "feedback-general": "一般意見", + "feedback-install": "無法順利安裝 Outline", + "feedback-label": "你的意見回饋", + "feedback-management": "無法順利管理我的伺服器", + "feedback-other": "其他", + "feedback-privacy": "系統會將你的意見回饋、電子郵件地址 (如有提供) 和《{openLink}隱私權政策{closeLink}》中所述的額外資訊傳送給 Outline 團隊。", + "feedback-submit": "提交", + "feedback-suggestion": "建議", + "feedback-title-generic": "提供意見", + "feedback-title-install": "無法安裝 Outline 伺服器", + "gcp-billing-action": "下一步", + "gcp-billing-body": "請先{openLink}在 Google Cloud 新增帳單帳戶{closeLink}", + "gcp-billing-description": "如要繼續作業,請{openLink}開啟 Cloud Console 帳單頁面{closeLink}並新增帳戶。", + "gcp-billing-error": "無法擷取帳單資訊", + "gcp-billing-error-zero": "必須新增帳單帳戶才能繼續。", + "gcp-click-create": "按一下 [Create] (建立)。", + "gcp-create-new-project": "{openLink}建立新的 Google 雲端專案{closeLink}。", + "gcp-create-new-vm": "{openLink}建立新的 VM 執行個體{closeLink}。", + "gcp-create-project": "建立 Google 雲端專案", + "gcp-create-server": "建立 Google 雲端專案", + "gcp-create-vm": "建立 VM 執行個體", + "gcp-disconnect-account": "取消 Google Cloud Platform 帳戶連結", + "gcp-firewall-create-0": "在你的 Compute Engine 專案中{openLink}新增防火牆規則{closeLink}。", + "gcp-firewall-create-1": "在 [Name] (名稱) 欄位中輸入「outline」。", + "gcp-firewall-create-2": "在 [Target tags] (目標代碼) 欄位中輸入「outline」。", + "gcp-firewall-create-3": "在 [Source IP ranges] (來源 IP 範圍) 欄位中輸入「0.0.0.0/0」。", + "gcp-firewall-create-4": "選取「Protocols and ports」(通訊協定和通訊埠) 下方的 [Allow all] (全部允許)。", + "gcp-name-your-project": "在 [Project name] (專案名稱) 欄位中為專案命名。", + "gcp-project-setup-error": "設定 Google Cloud 專案時發生錯誤", + "gcp-select-machine-type": "在「Machine type」(機器類型) 下方選取 [f1-micro]", + "gcp-select-networking": "依序按一下 [Management, security, disks, networking, sole tenancy] (管理、安全性、磁碟、網路、單獨租用) 和 [Networking] (網路)", + "gcp-select-region": "在「Region」(地區) 之下選取與伺服器使用者鄰近的地區。", + "gcp-type-network-tag": "在 [Network tags] (網路標記) 欄位中輸入「outline」", + "gcp-type-outline-server": "在 [Name] (名稱) 欄位中輸入「outline-server」。", + "geo-amsterdam": "阿姆斯特丹", + "geo-bangalore": "班加羅爾", + "geo-changhua-county": "彰化縣", + "geo-delhi": "德里", + "geo-eemshaven": "埃姆斯港", + "geo-frankfurt": "法蘭克福", + "geo-hamina": "哈米納", + "geo-hk": "香港", + "geo-iowa": "愛荷華州", + "geo-jakarta": "雅加達", + "geo-jurong-west": "裕廊西區", + "geo-las-vegas": "拉斯維加斯", + "geo-london": "倫敦", + "geo-los-angeles": "洛杉磯", + "geo-melbourne": "墨爾本", + "geo-montreal": "蒙特婁", + "geo-mumbai": "孟買", + "geo-new-york-city": "紐約", + "geo-northern-virginia": "北維吉尼亞州", + "geo-oregon": "奧勒岡州", + "geo-osaka": "大阪", + "geo-salt-lake-city": "鹽湖城", + "geo-san-francisco": "舊金山", + "geo-sao-paulo": "聖保羅", + "geo-seoul": "首爾", + "geo-sg": "新加坡", + "geo-south-carolina": "南卡羅來納州", + "geo-st-ghislain": "聖吉斯蘭", + "geo-sydney": "雪梨", + "geo-tokyo": "東京", + "geo-toronto": "多倫多", + "geo-warsaw": "華沙", + "geo-zurich": "蘇黎世", + "key": "金鑰 {keyId}", + "manual-server-assign-firewall": "指派防火牆規則", + "manual-server-assign-group": "指派安全性群組", + "manual-server-create-firewall": "建立防火牆規則", + "manual-server-create-group": "建立安全性群組", + "manual-server-description": "你可以按照下列步驟在 {cloudProvider} Linux 伺服器上安裝 Outline。", + "manual-server-firewall": "設定你的防火牆", + "manual-server-install-paste": "將安裝指令碼的輸出內容貼到這裡。", + "manual-server-install-run": "登入你的伺服器,並執行下列指令。", + "manual-server-instructions": "操作說明", + "manual-server-show-me": "前往主控台", + "manual-server-title": "請按照下列說明操作", + "metrics-description": "分享經過匿名化處理的指標,協助改善 Outline 的穩定性和效能,你和伺服器共用對象都能因此受惠。{openLink}瞭解詳情{closeLink}。", + "metrics-share": "分享指標", + "metrics-skip": "略過", + "metrics-title": "分享指標", + "nav-about": "關於", + "nav-data-collection": "資料收集", + "nav-feedback": "意見回饋", + "nav-help": "說明", + "nav-licenses": "授權", + "nav-privacy": "隱私權", + "nav-terms": "條款", + "no-data-limit": "無", + "notification-app-update": "已下載最新版本的 Outline Manager。系統會在你重新啟動應用程式時安裝新版本。", + "notification-feedback-thanks": "感謝你協助我們改善服務!歡迎隨時提供意見給我們。", + "notification-key-added": "已新增金鑰", + "notification-key-removed": "已移除金鑰", + "notification-server-destroyed": "已刪除伺服器", + "notification-server-exists": "已新增伺服器", + "notification-server-removed": "已移除伺服器", + "oauth-account-active": "你的 DigitalOcean 帳戶已啟用。", + "oauth-account-active-tag": "已啟用帳戶!正在載入伺服器位置...", + "oauth-activate-account": "啟用你的 DigitalOcean 帳戶。", + "oauth-billing": "請前往 digitalocean.com 輸入帳單資訊,完成後再返回應用程式。", + "oauth-billing-tag": "請輸入帳單資訊...", + "oauth-connect-description": "Outline 可讓你透過自己的帳戶輕鬆建立伺服器及連上網路。", + "oauth-connect-tag": "正在等待連結你的帳戶...", + "oauth-connect-title": "登入或建立 DigitalOcean 帳戶。", + "oauth-sign-out": "登出", + "oauth-verify": "前往你的收件匣查看 DigitalOcean 傳送的電子郵件,並點選信中連結來確認你的帳戶。", + "oauth-verify-tag": "正在確認你的電子郵件地址...", + "okay": "確定", + "per-key-data-limit-dialog-set-custom": "設定自訂數據用量上限", + "per-key-data-limit-dialog-title": "數據用量上限 - {keyName}", + "region-best-value": "超值方案", + "region-description": "你會從這個伺服器位置連線至網際網路。", + "region-setup": "設定 Outline", + "region-title": "選取伺服器位置。", + "remove": "移除", + "retry": "重試", + "save": "儲存", + "saved": "已儲存", + "saving": "儲存中…", + "server-access": "伺服器存取權", + "server-access-key-new": "新增金鑰", + "server-access-key-rename": "重新命名", + "server-access-keys": "存取金鑰", + "server-connections": "連線", + "server-data-transfer": "資料傳輸量/過去 30 天", + "server-data-used": "配額用量/過去 30 天", + "server-destroy": "刪除伺服器", + "server-help-access-key-description": "將存取金鑰分享給好友,讓對方能夠連線至你的 Outline 伺服器。他們可以在自己的所有裝置上使用相同的存取金鑰。", + "server-help-access-key-next": "繼續", + "server-help-access-key-title": "建立金鑰並分享存取權", + "server-help-connection-description": "只要按一下這裡,即可透過 Outline 伺服器的個人存取金鑰安裝 Outline 用戶端應用程式。", + "server-help-connection-ok": "好,我知道了!", + "server-help-connection-title": "你尚未連線!", + "server-keys": "金鑰數量", + "server-my-access-key": "我的存取金鑰", + "server-name": "{serverLocation}的 Outline 伺服器", + "server-remove": "移除伺服器", + "server-settings": "設定", + "server-unreachable": "無法連線至伺服器", + "server-unreachable-description": "連線至這個伺服器時發生問題。", + "server-unreachable-managed-description": "請再試一次,或從應用程式中移除這個伺服器。", + "server-unreachable-manual-description": "請再試一次,或刪除這個伺服器和虛擬主機。", + "server-usage": "用量 (過去 30 天)", + "servers-add": "新增伺服器", + "servers-digitalocean": "DigitalOcean 伺服器", + "servers-gcp": "Google Cloud Platform 伺服器", + "servers-manual": "伺服器", + "settings-access-key-port": "新存取金鑰的通訊埠", + "settings-metrics-header": "分享匿名指標", + "settings-server-api-url": "Management API 網址", + "settings-server-cost": "每月費用", + "settings-server-creation": "建立日期", + "settings-server-hostname": "主機名稱", + "settings-server-id": "伺服器 ID", + "settings-server-info": "伺服器資訊", + "settings-server-location": "伺服器位置", + "settings-server-name": "名稱", + "settings-server-rename": "為你的伺服器設定新名稱。請注意,當你邀請使用者連線至這個伺服器時,系統不會在他們的裝置上顯示此名稱。", + "settings-server-version": "伺服器版本", + "settings-transfer-limit": "資料傳輸配額", + "setup-action": "設定", + "setup-advanced": "進階", + "setup-anywhere": "隨時隨地設定 Outline", + "setup-cancel": "隨時都能取消服務", + "setup-create": "建立伺服器", + "setup-description": "沒有伺服器嗎?請建立 DigitalOcean 帳戶。", + "setup-do-cost": "每月只要 $6 美元", + "setup-do-create": "只要使用 DigitalOcean 帳戶建立新伺服器,即可額外享有每 30 天 $6 美元的 1 TB 資料傳輸量。", + "setup-do-data": "1 TB 資料傳輸配額", + "setup-do-description": "這可能需要幾分鐘的時間。你隨時都能刪除這個伺服器。", + "setup-do-easiest": "最簡單的設定程序", + "setup-do-title": "正在設定 Outline。", + "setup-firewall-instructions": "防火牆操作說明", + "setup-gcp-create": "使用 Google 帳戶建立新伺服器。費用會因地點和用量而異。", + "setup-gcp-easy": "簡單的設定程序", + "setup-gcp-free-tier": "採用{openLinkFreeTier}免費方案{closeLink}時,第一部伺服器的{openLinkIpPrice}月費 $3 美元{closeLink}起", + "setup-gcp-free-trial": "新使用者享有 {openLinkFreeTrial}90 天免費試用期{closeLink}", + "setup-gcp-promo": "試試看 Google Cloud 專用的全新 Outline 伺服器自動化建立程序", + "setup-recommended": "建議", + "setup-simple-commands": "簡單的安裝指令", + "setup-step-by-step": "逐步設定指南", + "setup-tested": "已在 VULTR、Linode 和 Liquid Web 通過測試", + "setup-title": "請選擇要用於設定 Outline 的雲端服務。", + "share-description": "複製這份邀請說明,並透過你信任的通訊工具傳送。{openLink}需要協助嗎?{closeLink}", + "share-invite-access-key-copied": "已將存取金鑰複製到剪貼簿", + "share-invite-copied": "已將邀請函文字複製到剪貼簿", + "share-invite-copy": "複製邀請說明", + "share-invite-copy-access-key": "複製存取金鑰", + "share-invite-html": "使用這個伺服器即可安全存取開放網際網路:

1) 根據你的裝置下載並安裝適用的 Outline 應用程式:

- iOS:https://itunes.apple.com/app/outline-app/id1356177741
- macOS:https://itunes.apple.com/app/outline-app/id1356178125
- Windows:https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe
- Linux:https://s3.amazonaws.com/outline-releases/client/linux/stable/Outline-Client.AppImage
- Android:https://play.google.com/store/apps/details?id=org.outline.android.client
- Android 備用連結:https://s3.amazonaws.com/outline-releases/client/android/stable/Outline-Client.apk

2) 你會收到開頭為 ss:// 的存取金鑰。收到後,請複製這個金鑰。

3) 開啟 Outline 用戶端應用程式。如果系統自動偵測到你的存取金鑰,請輕觸「連線」並繼續操作。若系統未自動偵測到存取金鑰,請將金鑰貼到欄位中,然後輕觸「連線」並繼續操作。

你現在可以使用開放網際網路了!如要確認是否已成功連線至伺服器,請在 Google 搜尋上搜尋「what is my ip」(我的 IP 位址為何)。Google 顯示的 IP 位址應該會與 Outline 用戶端中的 IP 位址相符。

如要進一步瞭解 Outline,請前往 https://getoutline.org/", + "share-invite-instructions": "請參閱我們在 GitHub 發布的邀請說明:", + "share-invite-trouble": "無法順利存取邀請連結嗎?", + "share-title": "分享存取權", + "survey-data-limits-title": "協助我們瞭解如何改善資料傳輸上限功能", + "survey-decline": "拒絕", + "survey-disclaimer": "只要按一下 [繼續],系統就會在 Google 表單中開啟一份簡短的問卷調查。我們建議在與 Outline 連線的情況下填寫這份問卷調查。", + "survey-go-to-survey": "前往問卷調查", + "terms-of-service": "我已詳閱並瞭解《{openLink}Outline 服務條款{closeLink}》" +} diff --git a/server_manager/model/accounts.ts b/server_manager/model/accounts.ts new file mode 100644 index 0000000000..4bee8bf80a --- /dev/null +++ b/server_manager/model/accounts.ts @@ -0,0 +1,60 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as digitalocean from './digitalocean'; +import * as gcp from './gcp'; + +export interface CloudAccounts { + /** + * Connects a DigitalOcean account. + * + * Only one DigitalOcean account can be connected at any given time. + * Subsequent calls to this method will overwrite any previously connected + * DigtialOcean account. + * + * @param accessToken: The DigitalOcean access token. + */ + connectDigitalOceanAccount(accessToken: string): digitalocean.Account; + + /** + * Connects a Google Cloud Platform account. + * + * Only one Google Cloud Platform account can be connected at any given time. + * Subsequent calls to this method will overwrite any previously connected + * Google Cloud Platform account. + * + * @param refreshToken: The GCP refresh token. + */ + connectGcpAccount(refreshToken: string): gcp.Account; + + /** + * Disconnects the DigitalOcean account. + */ + disconnectDigitalOceanAccount(): void; + + /** + * Disconnects the Google Cloud Platform account. + */ + disconnectGcpAccount(): void; + + /** + * @returns the connected DigitalOcean account (or null if none exists). + */ + getDigitalOceanAccount(): digitalocean.Account; + + /** + * @returns the connected Google Cloud Platform account (or null if none exists). + */ + getGcpAccount(): gcp.Account; +} diff --git a/server_manager/model/digitalocean.ts b/server_manager/model/digitalocean.ts new file mode 100644 index 0000000000..4e88d7f8ac --- /dev/null +++ b/server_manager/model/digitalocean.ts @@ -0,0 +1,70 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as location from './location'; +import {ManagedServer} from './server'; + +// A DigitalOcean Region, e.g. "NYC2". +export class Region implements location.CloudLocation { + private static readonly LOCATION_MAP: {readonly [cityId: string]: location.GeoLocation} = { + ams: location.AMSTERDAM, + blr: location.BANGALORE, + fra: location.FRANKFURT, + lon: location.LONDON, + nyc: location.NEW_YORK_CITY, + sfo: location.SAN_FRANCISCO, + sgp: location.SINGAPORE, + syd: location.SYDNEY, + tor: location.TORONTO, + }; + constructor(public readonly id: string) {} + + get location(): location.GeoLocation { + return Region.LOCATION_MAP[this.id.substring(0, 3).toLowerCase()]; + } +} + +export interface RegionOption extends location.CloudLocationOption { + readonly cloudLocation: Region; +} + +export interface Status { + // The account has not had any billing info added yet. + readonly needsBillingInfo: boolean; + // The account has not had an email address added yet. + readonly needsEmailVerification: boolean; + // The maximum number of droplets this account can create. + readonly dropletLimit: number; + // The account cannot add any more droplets. + readonly hasReachedLimit: boolean; + // A warning message from DigitalOcean, in English. + readonly warning?: string; +} + +export interface Account { + // Gets a globally unique identifier for this Account. + getId(): string; + // Returns a user-friendly name (email address) associated with the account. + getName(): Promise; + // Returns the status of the account. + getStatus(): Promise; + // Lists all existing Shadowboxes. If `fetchFromHost` is true, performs a network request to + // retrieve the servers; otherwise resolves with a cached server list. + listServers(fetchFromHost?: boolean): Promise; + // Return a list of regions with info about whether they are available for use. + listLocations(): Promise>; + // Creates a server and returning it when it becomes active (i.e. the server has + // created, not necessarily once shadowbox installation has finished). + createServer(region: Region, name: string): Promise; +} diff --git a/server_manager/model/gcp.ts b/server_manager/model/gcp.ts new file mode 100644 index 0000000000..2261602903 --- /dev/null +++ b/server_manager/model/gcp.ts @@ -0,0 +1,140 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as location from './location'; +import {ManagedServer} from './server'; + +export class Zone implements location.CloudLocation { + /** @see https://cloud.google.com/compute/docs/regions-zones */ + private static readonly LOCATION_MAP: {readonly [regionId: string]: location.GeoLocation} = { + 'asia-east1': location.CHANGHUA_COUNTY, + 'asia-east2': location.HONG_KONG, + 'asia-northeast1': location.TOKYO, + 'asia-northeast2': location.OSAKA, + 'asia-northeast3': location.SEOUL, + 'asia-south1': location.MUMBAI, + 'asia-south2': location.DELHI, + 'asia-southeast1': location.JURONG_WEST, + 'asia-southeast2': location.JAKARTA, + 'australia-southeast1': location.SYDNEY, + 'australia-southeast2': location.MELBOURNE, + 'europe-north1': location.HAMINA, + 'europe-west1': location.ST_GHISLAIN, + 'europe-west2': location.LONDON, + 'europe-west3': location.FRANKFURT, + 'europe-west4': location.EEMSHAVEN, + 'europe-west6': location.ZURICH, + 'europe-central2': location.WARSAW, + 'northamerica-northeast1': location.MONTREAL, + 'northamerica-northeast2': location.TORONTO, + 'southamerica-east1': location.SAO_PAULO, + 'us-central1': location.IOWA, + 'us-east1': location.SOUTH_CAROLINA, + 'us-east4': location.NORTHERN_VIRGINIA, + 'us-west1': location.OREGON, + 'us-west2': location.LOS_ANGELES, + 'us-west3': location.SALT_LAKE_CITY, + 'us-west4': location.LAS_VEGAS, + }; + + /** ID is a GCP Zone ID like "us-central1-a". */ + constructor(public readonly id: string) {} + + /** Returns a region ID like "us-central1". */ + get regionId(): string { + return this.id.substring(0, this.id.lastIndexOf('-')); + } + + get location(): location.GeoLocation { + return Zone.LOCATION_MAP[this.regionId]; + } +} + +export interface ZoneOption extends location.CloudLocationOption { + readonly cloudLocation: Zone; +} + +export type Project = { + id: string; + name: string; +}; + +export type BillingAccount = { + id: string; + name: string; +}; + +/** + * The Google Cloud Platform account model. + */ +export interface Account { + /** + * Returns a globally unique identifier for this Account. + */ + getId(): string; + + /** + * Returns a user-friendly name associated with the account. + */ + getName(): Promise; + + /** + * Creates an Outline server on a Google Compute Engine VM instance. + * + * This method returns after the VM instance has been created. The Shadowbox + * Outline server may not be fully installed. See {@link ManagedServer#waitOnInstall} + * to be notified when the server installation has completed. + * + * @param projectId - The GCP project ID. + * @param name - The name to be given to the server. + * @param zone - The GCP zone to create the server in. + */ + createServer(projectId: string, name: string, zone: Zone): Promise; + + /** + * Lists the Outline servers in a given GCP project. + * + * @param projectId - The GCP project ID. + */ + listServers(projectId: string): Promise; + + /** + * Lists the Google Compute Engine locations available to given GCP project. + * + * @param projectId - The GCP project ID. + */ + listLocations(projectId: string): Promise>; + + /** + * Creates a new Google Cloud Platform project. + * + * The project ID must conform to the following: + * - must be 6 to 30 lowercase letters, digits, or hyphens + * - must start with a letter + * - no trailing hyphens + * + * @param id - The project ID. + * @param billingAccount - The billing account ID. + */ + createProject(id: string, billingAccountId: string): Promise; + + /** Lists the Google Cloud Platform projects available with the user. */ + listProjects(): Promise; + + /** + * Lists the active Google Cloud Platform billing accounts associated with + * the user. + */ + listOpenBillingAccounts(): Promise; +} diff --git a/server_manager/model/location.ts b/server_manager/model/location.ts new file mode 100644 index 0000000000..25b6738b41 --- /dev/null +++ b/server_manager/model/location.ts @@ -0,0 +1,90 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Unified server location model for all cloud providers. + * + * Keys are GeoIds, identifying the location. Values are ISO country codes. + * + * Each key identifies a location as displayed in the Outline + * user interface. To minimize confusion, Outline attempts to + * present each location in a manner consistent with the cloud + * provider's own interface and documentation. When cloud providers + * present a location in similar fashion, they may share an element + * (e.g. 'frankfurt' for GCP and DO), but if they present a similar + * location in different terms, they will need to be represented + * separately (e.g. 'SG' for DO, 'jurong-west' for GCP). + * + * When the key and value are equal, this indicates that they are redundant. + */ +export class GeoLocation { + constructor(public readonly id: string, public readonly countryCode: string) {} + + countryIsRedundant(): boolean { + return this.countryCode === this.id; + } +} + +export const AMSTERDAM = new GeoLocation('amsterdam', 'NL'); +export const NORTHERN_VIRGINIA = new GeoLocation('northern-virginia', 'US'); +export const BANGALORE = new GeoLocation('bangalore', 'IN'); +export const IOWA = new GeoLocation('iowa', 'US'); +export const CHANGHUA_COUNTY = new GeoLocation('changhua-county', 'TW'); +export const DELHI = new GeoLocation('delhi', 'IN'); +export const EEMSHAVEN = new GeoLocation('eemshaven', 'NL'); +export const FRANKFURT = new GeoLocation('frankfurt', 'DE'); +export const HAMINA = new GeoLocation('hamina', 'FI'); +export const HONG_KONG = new GeoLocation('HK', 'HK'); +export const JAKARTA = new GeoLocation('jakarta', 'ID'); +export const JURONG_WEST = new GeoLocation('jurong-west', 'SG'); +export const LAS_VEGAS = new GeoLocation('las-vegas', 'US'); +export const LONDON = new GeoLocation('london', 'GB'); +export const LOS_ANGELES = new GeoLocation('los-angeles', 'US'); +export const OREGON = new GeoLocation('oregon', 'US'); +export const MELBOURNE = new GeoLocation('melbourne', 'AU'); +export const MONTREAL = new GeoLocation('montreal', 'CA'); +export const MUMBAI = new GeoLocation('mumbai', 'IN'); +export const NEW_YORK_CITY = new GeoLocation('new-york-city', 'US'); +export const SAN_FRANCISCO = new GeoLocation('san-francisco', 'US'); +export const SINGAPORE = new GeoLocation('SG', 'SG'); +export const OSAKA = new GeoLocation('osaka', 'JP'); +export const SAO_PAULO = new GeoLocation('sao-paulo', 'BR'); +export const SALT_LAKE_CITY = new GeoLocation('salt-lake-city', 'US'); +export const SEOUL = new GeoLocation('seoul', 'KR'); +export const ST_GHISLAIN = new GeoLocation('st-ghislain', 'BE'); +export const SYDNEY = new GeoLocation('sydney', 'AU'); +export const SOUTH_CAROLINA = new GeoLocation('south-carolina', 'US'); +export const TOKYO = new GeoLocation('tokyo', 'JP'); +export const TORONTO = new GeoLocation('toronto', 'CA'); +export const WARSAW = new GeoLocation('warsaw', 'PL'); +export const ZURICH = new GeoLocation('zurich', 'CH'); + +export interface CloudLocation { + /** + * The cloud-specific ID used for this location, or null to represent + * a GeoId that lacks a usable datacenter. + */ + readonly id: string; + + /** + * The physical location of this datacenter, or null if its location is + * unknown. + */ + readonly location: GeoLocation; +} + +export interface CloudLocationOption { + readonly cloudLocation: CloudLocation; + readonly available: boolean; +} diff --git a/server_manager/model/server.ts b/server_manager/model/server.ts new file mode 100644 index 0000000000..2b36bc4df9 --- /dev/null +++ b/server_manager/model/server.ts @@ -0,0 +1,191 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {CustomError} from '../infrastructure/custom_error'; +import {CloudLocation} from './location'; + +export interface Server { + // Gets a globally unique identifier for this Server. THIS MUST NOT make a network request, as + // it's used to identify unreachable servers. + getId(): string; + + // Gets the server's name for display. + getName(): string; + + // Gets the version of the shadowbox binary the server is running + getVersion(): string; + + // Updates the server name. + setName(name: string): Promise; + + // Return access key + getAccessKey(accessKeyId: AccessKeyId): Promise; + + // Lists the access keys for this server, including the admin. + listAccessKeys(): Promise; + + // Returns stats for bytes transferred across all access keys of this server. + getDataUsage(): Promise; + + // Adds a new access key to this server. + addAccessKey(): Promise; + + // Renames the access key given by id. + renameAccessKey(accessKeyId: AccessKeyId, name: string): Promise; + + // Removes the access key given by id. + removeAccessKey(accessKeyId: AccessKeyId): Promise; + + // Sets a default access key data transfer limit over a 30 day rolling window for all access keys. + // This limit is overridden by per-key data limits. Forces enforcement of all data limits, + // including per-key data limits. + setDefaultDataLimit(limit: DataLimit): Promise; + + // Returns the server default access key data transfer limit, or undefined if it has not been set. + getDefaultDataLimit(): DataLimit | undefined; + + // Removes the server default data limit. Per-key data limits are still enforced. Traffic is + // tracked for if the limit is re-enabled. Forces enforcement of all data limits, including + // per-key limits. + removeDefaultDataLimit(): Promise; + + // Sets the custom data limit for a specific key. This limit overrides the server default limit + // if it exists. Forces enforcement of the chosen key's data limit. + setAccessKeyDataLimit(accessKeyId: AccessKeyId, limit: DataLimit): Promise; + + // Removes the custom data limit for a specific key. The key is still bound by the server default + // limit if it exists. Forces enforcement of the chosen key's data limit. + removeAccessKeyDataLimit(accessKeyId: AccessKeyId): Promise; + + // Returns whether metrics are enabled. + getMetricsEnabled(): boolean; + + // Updates whether metrics are enabled. + setMetricsEnabled(metricsEnabled: boolean): Promise; + + // Gets the ID used for metrics reporting. + getMetricsId(): string; + + // Checks if the server is healthy. + isHealthy(): Promise; + + // Gets the date when this server was created. + getCreatedDate(): Date; + + // Returns the server's domain name or IP address. + getHostnameForAccessKeys(): string; + + // Changes the hostname for shared access keys. + setHostnameForAccessKeys(hostname: string): Promise; + + // Returns the server's management API URL. + getManagementApiUrl(): string; + + // Returns the port number for new access keys. + // Returns undefined if the server doesn't have a port set. + getPortForNewAccessKeys(): number | undefined; + + // Changes the port number for new access keys. + setPortForNewAccessKeys(port: number): Promise; +} + +// Manual servers are servers which the user has independently setup to run +// shadowbox, and can be on any cloud provider. +export interface ManualServer extends Server { + getCertificateFingerprint(): string | undefined; + + forget(): void; +} + +// Error thrown when monitoring an installation that the user canceled. +export class ServerInstallCanceledError extends CustomError { + constructor(message?: string) { + super(message); + } +} + +// Error thrown when server installation failed. +export class ServerInstallFailedError extends CustomError { + constructor(message?: string) { + super(message); + } +} + +// Managed servers are servers created by the Outline Manager through our +// "magic" user experience, e.g. DigitalOcean. +export interface ManagedServer extends Server { + // Yields how far installation has progressed (0.0 to 1.0). + // Exits when installation has completed. Throws ServerInstallFailedError or + // ServerInstallCanceledError if installation fails or is canceled. + monitorInstallProgress(): AsyncGenerator; + // Returns server host object. + getHost(): ManagedServerHost; +} + +// The managed machine where the Outline Server is running. +export interface ManagedServerHost { + // Returns the monthly outbound transfer limit. + getMonthlyOutboundTransferLimit(): DataAmount; + // Returns the monthly cost. + getMonthlyCost(): MonetaryCost; + // Returns the server location + getCloudLocation(): CloudLocation; + // Deletes the server - cannot be undone. + delete(): Promise; +} + +export class DataAmount { + terabytes: number; +} + +export class MonetaryCost { + // Value in US dollars. + usd: number; +} + +// Configuration for manual servers. This is the output emitted from the +// shadowbox install script, which is needed for the manager connect to +// shadowbox. +export interface ManualServerConfig { + apiUrl: string; + certSha256?: string; +} + +// Repository of ManualServer objects. These are servers the user has setup +// themselves, and configured to run shadowbox, outside of the manager. +export interface ManualServerRepository { + // Lists all existing Shadowboxes. + listServers(): Promise; + // Adds a manual server using the config (e.g. user input). + addServer(config: ManualServerConfig): Promise; + // Retrieves a server with `config`. + findServer(config: ManualServerConfig): ManualServer | undefined; +} + +export type AccessKeyId = string; + +export interface AccessKey { + id: AccessKeyId; + name: string; + accessUrl: string; + dataLimit?: DataLimit; +} + +export type BytesByAccessKey = Map; + +// Data transfer allowance, measured in bytes. +// NOTE: Must be kept in sync with the definition in src/shadowbox/access_key.ts. +export interface DataLimit { + readonly bytes: number; +} diff --git a/server_manager/model/survey.ts b/server_manager/model/survey.ts new file mode 100644 index 0000000000..e412a9752a --- /dev/null +++ b/server_manager/model/survey.ts @@ -0,0 +1,20 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +export interface Surveys { + // Displays a survey when a server default data limit is set. + presentDataLimitsEnabledSurvey(): Promise; + // Displays a survey when a server default data limit is removed. + presentDataLimitsDisabledSurvey(): Promise; +} diff --git a/server_manager/package.json b/server_manager/package.json new file mode 100644 index 0000000000..e3f782ce99 --- /dev/null +++ b/server_manager/package.json @@ -0,0 +1,114 @@ +{ + "name": "outline-manager", + "productName": "Outline Manager", + "version": "0.0.0-debug", + "description": "Create and manage access to Outline servers", + "homepage": "https://getoutline.org/", + "author": { + "name": "The Outline authors", + "email": "info@getoutline.org" + }, + "build": { + "afterSign": "src/server_manager/electron_app/release/notarize.js", + "mac": { + "hardenedRuntime": true, + "entitlements": "src/server_manager/electron_app/release/macos.entitlements", + "entitlementsInherit": "src/server_manager/electron_app/release/macos.entitlements" + } + }, + "dependencies": { + "@polymer/app-layout": "^3.1.0", + "@polymer/app-localize-behavior": "^3.0.1", + "@polymer/font-roboto": "^3.0.2", + "@polymer/iron-autogrow-textarea": "^3.0.3", + "@polymer/iron-collapse": "^3.0.1", + "@polymer/iron-fit-behavior": "^3.1.0", + "@polymer/iron-icon": "^3.0.1", + "@polymer/iron-icons": "^3.0.1", + "@polymer/iron-pages": "^3.0.1", + "@polymer/paper-button": "^3.0.1", + "@polymer/paper-checkbox": "^3.1.0", + "@polymer/paper-dialog": "^3.0.1", + "@polymer/paper-dialog-scrollable": "^3.0.1", + "@polymer/paper-dropdown-menu": "^3.2.0", + "@polymer/paper-icon-button": "^3.0.2", + "@polymer/paper-input": "^3.2.1", + "@polymer/paper-item": "^3.0.1", + "@polymer/paper-listbox": "^3.0.1", + "@polymer/paper-progress": "^3.0.1", + "@polymer/paper-tabs": "^3.1.0", + "@polymer/paper-toast": "^3.0.1", + "@polymer/paper-tooltip": "^3.0.1", + "@sentry/electron": "^4.17.0", + "@webcomponents/webcomponentsjs": "^2.8.0", + "circle-flags": "github:HatScripts/circle-flags", + "clipboard-polyfill": "^2.8.6", + "dotenv": "~8.2.0", + "electron-updater": "^4.6.5", + "express": "^4.18.2", + "google-auth-library": "^8.9.0", + "intl-messageformat": "^7.8.4", + "jsonic": "^0.3.1", + "lit": "^3.1.2", + "lit-element": "^2.5.1", + "node-forge": "^1.3.1", + "request": "^2.88.2", + "web-animations-js": "^2.3.2" + }, + "comments": { + "config": { + "PUPPETEER_CHROMIUM_REVISION": [ + "The Chromium revision number used by Karma. This should always be the revision number of", + "the bundled Chromium in our version of Electron. Whenever upgrading Electron, run the", + "server_manager tests. You'll get a failure that looks like .", + "Set PUPPETEER_CHROMIUM_REVISION to the first of those numbers to get the correct revision", + "and `npm ci` to re-install puppeteer, causing it to download the new", + "Chromium version." + ] + } + }, + "config": { + "PUPPETEER_CHROMIUM_REVISION": 992738 + }, + "devDependencies": { + "@types/node": "^16.11.29", + "@types/node-forge": "^1.0.2", + "@types/polymer": "^1.2.9", + "@types/puppeteer": "^5.4.2", + "@types/request": "^2.47.1", + "@types/semver": "^5.5.0", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.8.1", + "electron": "19.1.9", + "electron-builder": "^24.9.1", + "electron-icon-maker": "^0.0.4", + "electron-notarize": "^1.2.1", + "electron-to-chromium": "^1.4.328", + "gulp": "^4.0.0", + "gulp-posthtml": "^3.0.4", + "gulp-replace": "^1.0.0", + "html-webpack-plugin": "^5.5.3", + "karma": "^6.3.16", + "karma-chrome-launcher": "^3.1.0", + "karma-jasmine": "^4.0.1", + "karma-webpack": "^5.0.0", + "node-jq": "^1.11.2", + "postcss": "^7.0.29", + "postcss-rtl": "^1.7.3", + "posthtml-postcss": "^0.2.6", + "puppeteer": "^13.6.0", + "style-loader": "^3.3.3", + "ts-loader": "^9.5.0", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1", + "webpack-node-externals": "^3.0.0" + }, + "resolutions": { + "inherits": "2.0.3", + "samsam": "1.1.3", + "supports-color": "3.1.2", + "type-detect": "1.0.0" + }, + "license": "Apache" +} diff --git a/server_manager/test.action.sh b/server_manager/test.action.sh new file mode 100755 index 0000000000..f592d39d82 --- /dev/null +++ b/server_manager/test.action.sh @@ -0,0 +1,28 @@ +#!/bin/bash -eu +# +# Copyright 2018 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +readonly TEST_DIR="${BUILD_DIR}/js/server_manager/" +rm -rf "${TEST_DIR}" + +npm run action server_manager/web_app/build_install_script + +# Use commonjs modules, jasmine runs in node. +tsc -p "${ROOT_DIR}/src/server_manager" --outDir "${TEST_DIR}" --module commonjs +jasmine --config="${ROOT_DIR}/jasmine.json" + +npm run action server_manager/web_app/test + +rm -rf "${TEST_DIR}" diff --git a/server_manager/tsconfig.json b/server_manager/tsconfig.json new file mode 100644 index 0000000000..6f84d54eac --- /dev/null +++ b/server_manager/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es2018", + "removeComments": false, + "noImplicitAny": true, + "noImplicitThis": true, + "moduleResolution": "Node", + "sourceMap": true, + "experimentalDecorators": true, + "allowJs": true, + "resolveJsonModule": true, + "noUnusedLocals": true, + "skipLibCheck": true + }, + "rootDir": ".", + "include": ["**/*.ts"], + "exclude": [ + "node_modules", + "web_app/gallery_app", + // FIXME: these tests fail with a runtime error because app.ts depends on + // polymer, which targets the browser and uses ES6 imports. + "web_app/app.spec.ts" + ] +} diff --git a/server_manager/types/electron-to-chromium.d.ts b/server_manager/types/electron-to-chromium.d.ts new file mode 100644 index 0000000000..0ee32b18f8 --- /dev/null +++ b/server_manager/types/electron-to-chromium.d.ts @@ -0,0 +1,20 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Typings for: +// https://www.npmjs.com/package/electron-to-chromium + +declare module 'electron-to-chromium' { + export function electronToChromium(s: string): string; +} diff --git a/server_manager/types/jsonic.d.ts b/server_manager/types/jsonic.d.ts new file mode 100644 index 0000000000..4a712ae13f --- /dev/null +++ b/server_manager/types/jsonic.d.ts @@ -0,0 +1,22 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Typings for: +// https://www.npmjs.com/package/jsonic + +declare module 'jsonic' { + function parse(s: string): {}; + namespace parse {} + export = parse; +} diff --git a/server_manager/types/preload.d.ts b/server_manager/types/preload.d.ts new file mode 100644 index 0000000000..339e24b091 --- /dev/null +++ b/server_manager/types/preload.d.ts @@ -0,0 +1,44 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Functions made available to the renderer process via preload.ts. + +type SentryBreadcrumb = import('@sentry/electron').Breadcrumb; +declare function redactSentryBreadcrumbUrl(breadcrumb: SentryBreadcrumb): SentryBreadcrumb; + +type HttpRequest = import('../infrastructure/path_api').HttpRequest; +type HttpResponse = import('../infrastructure/path_api').HttpResponse; + +declare function fetchWithPin(request: HttpRequest, fingerprint: string): Promise; +declare function openImage(basename: string): void; +declare function onUpdateDownloaded(callback: () => void): void; + +// TODO: Move this back to digitalocean_oauth.ts, where it really belongs. +interface OauthSession { + // Resolves with the OAuth token if authentication was successful, otherwise rejects. + result: Promise; + // Returns true iff the session has been cancelled. + isCancelled(): boolean; + // Cancels the session, causing the result promise to reject and isCancelled to return true. + cancel(): void; +} + +declare function runDigitalOceanOauth(): OauthSession; + +declare function runGcpOauth(): OauthSession; + +declare function bringToFront(): void; + +// From base.webpack.js. +declare const outline: {gcpAuthEnabled: boolean}; diff --git a/server_manager/web_app/app.spec.ts b/server_manager/web_app/app.spec.ts new file mode 100644 index 0000000000..00658cfc26 --- /dev/null +++ b/server_manager/web_app/app.spec.ts @@ -0,0 +1,151 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import './ui_components/app-root'; + +import * as accounts from '../model/accounts'; +import * as server from '../model/server'; + +import {App, LAST_DISPLAYED_SERVER_STORAGE_KEY} from './app'; +import {FakeCloudAccounts, FakeDigitalOceanAccount, FakeManualServerRepository} from './testing/models'; +import {AppRoot} from './ui_components/app-root'; +import {Region} from '../model/digitalocean'; + +// Define functions from preload.ts. +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(global as any).onUpdateDownloaded = () => {}; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(global as any).bringToFront = () => {}; + +// Inject app-root element into DOM once before each test. +beforeEach(() => { + document.body.innerHTML = ""; +}); + +describe('App', () => { + it('shows intro when starting with no manual servers or DigitalOcean token', async () => { + const appRoot = document.getElementById('appRoot') as AppRoot; + const app = createTestApp(appRoot); + await app.start(); + expect(appRoot.currentPage).toEqual('intro'); + }); + + it('will not create a manual server with invalid input', async () => { + // Create a new app with no existing servers or DigitalOcean token. + const appRoot = document.getElementById('appRoot') as AppRoot; + const app = createTestApp(appRoot); + await app.start(); + expect(appRoot.currentPage).toEqual('intro'); + await expectAsync(app.createManualServer('bad input')).toBeRejectedWithError(); + }); + + it('creates a manual server with valid input', async () => { + // Create a new app with no existing servers or DigitalOcean token. + const appRoot = document.getElementById('appRoot') as AppRoot; + const app = createTestApp(appRoot); + await app.start(); + expect(appRoot.currentPage).toEqual('intro'); + await app.createManualServer(JSON.stringify({certSha256: 'cert', apiUrl: 'url'})); + expect(appRoot.currentPage).toEqual('serverView'); + }); + + it('initially shows servers', async () => { + // Create fake servers and simulate their metadata being cached before creating the app. + const fakeAccount = new FakeDigitalOceanAccount(); + await fakeAccount.createServer(new Region('_fake-region-id')); + const cloudAccounts = new FakeCloudAccounts(fakeAccount); + + const manualServerRepo = new FakeManualServerRepository(); + await manualServerRepo.addServer({certSha256: 'cert', apiUrl: 'fake-manual-server-api-url-1'}); + await manualServerRepo.addServer({certSha256: 'cert', apiUrl: 'fake-manual-server-api-url-2'}); + + const appRoot = document.getElementById('appRoot') as AppRoot; + expect(appRoot.serverList.length).toEqual(0); + const app = createTestApp(appRoot, cloudAccounts, manualServerRepo); + + await app.start(); + // Validate that server metadata is shown. + const managedServers = await fakeAccount.listServers(); + expect(managedServers.length).toEqual(1); + const manualServers = await manualServerRepo.listServers(); + expect(manualServers.length).toEqual(2); + await appRoot.getServerView(''); + const serverList = appRoot.serverList; + + console.log(`managedServers.length: ${managedServers.length}`); + console.log(`manualServers.length: ${manualServers.length}`); + + expect(serverList.length).toEqual(manualServers.length + managedServers.length); + expect(serverList).toContain(jasmine.objectContaining({id: 'fake-manual-server-api-url-1'})); + expect(serverList).toContain(jasmine.objectContaining({id: 'fake-manual-server-api-url-2'})); + expect(serverList).toContain(jasmine.objectContaining({id: '_fake-region-id'})); + }); + + it('initially shows the last selected server', async () => { + const LAST_DISPLAYED_SERVER_ID = 'fake-manual-server-api-url-1'; + const manualServerRepo = new FakeManualServerRepository(); + const lastDisplayedServer = await manualServerRepo.addServer({ + certSha256: 'cert', + apiUrl: LAST_DISPLAYED_SERVER_ID, + }); + await manualServerRepo.addServer({certSha256: 'cert', apiUrl: 'fake-manual-server-api-url-2'}); + localStorage.setItem('lastDisplayedServer', LAST_DISPLAYED_SERVER_ID); + const appRoot = document.getElementById('appRoot') as AppRoot; + const app = createTestApp(appRoot, null, manualServerRepo); + await app.start(); + expect(appRoot.currentPage).toEqual('serverView'); + expect(appRoot.selectedServerId).toEqual(lastDisplayedServer.getManagementApiUrl()); + }); + + it('shows progress screen once DigitalOcean droplets are created', async () => { + // Start the app with a fake DigitalOcean token. + const appRoot = document.getElementById('appRoot') as AppRoot; + const cloudAccounts = new FakeCloudAccounts(new FakeDigitalOceanAccount()); + const app = createTestApp(appRoot, cloudAccounts); + await app.start(); + await app.createDigitalOceanServer(new Region('_fake-region-id')); + expect(appRoot.currentPage).toEqual('serverView'); + const view = await appRoot.getServerView(appRoot.selectedServerId); + expect(view.selectedPage).toEqual('progressView'); + }); + + it('shows progress screen when starting with DigitalOcean servers still being created', async () => { + const appRoot = document.getElementById('appRoot') as AppRoot; + const fakeAccount = new FakeDigitalOceanAccount(); + const server = await fakeAccount.createServer(new Region('_fake-region-id')); + const cloudAccounts = new FakeCloudAccounts(fakeAccount); + const app = createTestApp(appRoot, cloudAccounts, null); + // Sets last displayed server. + localStorage.setItem(LAST_DISPLAYED_SERVER_STORAGE_KEY, server.getId()); + await app.start(); + expect(appRoot.currentPage).toEqual('serverView'); + const view = await appRoot.getServerView(appRoot.selectedServerId); + expect(view.selectedPage).toEqual('progressView'); + }); +}); + +function createTestApp( + appRoot: AppRoot, + cloudAccounts?: accounts.CloudAccounts, + manualServerRepo?: server.ManualServerRepository +) { + const VERSION = '0.0.1'; + if (!cloudAccounts) { + cloudAccounts = new FakeCloudAccounts(); + } + if (!manualServerRepo) { + manualServerRepo = new FakeManualServerRepository(); + } + return new App(appRoot, VERSION, manualServerRepo, cloudAccounts); +} diff --git a/server_manager/web_app/app.ts b/server_manager/web_app/app.ts new file mode 100644 index 0000000000..bd4d47823e --- /dev/null +++ b/server_manager/web_app/app.ts @@ -0,0 +1,1281 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as Sentry from '@sentry/electron/renderer'; +import * as semver from 'semver'; + +import * as digitalocean_api from '../cloud/digitalocean_api'; +import * as path_api from '../infrastructure/path_api'; +import {sleep} from '../infrastructure/sleep'; +import * as accounts from '../model/accounts'; +import * as digitalocean from '../model/digitalocean'; +import * as gcp from '../model/gcp'; +import * as server_model from '../model/server'; + +import {DisplayDataAmount, displayDataAmountToBytes} from './data_formatting'; +import {filterOptions, getShortName} from './location_formatting'; +import {parseManualServerConfig} from './management_urls'; +import {HttpError} from '../cloud/gcp_api'; + +import type {CloudLocation} from '../model/location'; +import type {AppRoot, ServerListEntry} from './ui_components/app-root'; +import type {FeedbackDetail} from './ui_components/outline-feedback-dialog'; +import type {DisplayAccessKey, ServerView} from './ui_components/outline-server-view'; +import {CustomError} from '../infrastructure/custom_error'; + +// The Outline DigitalOcean team's referral code: +// https://www.digitalocean.com/help/referral-program/ +//const UNUSED_DIGITALOCEAN_REFERRAL_CODE = '5ddb4219b716'; + +const CHANGE_KEYS_PORT_VERSION = '1.0.0'; +const DATA_LIMITS_VERSION = '1.1.0'; +const CHANGE_HOSTNAME_VERSION = '1.2.0'; +const KEY_SETTINGS_VERSION = '1.6.0'; +const MAX_ACCESS_KEY_DATA_LIMIT_BYTES = 50 * 10 ** 9; // 50GB +const CANCELLED_ERROR = new Error('Cancelled'); +export const LAST_DISPLAYED_SERVER_STORAGE_KEY = 'lastDisplayedServer'; + +// todo (#1311): we are referencing `@sentry/electron` which won't work for +// web_app. It's ok for now cuz we don't need to enable Sentry in +// web_app, but a better solution is to have separate two entry +// points: electron_main (uses `@sentry/electron`) and web_main +// (uses `@sentry/browser`). +// For all other Sentry config see the main process. +Sentry.init({ + beforeBreadcrumb: typeof redactSentryBreadcrumbUrl === 'function' ? redactSentryBreadcrumbUrl : null, +}); + +function displayDataAmountToDataLimit(dataAmount: DisplayDataAmount): server_model.DataLimit | null { + if (!dataAmount) { + return null; + } + + return {bytes: displayDataAmountToBytes(dataAmount)}; +} + +// Compute the suggested data limit based on the server's transfer capacity and number of access +// keys. +async function computeDefaultDataLimit( + server: server_model.Server, + accessKeys?: server_model.AccessKey[] +): Promise { + try { + // Assume non-managed servers have a data transfer capacity of 1TB. + let serverTransferCapacity: server_model.DataAmount = {terabytes: 1}; + if (isManagedServer(server)) { + serverTransferCapacity = server.getHost().getMonthlyOutboundTransferLimit() ?? serverTransferCapacity; + } + if (!accessKeys) { + accessKeys = await server.listAccessKeys(); + } + let dataLimitBytes = (serverTransferCapacity.terabytes * 10 ** 12) / (accessKeys.length || 1); + if (dataLimitBytes > MAX_ACCESS_KEY_DATA_LIMIT_BYTES) { + dataLimitBytes = MAX_ACCESS_KEY_DATA_LIMIT_BYTES; + } + return {bytes: dataLimitBytes}; + } catch (e) { + console.error(`Failed to compute default access key data limit: ${e}`); + return {bytes: MAX_ACCESS_KEY_DATA_LIMIT_BYTES}; + } +} + +// Returns whether the user has seen a notification for the updated feature metrics data collection +// policy. +function hasSeenFeatureMetricsNotification(): boolean { + return ( + !!window.localStorage.getItem('dataLimitsHelpBubble-dismissed') && + !!window.localStorage.getItem('dataLimits-feature-collection-notification') + ); +} + +async function showHelpBubblesOnce(serverView: ServerView) { + if (!window.localStorage.getItem('getConnectedHelpBubble-dismissed')) { + await serverView.showGetConnectedHelpBubble(); + window.localStorage.setItem('getConnectedHelpBubble-dismissed', 'true'); + } + if (!window.localStorage.getItem('addAccessKeyHelpBubble-dismissed')) { + await serverView.showAddAccessKeyHelpBubble(); + window.localStorage.setItem('addAccessKeyHelpBubble-dismissed', 'true'); + } + if (!window.localStorage.getItem('dataLimitsHelpBubble-dismissed') && serverView.supportsDefaultDataLimit) { + await serverView.showDataLimitsHelpBubble(); + window.localStorage.setItem('dataLimitsHelpBubble-dismissed', 'true'); + } +} + +function isManagedServer(testServer: server_model.Server): testServer is server_model.ManagedServer { + return !!(testServer as server_model.ManagedServer).getHost; +} + +function isManualServer(testServer: server_model.Server): testServer is server_model.ManualServer { + return !!(testServer as server_model.ManualServer).forget; +} + +// Error thrown when a shadowbox server cannot be reached (e.g. due to Firewall) +class UnreachableServerError extends CustomError { + constructor(message?: string) { + super(message); + } +} + +export class App { + private digitalOceanAccount: digitalocean.Account; + private gcpAccount: gcp.Account; + private selectedServer: server_model.Server; + private idServerMap = new Map(); + + constructor( + private appRoot: AppRoot, + private readonly version: string, + private manualServerRepository: server_model.ManualServerRepository, + private cloudAccounts: accounts.CloudAccounts + ) { + appRoot.setAttribute('outline-version', this.version); + + appRoot.addEventListener('ConnectDigitalOceanAccountRequested', (_: CustomEvent) => { + this.handleConnectDigitalOceanAccountRequest(); + }); + appRoot.addEventListener('CreateDigitalOceanServerRequested', (_: CustomEvent) => { + const digitalOceanAccount = this.cloudAccounts.getDigitalOceanAccount(); + if (digitalOceanAccount) { + this.showDigitalOceanCreateServer(digitalOceanAccount); + } else { + console.error('Access token not found for server creation'); + this.handleConnectDigitalOceanAccountRequest(); + } + }); + appRoot.addEventListener('ConnectGcpAccountRequested', async (_: CustomEvent) => + this.handleConnectGcpAccountRequest() + ); + appRoot.addEventListener('CreateGcpServerRequested', async (_: CustomEvent) => { + this.appRoot.getAndShowGcpCreateServerApp().start(this.gcpAccount); + }); + appRoot.addEventListener('GcpServerCreated', (event: CustomEvent) => { + const server = event.detail.server; + this.addServer(this.gcpAccount.getId(), server); + this.showServer(server); + }); + appRoot.addEventListener('DigitalOceanSignOutRequested', (_: CustomEvent) => { + this.disconnectDigitalOceanAccount(); + this.showIntro(); + }); + appRoot.addEventListener('GcpSignOutRequested', (_: CustomEvent) => { + this.disconnectGcpAccount(); + this.showIntro(); + }); + + appRoot.addEventListener('SetUpDigitalOceanServerRequested', (event: CustomEvent) => { + this.createDigitalOceanServer(event.detail.region); + }); + + appRoot.addEventListener('DeleteServerRequested', (event: CustomEvent) => { + this.deleteServer(event.detail.serverId); + }); + + appRoot.addEventListener('ForgetServerRequested', (event: CustomEvent) => { + this.forgetServer(event.detail.serverId); + }); + + appRoot.addEventListener('AddAccessKeyRequested', (_: CustomEvent) => { + this.addAccessKey(); + }); + + appRoot.addEventListener('RemoveAccessKeyRequested', (event: CustomEvent) => { + this.removeAccessKey(event.detail.accessKeyId); + }); + + appRoot.addEventListener('OpenPerKeyDataLimitDialogRequested', this.openPerKeyDataLimitDialog.bind(this)); + + appRoot.addEventListener('RenameAccessKeyRequested', (event: CustomEvent) => { + this.renameAccessKey(event.detail.accessKeyId, event.detail.newName, event.detail.entry); + }); + + appRoot.addEventListener('SetDefaultDataLimitRequested', (event: CustomEvent) => { + this.setDefaultDataLimit(displayDataAmountToDataLimit(event.detail.limit)); + }); + + appRoot.addEventListener('RemoveDefaultDataLimitRequested', (_: CustomEvent) => { + this.removeDefaultDataLimit(); + }); + + appRoot.addEventListener('ChangePortForNewAccessKeysRequested', (event: CustomEvent) => { + this.setPortForNewAccessKeys(event.detail.validatedInput, event.detail.ui); + }); + + appRoot.addEventListener('ChangeHostnameForAccessKeysRequested', (event: CustomEvent) => { + this.setHostnameForAccessKeys(event.detail.validatedInput, event.detail.ui); + }); + + // The UI wants us to validate a server management URL. + // "Reply" by setting a field on the relevant template. + appRoot.addEventListener('ManualServerEdited', (event: CustomEvent) => { + let isValid = true; + try { + parseManualServerConfig(event.detail.userInput); + } catch (e) { + isValid = false; + } + const manualServerEntryEl = appRoot.getManualServerEntry(); + manualServerEntryEl.enableDoneButton = isValid; + }); + + appRoot.addEventListener('ManualServerEntered', (event: CustomEvent) => { + const userInput = event.detail.userInput; + const manualServerEntryEl = appRoot.getManualServerEntry(); + this.createManualServer(userInput) + .then(() => { + // Clear fields on outline-manual-server-entry (e.g. dismiss the connecting popup). + manualServerEntryEl.clear(); + }) + .catch((e: Error) => { + // Remove the progress indicator. + manualServerEntryEl.showConnection = false; + // Display either error dialog or feedback depending on error type. + if (e instanceof UnreachableServerError) { + const errorTitle = appRoot.localize('error-server-unreachable-title'); + const errorMessage = appRoot.localize('error-server-unreachable'); + this.appRoot.showManualServerError(errorTitle, errorMessage); + } else { + // TODO(alalama): with UI validation, this code path never gets executed. Remove? + let errorMessage = ''; + if (e.message) { + errorMessage += `${e.message}\n`; + } + if (userInput) { + errorMessage += userInput; + } + appRoot.openManualInstallFeedback(errorMessage); + } + }); + }); + + appRoot.addEventListener('EnableMetricsRequested', (_: CustomEvent) => { + this.setMetricsEnabled(true); + }); + + appRoot.addEventListener('DisableMetricsRequested', (_: CustomEvent) => { + this.setMetricsEnabled(false); + }); + + appRoot.addEventListener('SubmitFeedback', (event: CustomEvent) => { + const detail: FeedbackDetail = event.detail; + try { + Sentry.captureEvent({ + message: detail.userFeedback, + user: {email: detail.userEmail}, + tags: {category: detail.feedbackCategory, cloudProvider: detail.cloudProvider}, + }); + appRoot.showNotification(appRoot.localize('notification-feedback-thanks')); + } catch (e) { + console.error(`Failed to submit feedback: ${e}`); + appRoot.showError(appRoot.localize('error-feedback')); + } + }); + + appRoot.addEventListener('SetLanguageRequested', (event: CustomEvent) => { + this.setAppLanguage(event.detail.languageCode, event.detail.languageDir); + }); + + appRoot.addEventListener('ServerRenameRequested', (event: CustomEvent) => { + this.renameServer(event.detail.newName); + }); + + appRoot.addEventListener('CancelServerCreationRequested', (_: CustomEvent) => { + this.cancelServerCreation(this.selectedServer); + }); + + appRoot.addEventListener('OpenImageRequested', (event: CustomEvent) => { + openImage(event.detail.imagePath); + }); + + appRoot.addEventListener('OpenShareDialogRequested', (event: CustomEvent) => { + const accessKey = event.detail.accessKey; + this.appRoot.openShareDialog(accessKey, this.getS3InviteUrl(accessKey)); + }); + + appRoot.addEventListener('OpenGetConnectedDialogRequested', (event: CustomEvent) => { + this.appRoot.openGetConnectedDialog(this.getS3InviteUrl(event.detail.accessKey, true)); + }); + + appRoot.addEventListener('ShowServerRequested', (event: CustomEvent) => { + const server = this.getServerById(event.detail.displayServerId); + if (server) { + this.showServer(server); + } else { + // This should never happen if we are managine the list correctly. + console.error(`Could not find server for display server ID ${event.detail.displayServerId}`); + } + }); + + onUpdateDownloaded(this.displayAppUpdateNotification.bind(this)); + } + + // Shows the intro screen with overview and options to sign in or sign up. + private showIntro() { + this.appRoot.showIntro(); + } + + private displayAppUpdateNotification() { + this.appRoot.showNotification(this.appRoot.localize('notification-app-update'), 60000); + } + + async start(): Promise { + this.showIntro(); + + // Load connected accounts and servers. + await Promise.all([ + this.loadDigitalOceanAccount(this.cloudAccounts.getDigitalOceanAccount()), + this.loadGcpAccount(this.cloudAccounts.getGcpAccount()), + this.loadManualServers(), + ]); + + // Show last displayed server, if any. + const serverIdToSelect = localStorage.getItem(LAST_DISPLAYED_SERVER_STORAGE_KEY); + if (serverIdToSelect) { + const serverToShow = this.getServerById(serverIdToSelect); + if (serverToShow) { + this.showServer(serverToShow); + } + } + } + + private async loadDigitalOceanAccount( + digitalOceanAccount: digitalocean.Account + ): Promise { + if (!digitalOceanAccount) { + return []; + } + let showedWarning = false; + try { + this.digitalOceanAccount = digitalOceanAccount; + this.appRoot.digitalOceanAccount = { + id: this.digitalOceanAccount.getId(), + name: await this.digitalOceanAccount.getName(), + }; + const status = await this.digitalOceanAccount.getStatus(); + if (status.warning) { + this.showDigitalOceanWarning(status); + showedWarning = true; + } + const servers = await this.digitalOceanAccount.listServers(); + for (const server of servers) { + this.addServer(this.digitalOceanAccount.getId(), server); + } + return servers; + } catch (error) { + // TODO(fortuna): Handle expired token. + if (!showedWarning) { + this.appRoot.showError(this.appRoot.localize('error-do-account-info')); + } + console.error('Failed to load DigitalOcean Account:', error); + } + return []; + } + + private showDigitalOceanWarning(status: digitalocean.Status) { + this.appRoot.showError(this.appRoot.localize('error-do-warning', 'message', status.warning)); + } + + private async loadGcpAccount(gcpAccount: gcp.Account): Promise { + if (!gcpAccount) { + return []; + } + + this.gcpAccount = gcpAccount; + this.appRoot.gcpAccount = { + id: this.gcpAccount.getId(), + name: await this.gcpAccount.getName(), + }; + + const result = []; + const gcpProjects = await this.gcpAccount.listProjects(); + for (const gcpProject of gcpProjects) { + try { + const servers = await this.gcpAccount.listServers(gcpProject.id); + for (const server of servers) { + this.addServer(this.gcpAccount.getId(), server); + result.push(server); + } + } catch (e) { + if (e instanceof HttpError && e.getStatusCode() === 403) { + // listServers() throws an HTTP 403 if the outline project has been + // created but the billing account has been removed, which can + // easily happen after the free trial period expires. This is + // harmless, because a project with no billing cannot contain any + // servers, and the GCP server creation flow will check and correct + // the billing account setup. + console.warn(`Ignoring HTTP 403 for GCP project "${gcpProject.id}"`); + } else { + throw e; + } + } + } + return result; + } + + private async loadManualServers() { + for (const server of await this.manualServerRepository.listServers()) { + this.addServer(null, server); + } + } + + private makeServerListEntry(accountId: string, server: server_model.Server): ServerListEntry { + return { + id: server.getId(), + accountId, + name: this.makeDisplayName(server), + isSynced: !!server.getName(), + }; + } + + private makeDisplayName(server: server_model.Server): string { + let name = server.getName() ?? server.getHostnameForAccessKeys(); + if (!name) { + let cloudLocation = null; + // Newly created servers will not have a name. + if (isManagedServer(server)) { + cloudLocation = server.getHost().getCloudLocation(); + } + name = this.makeLocalizedServerName(cloudLocation); + } + return name; + } + + private addServer(accountId: string, server: server_model.Server): void { + console.log('Loading server', server); + this.idServerMap.set(server.getId(), server); + const serverEntry = this.makeServerListEntry(accountId, server); + this.appRoot.serverList = this.appRoot.serverList.concat([serverEntry]); + + if (isManagedServer(server)) { + this.setServerProgressView(server); + } + + // Once the server is added to the list, do the rest asynchronously. + setTimeout(async () => { + // Wait for server config to load, then update the server view and list. + if (isManagedServer(server)) { + try { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for await (const _ of server.monitorInstallProgress()) { + /* empty */ + } + } catch (error) { + if (error instanceof server_model.ServerInstallCanceledError) { + // User clicked "Cancel" on the loading screen. + return; + } + console.log('Server creation failed', error); + this.appRoot.showError(this.appRoot.localize('error-server-creation')); + } + } + await this.updateServerView(server); + // This has to run after updateServerView because it depends on the isHealthy() call. + // TODO(fortuna): Better handle state changes. + this.updateServerEntry(server); + }, 0); + } + + private removeServer(serverId: string): void { + this.idServerMap.delete(serverId); + this.appRoot.serverList = this.appRoot.serverList.filter(ds => ds.id !== serverId); + if (this.appRoot.selectedServerId === serverId) { + this.appRoot.selectedServerId = ''; + this.selectedServer = null; + localStorage.removeItem(LAST_DISPLAYED_SERVER_STORAGE_KEY); + } + } + + private updateServerEntry(server: server_model.Server): void { + this.appRoot.serverList = this.appRoot.serverList.map(ds => + ds.id === server.getId() ? this.makeServerListEntry(ds.accountId, server) : ds + ); + } + + private getServerById(serverId: string): server_model.Server { + return this.idServerMap.get(serverId); + } + + // Returns a promise that resolves when the account is active. + // Throws CANCELLED_ERROR on cancellation, and the error on failure. + private async ensureActiveDigitalOceanAccount(digitalOceanAccount: digitalocean.Account): Promise { + let cancelled = false; + let activatingAccount = false; + + // TODO(fortuna): Provide a cancel action instead of sign out. + const signOutAction = () => { + cancelled = true; + this.disconnectDigitalOceanAccount(); + }; + const oauthUi = this.appRoot.getDigitalOceanOauthFlow(signOutAction); + for (;;) { + const status = await this.digitalOceanRetry(async () => { + if (cancelled) { + throw CANCELLED_ERROR; + } + return await digitalOceanAccount.getStatus(); + }); + if (status.needsBillingInfo) { + oauthUi.showBilling(); + } else if (status.needsEmailVerification) { + oauthUi.showEmailVerification(); + } else { + if (status.warning) { + this.showDigitalOceanWarning(status); + } + bringToFront(); + if (activatingAccount) { + // Show the 'account active' screen for a few seconds if the account was activated + // during this session. + oauthUi.showAccountActive(); + await sleep(1500); + } + return; + } + this.appRoot.showDigitalOceanOauthFlow(); + activatingAccount = true; + await sleep(1000); + if (this.appRoot.currentPage !== 'digitalOceanOauth') { + // The user navigated away. + cancelled = true; + } + if (cancelled) { + throw CANCELLED_ERROR; + } + } + } + + // Intended to add a "retry or re-authenticate?" prompt to DigitalOcean + // operations. Specifically, any operation rejecting with an digitalocean_api.XhrError will + // result in a dialog asking the user whether to retry the operation or + // re-authenticate against DigitalOcean. + // This is necessary because an access token may expire or be revoked at + // any time and there's no way to programmatically distinguish network errors + // from CORS-type errors (see the comments in DigitalOceanSession for more + // information). + // TODO: It would be great if, once the user has re-authenticated, we could + // return the UI to its exact prior state. Fortunately, the most likely + // time to discover an invalid access token is when the application + // starts. + private digitalOceanRetry = (f: () => Promise): Promise => { + return f().catch(e => { + if (!(e instanceof digitalocean_api.XhrError)) { + return Promise.reject(e); + } + + return new Promise((resolve, reject) => { + this.appRoot.showConnectivityDialog((retry: boolean) => { + if (retry) { + this.digitalOceanRetry(f).then(resolve, reject); + } else { + this.disconnectDigitalOceanAccount(); + reject(e); + } + }); + }); + }); + }; + + // Runs the DigitalOcean OAuth flow and returns the API access token. + // Throws CANCELLED_ERROR on cancellation, or the error in case of failure. + private async runDigitalOceanOauthFlow(): Promise { + const oauth = runDigitalOceanOauth(); + const handleOauthFlowCancelled = () => { + oauth.cancel(); + this.disconnectDigitalOceanAccount(); + this.showIntro(); + }; + this.appRoot.getAndShowDigitalOceanOauthFlow(handleOauthFlowCancelled); + try { + // DigitalOcean tokens expire after 30 days, unless they are manually + // revoked by the user. After 30 days the user will have to sign into + // DigitalOcean again. Note we cannot yet use DigitalOcean refresh + // tokens, as they require a client_secret to be stored on a server and + // not visible to end users in client-side JS. More details at: + // https://developers.digitalocean.com/documentation/oauth/#refresh-token-flow + return await oauth.result; + } catch (error) { + if (oauth.isCancelled()) { + throw CANCELLED_ERROR; + } else { + throw error; + } + } + } + + // Runs the GCP OAuth flow and returns the API refresh token (which can be + // exchanged for an access token). + // Throws CANCELLED_ERROR on cancellation, or the error in case of failure. + private async runGcpOauthFlow(): Promise { + const oauth = runGcpOauth(); + const handleOauthFlowCancelled = () => { + oauth.cancel(); + this.disconnectGcpAccount(); + this.showIntro(); + }; + this.appRoot.getAndShowGcpOauthFlow(handleOauthFlowCancelled); + try { + return await oauth.result; + } catch (error) { + if (oauth.isCancelled()) { + throw CANCELLED_ERROR; + } else { + throw error; + } + } + } + + private async handleConnectDigitalOceanAccountRequest(): Promise { + let digitalOceanAccount: digitalocean.Account = null; + try { + const accessToken = await this.runDigitalOceanOauthFlow(); + bringToFront(); + digitalOceanAccount = this.cloudAccounts.connectDigitalOceanAccount(accessToken); + } catch (error) { + this.disconnectDigitalOceanAccount(); + this.showIntro(); + bringToFront(); + if (error !== CANCELLED_ERROR) { + console.error(`DigitalOcean authentication failed: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-do-auth')); + } + return; + } + + const doServers = await this.loadDigitalOceanAccount(digitalOceanAccount); + if (doServers.length > 0) { + this.showServer(doServers[0]); + } else { + await this.showDigitalOceanCreateServer(this.digitalOceanAccount); + } + } + + private async handleConnectGcpAccountRequest(): Promise { + let gcpAccount: gcp.Account = null; + try { + const refreshToken = await this.runGcpOauthFlow(); + bringToFront(); + gcpAccount = this.cloudAccounts.connectGcpAccount(refreshToken); + } catch (error) { + this.disconnectGcpAccount(); + this.showIntro(); + bringToFront(); + if (error !== CANCELLED_ERROR) { + console.error(`GCP authentication failed: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-gcp-auth')); + } + return; + } + + const gcpServers = await this.loadGcpAccount(gcpAccount); + if (gcpServers.length > 0) { + this.showServer(gcpServers[0]); + } else { + this.appRoot.getAndShowGcpCreateServerApp().start(this.gcpAccount); + } + } + + // Clears the DigitalOcean credentials and returns to the intro screen. + private disconnectDigitalOceanAccount(): void { + if (!this.digitalOceanAccount) { + // Not connected. + return; + } + const accountId = this.digitalOceanAccount.getId(); + this.cloudAccounts.disconnectDigitalOceanAccount(); + this.digitalOceanAccount = null; + for (const serverEntry of this.appRoot.serverList) { + if (serverEntry.accountId === accountId) { + this.removeServer(serverEntry.id); + } + } + this.appRoot.digitalOceanAccount = null; + } + + // Clears the GCP credentials and returns to the intro screen. + private disconnectGcpAccount(): void { + if (!this.gcpAccount) { + // Not connected. + return; + } + const accountId = this.gcpAccount.getId(); + this.cloudAccounts.disconnectGcpAccount(); + this.gcpAccount = null; + for (const serverEntry of this.appRoot.serverList) { + if (serverEntry.accountId === accountId) { + this.removeServer(serverEntry.id); + } + } + this.appRoot.gcpAccount = null; + } + + // Opens the screen to create a server. + private async showDigitalOceanCreateServer(digitalOceanAccount: digitalocean.Account): Promise { + try { + await this.ensureActiveDigitalOceanAccount(digitalOceanAccount); + } catch (error) { + if (this.appRoot.currentPage === 'digitalOceanOauth') { + this.showIntro(); + } + if (error !== CANCELLED_ERROR) { + console.error('Failed to validate DigitalOcean account', error); + this.appRoot.showError(this.appRoot.localize('error-do-account-info')); + } + return; + } + + try { + const status = await digitalOceanAccount.getStatus(); + if (status.hasReachedLimit) { + this.appRoot.showError(this.appRoot.localize('error-do-limit', 'num', status.dropletLimit)); + return; // Don't proceed to the region picker. + } + } catch (e) { + console.error('Failed to check droplet limit status', e); + } + + try { + const regionPicker = this.appRoot.getAndShowRegionPicker(); + const map = await this.digitalOceanRetry(() => { + return this.digitalOceanAccount.listLocations(); + }); + regionPicker.options = filterOptions(map); + } catch (e) { + console.error(`Failed to get list of available regions: ${e}`); + this.appRoot.showError(this.appRoot.localize('error-do-regions')); + } + } + + // Returns a promise which fulfills once the DigitalOcean droplet is created. + // Shadowbox may not be fully installed once this promise is fulfilled. + public async createDigitalOceanServer(region: digitalocean.Region): Promise { + try { + const serverName = this.makeLocalizedServerName(region); + const server = await this.digitalOceanRetry(() => { + return this.digitalOceanAccount.createServer(region, serverName); + }); + this.addServer(this.digitalOceanAccount.getId(), server); + this.showServer(server); + } catch (error) { + console.error('Error from createDigitalOceanServer', error); + this.appRoot.showError(this.appRoot.localize('error-server-creation')); + } + } + + private makeLocalizedServerName(cloudLocation: CloudLocation): string { + const placeName = getShortName(cloudLocation, this.appRoot.localize as (id: string) => string); + return this.appRoot.localize('server-name', 'serverLocation', placeName); + } + + public showServer(server: server_model.Server): void { + this.selectedServer = server; + this.appRoot.selectedServerId = server.getId(); + localStorage.setItem(LAST_DISPLAYED_SERVER_STORAGE_KEY, server.getId()); + this.appRoot.showServerView(); + } + + private async updateServerView(server: server_model.Server): Promise { + if (await server.isHealthy()) { + this.setServerManagementView(server); + } else { + this.setServerUnreachableView(server); + } + } + + // Show the server management screen. Assumes the server is healthy. + private async setServerManagementView(server: server_model.Server): Promise { + // Show view and initialize fields from selectedServer. + const view = await this.appRoot.getServerView(server.getId()); + const version = server.getVersion(); + view.selectedPage = 'managementView'; + view.metricsId = server.getMetricsId(); + view.serverHostname = server.getHostnameForAccessKeys(); + view.serverManagementApiUrl = server.getManagementApiUrl(); + view.serverPortForNewAccessKeys = server.getPortForNewAccessKeys(); + view.serverCreationDate = server.getCreatedDate(); + view.serverVersion = version; + view.defaultDataLimitBytes = server.getDefaultDataLimit()?.bytes; + view.isDefaultDataLimitEnabled = view.defaultDataLimitBytes !== undefined; + view.showFeatureMetricsDisclaimer = + server.getMetricsEnabled() && !server.getDefaultDataLimit() && !hasSeenFeatureMetricsNotification(); + + if (version) { + view.isAccessKeyPortEditable = semver.gte(version, CHANGE_KEYS_PORT_VERSION); + view.supportsDefaultDataLimit = semver.gte(version, DATA_LIMITS_VERSION); + view.isHostnameEditable = semver.gte(version, CHANGE_HOSTNAME_VERSION); + view.hasPerKeyDataLimitDialog = semver.gte(version, KEY_SETTINGS_VERSION); + } + + if (isManagedServer(server)) { + const host = server.getHost(); + view.monthlyCost = host.getMonthlyCost()?.usd; + view.monthlyOutboundTransferBytes = host.getMonthlyOutboundTransferLimit()?.terabytes * 10 ** 12; + view.cloudLocation = host.getCloudLocation(); + } + + view.metricsEnabled = server.getMetricsEnabled(); + + // Asynchronously load "My Connection" and other access keys in order to not block showing the + // server. + setTimeout(async () => { + this.showMetricsOptInWhenNeeded(server); + try { + const serverAccessKeys = await server.listAccessKeys(); + view.accessKeyRows = serverAccessKeys.map(this.convertToUiAccessKey.bind(this)); + if (view.defaultDataLimitBytes === undefined) { + view.defaultDataLimitBytes = (await computeDefaultDataLimit(server, serverAccessKeys))?.bytes; + } + // Show help bubbles once the page has rendered. + setTimeout(() => { + showHelpBubblesOnce(view); + }, 250); + } catch (error) { + console.error(`Failed to load access keys: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-keys-get')); + } + this.showTransferStats(server, view); + }, 0); + } + + private async setServerUnreachableView(server: server_model.Server): Promise { + // Display the unreachable server state within the server view. + const serverId = server.getId(); + const serverView = await this.appRoot.getServerView(serverId); + serverView.selectedPage = 'unreachableView'; + serverView.retryDisplayingServer = async () => { + await this.updateServerView(server); + }; + } + + private async setServerProgressView(server: server_model.ManagedServer): Promise { + const view = await this.appRoot.getServerView(server.getId()); + view.serverName = this.makeDisplayName(server); + view.selectedPage = 'progressView'; + try { + for await (view.installProgress of server.monitorInstallProgress()) { + /* empty */ + } + } catch { + // Ignore any errors; they will be handled by `this.addServer`. + } + } + + private showMetricsOptInWhenNeeded(selectedServer: server_model.Server) { + const showMetricsOptInOnce = () => { + // Sanity check to make sure the running server is still displayed, i.e. + // it hasn't been deleted. + if (this.selectedServer !== selectedServer) { + return; + } + // Show the metrics opt in prompt if the server has not already opted in, + // and if they haven't seen the prompt yet according to localStorage. + const storageKey = selectedServer.getMetricsId() + '-prompted-for-metrics'; + if (!selectedServer.getMetricsEnabled() && !localStorage.getItem(storageKey)) { + this.appRoot.showMetricsDialogForNewServer(); + localStorage.setItem(storageKey, 'true'); + } + }; + + // Calculate milliseconds passed since server creation. + const createdDate = selectedServer.getCreatedDate(); + const now = new Date(); + const msSinceCreation = now.getTime() - createdDate.getTime(); + + // Show metrics opt-in once ONE_DAY_IN_MS has passed since server creation. + const ONE_DAY_IN_MS = 24 * 60 * 60 * 1000; + if (msSinceCreation >= ONE_DAY_IN_MS) { + showMetricsOptInOnce(); + } else { + setTimeout(showMetricsOptInOnce, ONE_DAY_IN_MS - msSinceCreation); + } + } + + private async refreshTransferStats(selectedServer: server_model.Server, serverView: ServerView) { + try { + const usageMap = await selectedServer.getDataUsage(); + const keyTransfers = [...usageMap.values()]; + let totalInboundBytes = 0; + for (const accessKeyBytes of keyTransfers) { + totalInboundBytes += accessKeyBytes; + } + serverView.totalInboundBytes = totalInboundBytes; + + // Update all the displayed access keys, even if usage didn't change, in case data limits did. + let keyTransferMax = 0; + let dataLimitMax = selectedServer.getDefaultDataLimit()?.bytes ?? 0; + for (const key of await selectedServer.listAccessKeys()) { + serverView.updateAccessKeyRow(key.id, { + transferredBytes: usageMap.get(key.id) ?? 0, + dataLimitBytes: key.dataLimit?.bytes, + }); + keyTransferMax = Math.max(keyTransferMax, usageMap.get(key.id) ?? 0); + dataLimitMax = Math.max(dataLimitMax, key.dataLimit?.bytes ?? 0); + } + serverView.baselineDataTransfer = Math.max(keyTransferMax, dataLimitMax); + } catch (e) { + // Since failures are invisible to users we generally want exceptions here to bubble + // up and trigger a Sentry report. The exception is network errors, about which we can't + // do much (note: ShadowboxServer generates a breadcrumb for failures regardless which + // will show up when someone explicitly submits feedback). + // TODO(fortuna): the model is leaking implementation details here. We should clean this up + // Perhaps take a more event-based approach. + if (e instanceof path_api.ServerApiError && e.isNetworkError()) { + return; + } + throw e; + } + } + + private showTransferStats(selectedServer: server_model.Server, serverView: ServerView) { + this.refreshTransferStats(selectedServer, serverView); + // Get transfer stats once per minute for as long as server is selected. + const statsRefreshRateMs = 60 * 1000; + const intervalId = setInterval(() => { + if (this.selectedServer !== selectedServer) { + // Server is no longer running, stop interval + clearInterval(intervalId); + return; + } + this.refreshTransferStats(selectedServer, serverView); + }, statsRefreshRateMs); + } + + private getS3InviteUrl(accessUrl: string, isAdmin = false) { + // TODO(alalama): display the invite in the user's preferred language. + const adminParam = isAdmin ? '?admin_embed' : ''; + return `https://s3.amazonaws.com/outline-vpn/invite.html${adminParam}#${encodeURIComponent(accessUrl)}`; + } + + // Converts the access key model to the format used by outline-server-view. + private convertToUiAccessKey(remoteAccessKey: server_model.AccessKey): DisplayAccessKey { + return { + id: remoteAccessKey.id, + placeholderName: this.appRoot.localize('key', 'keyId', remoteAccessKey.id), + name: remoteAccessKey.name, + accessUrl: remoteAccessKey.accessUrl, + transferredBytes: 0, + dataLimitBytes: remoteAccessKey.dataLimit?.bytes, + }; + } + + private async addAccessKey() { + const server = this.selectedServer; + try { + const serverAccessKey = await server.addAccessKey(); + const uiAccessKey = this.convertToUiAccessKey(serverAccessKey); + const serverView = await this.appRoot.getServerView(server.getId()); + serverView.addAccessKey(uiAccessKey); + this.appRoot.showNotification(this.appRoot.localize('notification-key-added')); + } catch (error) { + console.error(`Failed to add access key: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-key-add')); + } + } + + private renameAccessKey(accessKeyId: string, newName: string, entry: polymer.Base) { + this.selectedServer + .renameAccessKey(accessKeyId, newName) + .then(() => { + entry.commitName(); + }) + .catch(error => { + console.error(`Failed to rename access key: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-key-rename')); + entry.revertName(); + }); + } + + private async setDefaultDataLimit(limit: server_model.DataLimit) { + if (!limit) { + return; + } + const previousLimit = this.selectedServer.getDefaultDataLimit(); + if (previousLimit && limit.bytes === previousLimit.bytes) { + return; + } + const serverView = await this.appRoot.getServerView(this.appRoot.selectedServerId); + try { + await this.selectedServer.setDefaultDataLimit(limit); + this.appRoot.showNotification(this.appRoot.localize('saved')); + serverView.defaultDataLimitBytes = limit?.bytes; + serverView.isDefaultDataLimitEnabled = true; + this.refreshTransferStats(this.selectedServer, serverView); + // Don't display the feature collection disclaimer anymore. + serverView.showFeatureMetricsDisclaimer = false; + window.localStorage.setItem('dataLimits-feature-collection-notification', 'true'); + } catch (error) { + console.error(`Failed to set server default data limit: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-set-data-limit')); + const defaultLimit = previousLimit || (await computeDefaultDataLimit(this.selectedServer)); + serverView.defaultDataLimitBytes = defaultLimit?.bytes; + serverView.isDefaultDataLimitEnabled = !!previousLimit; + } + } + + private async removeDefaultDataLimit() { + const serverView = await this.appRoot.getServerView(this.appRoot.selectedServerId); + const previousLimit = this.selectedServer.getDefaultDataLimit(); + try { + await this.selectedServer.removeDefaultDataLimit(); + serverView.isDefaultDataLimitEnabled = false; + this.appRoot.showNotification(this.appRoot.localize('saved')); + this.refreshTransferStats(this.selectedServer, serverView); + } catch (error) { + console.error(`Failed to remove server default data limit: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-remove-data-limit')); + serverView.isDefaultDataLimitEnabled = !!previousLimit; + } + } + + private openPerKeyDataLimitDialog( + event: CustomEvent<{ + keyId: string; + keyDataLimitBytes: number | undefined; + keyName: string; + serverId: string; + defaultDataLimitBytes: number | undefined; + }> + ) { + const detail = event.detail; + const onDataLimitSet = this.savePerKeyDataLimit.bind(this, detail.serverId, detail.keyId); + const onDataLimitRemoved = this.removePerKeyDataLimit.bind(this, detail.serverId, detail.keyId); + const activeDataLimitBytes = detail.keyDataLimitBytes ?? detail.defaultDataLimitBytes; + this.appRoot.openPerKeyDataLimitDialog(detail.keyName, activeDataLimitBytes, onDataLimitSet, onDataLimitRemoved); + } + + private async savePerKeyDataLimit(serverId: string, keyId: string, dataLimitBytes: number): Promise { + this.appRoot.showNotification(this.appRoot.localize('saving')); + const server = this.idServerMap.get(serverId); + const serverView = await this.appRoot.getServerView(server.getId()); + try { + await server.setAccessKeyDataLimit(keyId, {bytes: dataLimitBytes}); + this.refreshTransferStats(server, serverView); + this.appRoot.showNotification(this.appRoot.localize('saved')); + return true; + } catch (error) { + console.error(`Failed to set data limit for access key ${keyId}: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-set-per-key-limit')); + return false; + } + } + + private async removePerKeyDataLimit(serverId: string, keyId: string): Promise { + this.appRoot.showNotification(this.appRoot.localize('saving')); + const server = this.idServerMap.get(serverId); + const serverView = await this.appRoot.getServerView(server.getId()); + try { + await server.removeAccessKeyDataLimit(keyId); + this.refreshTransferStats(server, serverView); + this.appRoot.showNotification(this.appRoot.localize('saved')); + return true; + } catch (error) { + console.error(`Failed to remove data limit from access key ${keyId}: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-remove-per-key-limit')); + return false; + } + } + + private async setHostnameForAccessKeys(hostname: string, serverSettings: polymer.Base) { + this.appRoot.showNotification(this.appRoot.localize('saving')); + try { + await this.selectedServer.setHostnameForAccessKeys(hostname); + this.appRoot.showNotification(this.appRoot.localize('saved')); + serverSettings.enterSavedState(); + } catch (error) { + this.appRoot.showError(this.appRoot.localize('error-not-saved')); + if (error.isNetworkError()) { + serverSettings.enterErrorState(this.appRoot.localize('error-network')); + return; + } + const message = error.response.status === 400 ? 'error-hostname-invalid' : 'error-unexpected'; + serverSettings.enterErrorState(this.appRoot.localize(message)); + } + } + + private async setPortForNewAccessKeys(port: number, serverSettings: polymer.Base) { + this.appRoot.showNotification(this.appRoot.localize('saving')); + try { + await this.selectedServer.setPortForNewAccessKeys(port); + this.appRoot.showNotification(this.appRoot.localize('saved')); + serverSettings.enterSavedState(); + } catch (error) { + this.appRoot.showError(this.appRoot.localize('error-not-saved')); + if (error.isNetworkError()) { + serverSettings.enterErrorState(this.appRoot.localize('error-network')); + return; + } + const code = error.response.status; + if (code === 409) { + serverSettings.enterErrorState(this.appRoot.localize('error-keys-port-in-use')); + return; + } + serverSettings.enterErrorState(this.appRoot.localize('error-unexpected')); + } + } + + // Returns promise which fulfills when the server is created successfully, + // or rejects with an error message that can be displayed to the user. + public async createManualServer(userInput: string): Promise { + let serverConfig: server_model.ManualServerConfig; + try { + serverConfig = parseManualServerConfig(userInput); + } catch (e) { + // This shouldn't happen because the UI validates the URL before enabling the DONE button. + const msg = `could not parse server config: ${e.message}`; + console.error(msg); + throw new Error(msg); + } + + // Don't let `ManualServerRepository.addServer` throw to avoid redundant error handling if we + // are adding an existing server. Query the repository instead to treat the UI accordingly. + const storedServer = this.manualServerRepository.findServer(serverConfig); + if (storedServer) { + this.appRoot.showNotification(this.appRoot.localize('notification-server-exists'), 5000); + this.showServer(storedServer); + return; + } + const manualServer = await this.manualServerRepository.addServer(serverConfig); + if (await manualServer.isHealthy()) { + this.addServer(null, manualServer); + this.showServer(manualServer); + } else { + // Remove inaccessible manual server from local storage if it was just created. + manualServer.forget(); + console.error('Manual server installed but unreachable.'); + throw new UnreachableServerError(); + } + } + + private async removeAccessKey(accessKeyId: string) { + const server = this.selectedServer; + try { + await server.removeAccessKey(accessKeyId); + (await this.appRoot.getServerView(server.getId())).removeAccessKey(accessKeyId); + this.appRoot.showNotification(this.appRoot.localize('notification-key-removed')); + } catch (error) { + console.error(`Failed to remove access key: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-key-remove')); + } + } + + private deleteServer(serverId: string) { + const serverToDelete = this.getServerById(serverId); + if (!isManagedServer(serverToDelete)) { + const msg = 'cannot delete non-ManagedServer'; + console.error(msg); + throw new Error(msg); + } + + const confirmationTitle = this.appRoot.localize('confirmation-server-destroy-title'); + const confirmationText = this.appRoot.localize('confirmation-server-destroy'); + const confirmationButton = this.appRoot.localize('destroy'); + this.appRoot.getConfirmation(confirmationTitle, confirmationText, confirmationButton, () => { + this.digitalOceanRetry(() => { + // TODO: Add an activity indicator in OutlineServerView during deletion. + return serverToDelete.getHost().delete(); + }).then( + () => { + this.removeServer(serverId); + this.showIntro(); + this.appRoot.showNotification(this.appRoot.localize('notification-server-destroyed')); + }, + e => { + // Don't show a toast on the login screen. + if (!(e instanceof digitalocean_api.XhrError)) { + console.error(`Failed destroy server: ${e}`); + this.appRoot.showError(this.appRoot.localize('error-server-destroy')); + } + } + ); + }); + } + + private forgetServer(serverId: string) { + const serverToForget = this.getServerById(serverId); + if (!isManualServer(serverToForget)) { + const msg = 'cannot forget non-ManualServer'; + console.error(msg); + throw new Error(msg); + } + const confirmationTitle = this.appRoot.localize('confirmation-server-remove-title'); + const confirmationText = this.appRoot.localize('confirmation-server-remove'); + const confirmationButton = this.appRoot.localize('remove'); + this.appRoot.getConfirmation(confirmationTitle, confirmationText, confirmationButton, () => { + serverToForget.forget(); + this.removeServer(serverId); + this.showIntro(); + this.appRoot.showNotification(this.appRoot.localize('notification-server-removed')); + }); + } + + private async setMetricsEnabled(metricsEnabled: boolean) { + const serverView = await this.appRoot.getServerView(this.appRoot.selectedServerId); + try { + await this.selectedServer.setMetricsEnabled(metricsEnabled); + this.appRoot.showNotification(this.appRoot.localize('saved')); + // Change metricsEnabled property on polymer element to update display. + serverView.metricsEnabled = metricsEnabled; + } catch (error) { + console.error(`Failed to set metrics enabled: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-metrics')); + serverView.metricsEnabled = !metricsEnabled; + } + } + + private async renameServer(newName: string) { + const serverToRename = this.selectedServer; + const serverId = this.appRoot.selectedServerId; + const view = await this.appRoot.getServerView(serverId); + try { + await serverToRename.setName(newName); + view.serverName = newName; + this.updateServerEntry(serverToRename); + } catch (error) { + console.error(`Failed to rename server: ${error}`); + this.appRoot.showError(this.appRoot.localize('error-server-rename')); + const oldName = this.selectedServer.getName(); + view.serverName = oldName; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (view.$.serverSettings as any).serverName = oldName; + } + } + + private cancelServerCreation(serverToCancel: server_model.Server): void { + if (!isManagedServer(serverToCancel)) { + const msg = 'cannot cancel non-ManagedServer'; + console.error(msg); + throw new Error(msg); + } + // TODO: Make the cancel button show an immediate state transition, + // indicate that deletion is in-progress, and allow the user to return + // to server creation in the meantime. + serverToCancel + .getHost() + .delete() + .then(() => { + this.removeServer(serverToCancel.getId()); + this.showIntro(); + }); + } + + private async setAppLanguage(languageCode: string, languageDir: 'rtl' | 'ltr') { + try { + await this.appRoot.setLanguage(languageCode, languageDir); + document.documentElement.setAttribute('dir', languageDir); + window.localStorage.setItem('overrideLanguage', languageCode); + } catch (error) { + this.appRoot.showError(this.appRoot.localize('error-unexpected')); + } + } +} diff --git a/server_manager/web_app/browser_main.ts b/server_manager/web_app/browser_main.ts new file mode 100644 index 0000000000..2dd1973274 --- /dev/null +++ b/server_manager/web_app/browser_main.ts @@ -0,0 +1,62 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(window as any).fetchWithPin = (_request: HttpRequest, _fingerprint: string) => { + return Promise.reject(new Error('Fingerprint pins are not supported')); +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(window as any).openImage = (basename: string) => { + window.open(`./images/${basename})`); +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(window as any).onUpdateDownloaded = (_callback: () => void) => { + console.info(`Requested registration of callbak for update download`); +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(window as any).runDigitalOceanOauth = () => { + let isCancelled = false; + const rejectWrapper = {reject: (_error: Error) => {}}; + const result = new Promise((resolve, reject) => { + rejectWrapper.reject = reject; + window.open('https://cloud.digitalocean.com/account/api/tokens/new', 'noopener,noreferrer'); + const apiToken = window.prompt('Please enter your DigitalOcean API token'); + if (apiToken) { + resolve(apiToken); + } else { + reject(new Error('No api token entered')); + } + }); + return { + result, + isCancelled() { + return isCancelled; + }, + cancel() { + console.log('Session cancelled'); + isCancelled = true; + rejectWrapper.reject(new Error('Authentication cancelled')); + }, + }; +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(window as any).bringToFront = () => { + console.info(`Requested bringToFront`); +}; + +import './main'; diff --git a/server_manager/web_app/build.action.sh b/server_manager/web_app/build.action.sh new file mode 100755 index 0000000000..8d2230ded6 --- /dev/null +++ b/server_manager/web_app/build.action.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# +# Copyright 2018 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu + +readonly OUT_DIR="${BUILD_DIR}/server_manager/web_app" +rm -rf "${OUT_DIR}" + +node src/build/run_action.mjs server_manager/web_app/build_install_script + +# Node.js on Cygwin doesn't like absolute Unix-style paths. +# So, we use a relative path as input to webpack. +pushd "${ROOT_DIR}" > /dev/null +# Notice that we forward the build environment if defined. +webpack --config=server_manager/electron_renderer.webpack.js ${WEBPACK_MODE:+--mode=${WEBPACK_MODE}} +popd > /dev/null diff --git a/server_manager/web_app/build_install_script.action.sh b/server_manager/web_app/build_install_script.action.sh new file mode 100755 index 0000000000..bf3ffb159f --- /dev/null +++ b/server_manager/web_app/build_install_script.action.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# +# Copyright 2020 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu + +readonly OUT_DIR="${BUILD_DIR}/server_manager/web_app/sh/" +rm -rf "${OUT_DIR}" + +# Create do_install_script.ts, which has a variable with the content of do_install_server.sh. +mkdir -p "${OUT_DIR}" + +pushd "${ROOT_DIR}/server_manager/install_scripts" > /dev/null +tar --create --gzip -f "${OUT_DIR}/do_scripts.tgz" ./install_server.sh ./do_install_server.sh +tar --create --gzip -f "${OUT_DIR}/gcp_scripts.tgz" ./install_server.sh ./gcp_install_server.sh + +# Node.js on Cygwin doesn't like absolute Unix-style paths. +# So, we use a relative path as input. +cd "${ROOT_DIR}" +node server_manager/install_scripts/build_do_install_script_ts.node.js \ + "${BUILD_DIR}/server_manager/web_app/sh/do_scripts.tgz" > "${ROOT_DIR}/server_manager/install_scripts/do_install_script.ts" +node server_manager/install_scripts/build_gcp_install_script_ts.node.js \ + "${BUILD_DIR}/server_manager/web_app/sh/gcp_scripts.tgz" > "${ROOT_DIR}/server_manager/install_scripts/gcp_install_script.ts" +popd > /dev/null diff --git a/server_manager/web_app/cloud_accounts.spec.ts b/server_manager/web_app/cloud_accounts.spec.ts new file mode 100644 index 0000000000..67fab382e1 --- /dev/null +++ b/server_manager/web_app/cloud_accounts.spec.ts @@ -0,0 +1,107 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {InMemoryStorage} from '../infrastructure/memory_storage'; + +import {CloudAccounts} from './cloud_accounts'; + +describe('CloudAccounts', () => { + it('get account methods return null when no cloud accounts are connected', () => { + const cloudAccounts = createCloudAccount(); + expect(cloudAccounts.getDigitalOceanAccount()).toBeNull(); + expect(cloudAccounts.getGcpAccount()).toBeNull(); + }); + + it('load connects account that exist in local storage', () => { + const storage = createInMemoryStorage('fake-access-token', 'fake-refresh-token'); + const cloudAccounts = createCloudAccount(storage); + expect(cloudAccounts.getDigitalOceanAccount()).not.toBeNull(); + expect(cloudAccounts.getGcpAccount()).not.toBeNull(); + }); + + it('connects accounts when connect methods are invoked', () => { + const cloudAccounts = createCloudAccount(); + + expect(cloudAccounts.getDigitalOceanAccount()).toBeNull(); + cloudAccounts.connectDigitalOceanAccount('fake-access-token'); + expect(cloudAccounts.getDigitalOceanAccount()).not.toBeNull(); + + expect(cloudAccounts.getGcpAccount()).toBeNull(); + cloudAccounts.connectGcpAccount('fake-access-token'); + expect(cloudAccounts.getGcpAccount()).not.toBeNull(); + }); + + it('removes account when disconnect is invoked', () => { + const storage = createInMemoryStorage('fake-access-token', 'fake-refresh-token'); + const cloudAccounts = createCloudAccount(storage); + + expect(cloudAccounts.getDigitalOceanAccount()).not.toBeNull(); + cloudAccounts.disconnectDigitalOceanAccount(); + expect(cloudAccounts.getDigitalOceanAccount()).toBeNull(); + + expect(cloudAccounts.getGcpAccount()).not.toBeNull(); + cloudAccounts.disconnectGcpAccount(); + expect(cloudAccounts.getGcpAccount()).toBeNull(); + }); + + it('functional noop on calling disconnect when accounts are not connected', () => { + const cloudAccounts = createCloudAccount(); + + expect(cloudAccounts.getDigitalOceanAccount()).toBeNull(); + cloudAccounts.disconnectDigitalOceanAccount(); + expect(cloudAccounts.getDigitalOceanAccount()).toBeNull(); + + expect(cloudAccounts.getGcpAccount()).toBeNull(); + cloudAccounts.disconnectGcpAccount(); + expect(cloudAccounts.getGcpAccount()).toBeNull(); + }); + + it('migrates existing legacy DigitalOcean access token on load', () => { + const storage = new InMemoryStorage(); + storage.setItem('LastDOToken', 'legacy-digitalocean-access-token'); + const cloudAccounts = createCloudAccount(storage); + + expect(cloudAccounts.getDigitalOceanAccount()).not.toBeNull(); + }); + + it('updates legacy DigitalOcean access token when account reconnected', () => { + const storage = new InMemoryStorage(); + storage.setItem('LastDOToken', 'legacy-digitalocean-access-token'); + const cloudAccounts = createCloudAccount(storage); + + expect(storage.getItem('LastDOToken')).toEqual('legacy-digitalocean-access-token'); + cloudAccounts.connectDigitalOceanAccount('new-digitalocean-access-token'); + expect(storage.getItem('LastDOToken')).toEqual('new-digitalocean-access-token'); + }); +}); + +function createInMemoryStorage(digitalOceanAccessToken?: string, gcpRefreshToken?: string): Storage { + const storage = new InMemoryStorage(); + if (digitalOceanAccessToken) { + storage.setItem('accounts.digitalocean', JSON.stringify({accessToken: digitalOceanAccessToken})); + } + if (gcpRefreshToken) { + storage.setItem('accounts.gcp', JSON.stringify({refreshToken: gcpRefreshToken})); + } + return storage; +} + +function createCloudAccount(storage = createInMemoryStorage()): CloudAccounts { + const shadowboxSettings = { + imageId: 'fake-image-id', + metricsUrl: 'fake-metrics-url', + sentryApiUrl: 'fake-sentry-api', + }; + return new CloudAccounts(shadowboxSettings, true, storage); +} diff --git a/server_manager/web_app/cloud_accounts.ts b/server_manager/web_app/cloud_accounts.ts new file mode 100644 index 0000000000..ae4a7419a5 --- /dev/null +++ b/server_manager/web_app/cloud_accounts.ts @@ -0,0 +1,148 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as accounts from '../model/accounts'; +import * as digitalocean from '../model/digitalocean'; +import * as gcp from '../model/gcp'; +import {DigitalOceanAccount} from './digitalocean_account'; +import {GcpAccount} from './gcp_account'; +import {ShadowboxSettings} from './server_install'; + +type DigitalOceanAccountJson = { + accessToken: string; +}; + +type GcpAccountJson = { + refreshToken: string; +}; + +/** + * Manages connected cloud provider accounts. + */ +export class CloudAccounts implements accounts.CloudAccounts { + private readonly LEGACY_DIGITALOCEAN_STORAGE_KEY = 'LastDOToken'; + private readonly DIGITALOCEAN_ACCOUNT_STORAGE_KEY = 'accounts.digitalocean'; + private readonly GCP_ACCOUNT_STORAGE_KEY = 'accounts.gcp'; + + private digitalOceanAccount: DigitalOceanAccount = null; + private gcpAccount: GcpAccount = null; + + constructor( + private shadowboxSettings: ShadowboxSettings, + private isDebugMode: boolean, + private storage = localStorage + ) { + this.load(); + } + + /** See {@link CloudAccounts#connectDigitalOceanAccount} */ + connectDigitalOceanAccount(accessToken: string): digitalocean.Account { + this.digitalOceanAccount = this.createDigitalOceanAccount(accessToken); + this.save(); + return this.digitalOceanAccount; + } + + /** See {@link CloudAccounts#connectGcpAccount} */ + connectGcpAccount(refreshToken: string): gcp.Account { + this.gcpAccount = this.createGcpAccount(refreshToken); + this.save(); + return this.gcpAccount; + } + + /** See {@link CloudAccounts#disconnectDigitalOceanAccount} */ + disconnectDigitalOceanAccount(): void { + // TODO(fortuna): Revoke access token. + this.digitalOceanAccount = null; + this.save(); + } + + /** See {@link CloudAccounts#disconnectGcpAccount} */ + disconnectGcpAccount(): void { + // TODO(fortuna): Revoke access token. + this.gcpAccount = null; + this.save(); + } + + /** See {@link CloudAccounts#getDigitalOceanAccount} */ + getDigitalOceanAccount(): digitalocean.Account { + return this.digitalOceanAccount; + } + + /** See {@link CloudAccounts#getGcpAccount} */ + getGcpAccount(): gcp.Account { + return this.gcpAccount; + } + + /** Loads the saved cloud accounts from disk. */ + private load(): void { + const digitalOceanAccountJsonString = this.storage.getItem(this.DIGITALOCEAN_ACCOUNT_STORAGE_KEY); + if (!digitalOceanAccountJsonString) { + const digitalOceanToken = this.loadLegacyDigitalOceanToken(); + if (digitalOceanToken) { + this.digitalOceanAccount = this.createDigitalOceanAccount(digitalOceanToken); + this.save(); + } + } else { + const digitalOceanAccountJson: DigitalOceanAccountJson = JSON.parse(digitalOceanAccountJsonString); + this.digitalOceanAccount = this.createDigitalOceanAccount(digitalOceanAccountJson.accessToken); + } + + const gcpAccountJsonString = this.storage.getItem(this.GCP_ACCOUNT_STORAGE_KEY); + if (gcpAccountJsonString) { + const gcpAccountJson: GcpAccountJson = JSON.parse(this.storage.getItem(this.GCP_ACCOUNT_STORAGE_KEY)); + this.gcpAccount = this.createGcpAccount(gcpAccountJson.refreshToken); + } + } + + /** Loads legacy DigitalOcean access token. */ + private loadLegacyDigitalOceanToken(): string { + return this.storage.getItem(this.LEGACY_DIGITALOCEAN_STORAGE_KEY); + } + + /** Replace the legacy DigitalOcean access token. */ + private saveLegacyDigitalOceanToken(accessToken?: string): void { + if (accessToken) { + this.storage.setItem(this.LEGACY_DIGITALOCEAN_STORAGE_KEY, accessToken); + } else { + this.storage.removeItem(this.LEGACY_DIGITALOCEAN_STORAGE_KEY); + } + } + + private createDigitalOceanAccount(accessToken: string): DigitalOceanAccount { + return new DigitalOceanAccount('do', accessToken, this.shadowboxSettings, this.isDebugMode); + } + + private createGcpAccount(refreshToken: string): GcpAccount { + return new GcpAccount('gcp', refreshToken, this.shadowboxSettings); + } + + private save(): void { + if (this.digitalOceanAccount) { + const accessToken = this.digitalOceanAccount.getAccessToken(); + const digitalOceanAccountJson: DigitalOceanAccountJson = {accessToken}; + this.storage.setItem(this.DIGITALOCEAN_ACCOUNT_STORAGE_KEY, JSON.stringify(digitalOceanAccountJson)); + this.saveLegacyDigitalOceanToken(accessToken); + } else { + this.storage.removeItem(this.DIGITALOCEAN_ACCOUNT_STORAGE_KEY); + this.saveLegacyDigitalOceanToken(null); + } + if (this.gcpAccount) { + const refreshToken = this.gcpAccount.getRefreshToken(); + const gcpAccountJson: GcpAccountJson = {refreshToken}; + this.storage.setItem(this.GCP_ACCOUNT_STORAGE_KEY, JSON.stringify(gcpAccountJson)); + } else { + this.storage.removeItem(this.GCP_ACCOUNT_STORAGE_KEY); + } + } +} diff --git a/server_manager/web_app/data_formatting.spec.ts b/server_manager/web_app/data_formatting.spec.ts new file mode 100644 index 0000000000..369d197fd1 --- /dev/null +++ b/server_manager/web_app/data_formatting.spec.ts @@ -0,0 +1,94 @@ +/* + Copyright 2020 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import * as formatting from './data_formatting'; + +describe('formatBytesParts', () => { + if (process?.versions?.node) { + it("doesn't run on Node", () => { + expect(() => formatting.formatBytesParts(0, 'en')).toThrow(); + }); + } else { + it('extracts the unit string and value separately', () => { + const english = formatting.formatBytesParts(0, 'en'); + expect(english.unit).toEqual('B'); + expect(english.value).toEqual('0'); + + const korean = formatting.formatBytesParts(2, 'kr'); + expect(korean.unit).toEqual('B'); + expect(korean.value).toEqual('2'); + + const russian = formatting.formatBytesParts(3000, 'ru'); + expect(russian.unit).toEqual('кБ'); + expect(russian.value).toEqual('3'); + + const simplifiedChinese = formatting.formatBytesParts(1.5 * 10 ** 9, 'zh-CN'); + expect(simplifiedChinese.unit).toEqual('GB'); + expect(simplifiedChinese.value).toEqual('1.5'); + + const farsi = formatting.formatBytesParts(133.5 * 10 ** 6, 'fa'); + expect(farsi.unit).toEqual('MB'); + expect(farsi.value).toEqual('۱۳۳٫۵'); + }); + } +}); + +describe('formatBytes', () => { + if (process?.versions?.node) { + it("doesn't run on Node", () => { + expect(() => formatting.formatBytes(0, 'en')).toThrow(); + }); + } else { + it('Formats data amounts', () => { + expect(formatting.formatBytes(2.1, 'zh-TW')).toEqual('2 byte'); + expect(formatting.formatBytes(7.8 * 10 ** 3, 'ar')).toEqual('8 كيلوبايت'); + expect(formatting.formatBytes(1.5 * 10 ** 6, 'tr')).toEqual('1,5 MB'); + expect(formatting.formatBytes(10 * 10 ** 9, 'jp')).toEqual('10 GB'); + expect(formatting.formatBytes(2.35 * 10 ** 12, 'pr')).toEqual('2.35 TB'); + }); + + it('Omits trailing zero decimal digits', () => { + expect(formatting.formatBytes(10 ** 12, 'en')).toEqual('1 TB'); + }); + } +}); + +function makeDisplayDataAmount(value: number, unit: 'MB' | 'GB') { + return {unit, value}; +} + +describe('displayDataAmountToBytes', () => { + it('correctly converts DisplayDataAmounts to byte values', () => { + expect(formatting.displayDataAmountToBytes(makeDisplayDataAmount(1, 'MB'))).toEqual(10 ** 6); + expect(formatting.displayDataAmountToBytes(makeDisplayDataAmount(20, 'GB'))).toEqual(2 * 10 ** 10); + expect(formatting.displayDataAmountToBytes(makeDisplayDataAmount(0, 'MB'))).toEqual(0); + }); + it('handles null input', () => { + expect(formatting.displayDataAmountToBytes(null)).toBeNull(); + }); +}); + +describe('bytesToDisplayDataAmount', () => { + it('correctly converts byte values to DisplayDataAmounts', () => { + expect(formatting.bytesToDisplayDataAmount(10 ** 6)).toEqual(makeDisplayDataAmount(1, 'MB')); + expect(formatting.bytesToDisplayDataAmount(3 * 10 ** 9)).toEqual(makeDisplayDataAmount(3, 'GB')); + expect(formatting.bytesToDisplayDataAmount(7 * 10 ** 5)).toEqual(makeDisplayDataAmount(0, 'MB')); + }); + it('handles null and undefined input', () => { + expect(formatting.bytesToDisplayDataAmount(null)).toBeNull(); + expect(formatting.bytesToDisplayDataAmount(undefined)).toBeNull(); + }); +}); diff --git a/server_manager/web_app/data_formatting.ts b/server_manager/web_app/data_formatting.ts new file mode 100644 index 0000000000..e8e49d595e --- /dev/null +++ b/server_manager/web_app/data_formatting.ts @@ -0,0 +1,139 @@ +/* + Copyright 2020 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +// Utility functions for internationalizing numbers and units + +const TERABYTE = 10 ** 12; +const GIGABYTE = 10 ** 9; +const MEGABYTE = 10 ** 6; +const KILOBYTE = 10 ** 3; + +const inWebApp = typeof window !== 'undefined' && typeof window.document !== 'undefined'; +interface FormatParams { + value: number; + unit: 'terabyte' | 'gigabyte' | 'megabyte' | 'kilobyte' | 'byte'; + decimalPlaces: number; +} + +function getDataFormattingParams(numBytes: number): FormatParams { + if (numBytes >= TERABYTE) { + return {value: numBytes / TERABYTE, unit: 'terabyte', decimalPlaces: 2}; + } else if (numBytes >= GIGABYTE) { + return {value: numBytes / GIGABYTE, unit: 'gigabyte', decimalPlaces: 2}; + } else if (numBytes >= MEGABYTE) { + return {value: numBytes / MEGABYTE, unit: 'megabyte', decimalPlaces: 1}; + } else if (numBytes >= KILOBYTE) { + return {value: numBytes / KILOBYTE, unit: 'kilobyte', decimalPlaces: 0}; + } + return {value: numBytes, unit: 'byte', decimalPlaces: 0}; +} + +function makeDataAmountFormatter(language: string, params: FormatParams) { + // We need to cast through `unknown` since `tsc` mistakenly omits the 'unit' field in + // `NumberFormatOptions`. + const options = { + style: 'unit', + unit: params.unit, + unitDisplay: 'short', + maximumFractionDigits: params.decimalPlaces, + } as unknown as Intl.NumberFormatOptions; + return new Intl.NumberFormat(language, options); +} + +interface DataAmountParts { + value: string; + unit: string; +} + +/** + * Returns a localized amount of bytes as a separate value and unit. This is useful for styling + * the unit and the value differently, or if you need them in separate nodes in the layout. + * + * @param {number} numBytes An amount of data to format. + * @param {string} language The ISO language code for the lanugage to translate to, eg 'en'. + */ +export function formatBytesParts(numBytes: number, language: string): DataAmountParts { + if (!inWebApp) { + throw new Error("formatBytesParts only works in web app code. Node usage isn't supported."); + } + const params = getDataFormattingParams(numBytes); + const parts = makeDataAmountFormatter(language, params).formatToParts(params.value); + // Cast away the type since `tsc` mistakenly omits the possibility for a 'unit' part + const isUnit = (part: Intl.NumberFormatPart) => (part as {type: string}).type === 'unit'; + const unitText = parts.find(isUnit).value; + return { + value: parts + .filter((part: Intl.NumberFormatPart) => !isUnit(part)) + .map((part: Intl.NumberFormatPart) => part.value) + .join('') + .trim(), + // Special case for "byte", since we'd rather be consistent with "KB", etc. "byte" is + // presumably used due to the example in the Unicode standard, + // http://unicode.org/reports/tr35/tr35-general.html#Example_Units + unit: unitText === 'byte' ? 'B' : unitText, + }; +} + +/** + * Returns a string representation of a number of bytes, translated into the given language + * + * @param {Number} numBytes An amount of data to format. + * @param {string} language The ISO language code for the lanugage to translate to, eg 'en'. + * @returns {string} The formatted data amount. + */ +export function formatBytes(numBytes: number, language: string): string { + if (!inWebApp) { + throw new Error("formatBytes only works in web app code. Node usage isn't supported."); + } + const params = getDataFormattingParams(numBytes); + return makeDataAmountFormatter(language, params).format(params.value); +} + +// TODO(JonathanDCohen222) Differentiate between this type, which is an input data limit, and +// a more general DisplayDataAmount with a string-typed unit and value which respects i18n. +export interface DisplayDataAmount { + unit: 'MB' | 'GB'; + value: number; +} + +/** + * @param dataAmount + * @returns The number of bytes represented by dataAmount + */ +export function displayDataAmountToBytes(dataAmount: DisplayDataAmount): number { + if (!dataAmount) { + return null; + } + if (dataAmount.unit === 'GB') { + return dataAmount.value * 10 ** 9; + } else if (dataAmount.unit === 'MB') { + return dataAmount.value * 10 ** 6; + } +} + +/** + * @param bytes + * @returns A DisplayDataAmount representing the number of bytes + */ +export function bytesToDisplayDataAmount(bytes: number): DisplayDataAmount { + if (bytes === null || bytes === undefined) { + return null; + } + if (bytes >= 10 ** 9) { + return {value: Math.floor(bytes / 10 ** 9), unit: 'GB'}; + } + return {value: Math.floor(bytes / 10 ** 6), unit: 'MB'}; +} diff --git a/server_manager/web_app/digitalocean_account.ts b/server_manager/web_app/digitalocean_account.ts new file mode 100644 index 0000000000..b2cb774fcf --- /dev/null +++ b/server_manager/web_app/digitalocean_account.ts @@ -0,0 +1,164 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {DigitalOceanSession, DropletInfo, RestApiSession} from '../cloud/digitalocean_api'; +import * as crypto from '../infrastructure/crypto'; +import * as do_install_script from '../install_scripts/do_install_script'; +import * as digitalocean from '../model/digitalocean'; +import * as server from '../model/server'; + +import {DigitalOceanServer} from './digitalocean_server'; +import {getShellExportCommands, ShadowboxSettings} from './server_install'; + +// Tag used to mark Shadowbox Droplets. +const SHADOWBOX_TAG = 'shadowbox'; +const MACHINE_SIZE = 's-1vcpu-1gb'; + +export class DigitalOceanAccount implements digitalocean.Account { + private readonly digitalOcean: DigitalOceanSession; + private servers: DigitalOceanServer[] = []; + + constructor( + private id: string, + private accessToken: string, + private shadowboxSettings: ShadowboxSettings, + private debugMode: boolean + ) { + this.digitalOcean = new RestApiSession(accessToken); + } + + getId(): string { + return this.id; + } + + async getName(): Promise { + return (await this.digitalOcean.getAccount())?.email; + } + + async getStatus(): Promise { + const [account, droplets] = await Promise.all([this.digitalOcean.getAccount(), this.digitalOcean.getDroplets()]); + const needsEmailVerification = !account.email_verified; + // If the account is locked for no discernible reason, and there are no droplets, + // assume the billing info is missing. + const needsBillingInfo = account.status === 'locked' && !needsEmailVerification && droplets.length == 0; + const hasReachedLimit = droplets.length >= account.droplet_limit; + let warning: string; + if (account.status !== 'active') { + warning = `${account.status_message} (status=${account.status})`; + } + return { + needsBillingInfo, + needsEmailVerification, + dropletLimit: account.droplet_limit, + hasReachedLimit, + warning, + }; + } + + // Return a list of regions indicating whether they are available and support + // our target machine size. + async listLocations(): Promise> { + const regions = await this.digitalOcean.getRegionInfo(); + return regions.map(info => ({ + cloudLocation: new digitalocean.Region(info.slug), + available: info.available && info.sizes.indexOf(MACHINE_SIZE) !== -1, + })); + } + + // Returns true if there is no more room for additional Droplets. + async hasReachedLimit(): Promise { + const account = this.digitalOcean.getAccount(); + const droplets = await this.digitalOcean.getDroplets(); + return droplets.length >= (await account).droplet_limit; + } + + // Creates a server and returning it when it becomes active. + async createServer(region: digitalocean.Region, name: string): Promise { + console.time('activeServer'); + console.time('servingServer'); + const keyPair = await crypto.generateKeyPair(); + const installCommand = getInstallScript(this.digitalOcean.accessToken, name, this.shadowboxSettings); + + // You can find the API slugs at https://slugs.do-api.dev/. + const dropletSpec = { + installCommand, + size: MACHINE_SIZE, + image: 'docker-20-04', + tags: [SHADOWBOX_TAG], + }; + if (this.debugMode) { + // Strip carriage returns, which produce weird blank lines when pasted into a terminal. + console.debug( + `private key for SSH access to new droplet:\n${keyPair.private.replace(/\r/g, '')}\n\n` + + 'Use "ssh -i keyfile root@[ip_address]" to connect to the machine' + ); + } + const response = await this.digitalOcean.createDroplet(name, region.id, keyPair.public, dropletSpec); + const server = this.createDigitalOceanServer(this.digitalOcean, response.droplet); + server.onceDropletActive + .then(async () => { + console.timeEnd('activeServer'); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for await (const _ of server.monitorInstallProgress()) { + /* do nothing */ + } + console.timeEnd('servingServer'); + }) + .catch(e => console.log("Couldn't time installation", e)); + return server; + } + + listServers(fetchFromHost = true): Promise { + if (!fetchFromHost) { + return Promise.resolve(this.servers); // Return the in-memory servers. + } + return this.digitalOcean.getDropletsByTag(SHADOWBOX_TAG).then(droplets => { + this.servers = []; + return droplets.map(droplet => { + return this.createDigitalOceanServer(this.digitalOcean, droplet); + }); + }); + } + + getAccessToken(): string { + return this.accessToken; + } + + // Creates a DigitalOceanServer object and adds it to the in-memory server list. + private createDigitalOceanServer(digitalOcean: DigitalOceanSession, dropletInfo: DropletInfo) { + const server = new DigitalOceanServer(`${this.id}:${dropletInfo.id}`, digitalOcean, dropletInfo); + this.servers.push(server); + return server; + } +} + +function sanitizeDigitalOceanToken(input: string): string { + const sanitizedInput = input.trim(); + const pattern = /^[A-Za-z0-9_/-]+$/; + if (!pattern.test(sanitizedInput)) { + throw new Error('Invalid DigitalOcean Token'); + } + return sanitizedInput; +} + +// cloudFunctions needs to define cloud::public_ip and cloud::add_tag. +function getInstallScript(accessToken: string, name: string, shadowboxSettings: ShadowboxSettings): string { + const sanitizedAccessToken = sanitizeDigitalOceanToken(accessToken); + return ( + '#!/bin/bash -eu\n' + + `export DO_ACCESS_TOKEN='${sanitizedAccessToken}'\n` + + getShellExportCommands(shadowboxSettings, name) + + do_install_script.SCRIPT + ); +} diff --git a/server_manager/web_app/digitalocean_server.ts b/server_manager/web_app/digitalocean_server.ts new file mode 100644 index 0000000000..217d0e4c63 --- /dev/null +++ b/server_manager/web_app/digitalocean_server.ts @@ -0,0 +1,309 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {DigitalOceanSession, DropletInfo} from '../cloud/digitalocean_api'; +import {hexToString} from '../infrastructure/hex_encoding'; +import {sleep} from '../infrastructure/sleep'; +import {ValueStream} from '../infrastructure/value_stream'; +import {Region} from '../model/digitalocean'; +import * as server from '../model/server'; +import {makePathApiClient} from './fetcher'; + +import {ShadowboxServer} from './shadowbox_server'; + +// Prefix used in key-value tags. +const KEY_VALUE_TAG = 'kv'; +// The tag that appears at the beginning of installation. +const INSTALL_STARTED_TAG = 'install-started'; +// The tag key for the manager API certificate fingerprint. +const CERTIFICATE_FINGERPRINT_TAG = 'certsha256'; +// The tag key for the manager API URL. +const API_URL_TAG = 'apiurl'; +// The tag which appears if there is an error during installation. +const INSTALL_ERROR_TAG = 'install-error'; + +// These are superseded by the API_URL_TAG +// The tag key for the manager API port. +const DEPRECATED_API_PORT_TAG = 'apiport'; +// The tag key for the manager API url prefix. +const DEPRECATED_API_PREFIX_TAG = 'apiprefix'; + +// Possible install states for DigitaloceanServer. +enum InstallState { + // Unknown state - server may still be installing. + UNKNOWN = 0, + // Droplet status is "active" + DROPLET_CREATED, + // Userspace is running (detected by the presence of tags) + DROPLET_RUNNING, + // The server has generated its management service certificate. + CERTIFICATE_CREATED, + // Server is running and has the API URL and certificate fingerprint set. + COMPLETED, + // Server installation failed. + FAILED, + // Server installation was canceled by the user. + CANCELED, +} + +function getCompletionFraction(state: InstallState): number { + // Values are based on observed installation timing. + // Installation typically takes 90 seconds in total. + switch (state) { + case InstallState.UNKNOWN: + return 0.1; + case InstallState.DROPLET_CREATED: + return 0.5; + case InstallState.DROPLET_RUNNING: + return 0.55; + case InstallState.CERTIFICATE_CREATED: + return 0.6; + case InstallState.COMPLETED: + return 1.0; + default: + return 0; + } +} + +function isFinal(state: InstallState): boolean { + return state === InstallState.COMPLETED || state === InstallState.FAILED || state === InstallState.CANCELED; +} + +export class DigitalOceanServer extends ShadowboxServer implements server.ManagedServer { + private onDropletActive: () => void; + readonly onceDropletActive = new Promise(fulfill => { + this.onDropletActive = fulfill; + }); + private installState = new ValueStream(InstallState.UNKNOWN); + private readonly startTimestamp = Date.now(); + + constructor(id: string, private digitalOcean: DigitalOceanSession, private dropletInfo: DropletInfo) { + // Consider passing a RestEndpoint object to the parent constructor, + // to better encapsulate the management api address logic. + super(id); + console.info('DigitalOceanServer created'); + // Go to the correct initial state based on the initial dropletInfo. + this.updateInstallState(); + // Start polling for state updates. + this.pollInstallState(); + } + + async *monitorInstallProgress(): AsyncGenerator { + for await (const state of this.installState.watch()) { + yield getCompletionFraction(state); + } + + if (this.installState.get() === InstallState.FAILED) { + throw new server.ServerInstallFailedError(); + } else if (this.installState.get() === InstallState.CANCELED) { + throw new server.ServerInstallCanceledError(); + } + } + + // Synchronous function for updating the installState based on the latest + // dropletInfo. + private updateInstallState(): void { + const TIMEOUT_MS = 5 * 60 * 1000; + + const tagMap = this.getTagMap(); + if (tagMap.get(INSTALL_ERROR_TAG)) { + console.error(`error tag: ${tagMap.get(INSTALL_ERROR_TAG)}`); + this.setInstallState(InstallState.FAILED); + } else if (Date.now() - this.startTimestamp >= TIMEOUT_MS) { + console.error('hit timeout while waiting for installation'); + this.setInstallState(InstallState.FAILED); + } else if (this.setApiUrlAndCertificate()) { + // API Url and Certificate have been set, so we have successfully + // installed the server and can now make API calls. + console.info('digitalocean_server: Successfully found API and cert tags'); + this.setInstallState(InstallState.COMPLETED); + } else if (tagMap.get(CERTIFICATE_FINGERPRINT_TAG)) { + this.setInstallState(InstallState.CERTIFICATE_CREATED); + } else if (tagMap.get(INSTALL_STARTED_TAG)) { + this.setInstallState(InstallState.DROPLET_RUNNING); + } else if (this.dropletInfo?.status === 'active') { + this.setInstallState(InstallState.DROPLET_CREATED); + } + } + + // Maintains this.installState. Will keep polling until installation has + // succeeded, failed, or been canceled. + private async pollInstallState(): Promise { + // Periodically refresh the droplet info then try to update the install + // state. If the final install state has been reached, don't make an + // unnecessary request to fetch droplet info. + while (!this.installState.isClosed()) { + try { + await this.refreshDropletInfo(); + } catch (error) { + console.log('Failed to get droplet info', error); + this.setInstallState(InstallState.FAILED); + return; + } + this.updateInstallState(); + // Return immediately if installation is terminated + // to prevent race conditions and avoid unnecessary delay. + if (this.installState.isClosed()) { + return; + } + // TODO: If there is an error refreshing the droplet, we should just + // try again, as there may be an intermittent network issue. + await sleep(3000); + } + } + + private setInstallState(installState: InstallState) { + this.installState.set(installState); + if (isFinal(installState)) { + this.installState.close(); + } + } + + // Returns true on success, else false. + private setApiUrlAndCertificate(): boolean { + try { + // Attempt to get certificate fingerprint and management api address, + // these methods throw exceptions if the fields are unavailable. + const certificateFingerprint = this.getCertificateFingerprint(); + const apiAddress = this.getManagementApiAddress(); + this.setManagementApi(makePathApiClient(apiAddress, certificateFingerprint)); + return true; + } catch (e) { + // Install state not yet ready. + return false; + } + } + + // Refreshes the state from DigitalOcean API. + private async refreshDropletInfo(): Promise { + const newDropletInfo = await this.digitalOcean.getDroplet(this.dropletInfo.id); + const oldDropletInfo = this.dropletInfo; + this.dropletInfo = newDropletInfo; + if (newDropletInfo.status !== oldDropletInfo.status) { + if (newDropletInfo.status === 'active') { + this.onDropletActive(); + } + } + } + + // Gets the key-value map stored in the DigitalOcean tags. + private getTagMap(): Map { + const ret = new Map(); + const tagPrefix = KEY_VALUE_TAG + ':'; + for (const tag of this.dropletInfo.tags) { + if (!startsWithCaseInsensitive(tag, tagPrefix)) { + continue; + } + const keyValuePair = tag.slice(tagPrefix.length); + const [key, hexValue] = keyValuePair.split(':', 2); + try { + ret.set(key.toLowerCase(), hexToString(hexValue)); + } catch (e) { + console.error('error decoding hex string'); + } + } + return ret; + } + + // Returns the public ipv4 address of this server. + private ipv4Address() { + for (const network of this.dropletInfo.networks.v4) { + if (network.type === 'public') { + return network.ip_address; + } + } + return undefined; + } + + // Gets the address for the user management api, throws an error if unavailable. + private getManagementApiAddress(): string { + const tagMap = this.getTagMap(); + let apiAddress = tagMap.get(API_URL_TAG); + // Check the old tags for backward-compatibility. + // TODO(fortuna): Delete this before we release v1.0 + if (!apiAddress) { + const portNumber = tagMap.get(DEPRECATED_API_PORT_TAG); + if (!portNumber) { + throw new Error('Could not get API port number'); + } + if (!this.ipv4Address()) { + throw new Error('API hostname not set'); + } + apiAddress = `https://${this.ipv4Address()}:${portNumber}/`; + const apiPrefix = tagMap.get(DEPRECATED_API_PREFIX_TAG); + if (apiPrefix) { + apiAddress += apiPrefix + '/'; + } + } + if (!apiAddress.endsWith('/')) { + apiAddress += '/'; + } + return apiAddress; + } + + // Gets the certificate fingerprint in binary, throws an error if + // unavailable. + private getCertificateFingerprint(): string { + const fingerprint = this.getTagMap().get(CERTIFICATE_FINGERPRINT_TAG); + if (fingerprint) { + return fingerprint; + } else { + throw new Error('certificate fingerprint unavailable'); + } + } + + getHost(): DigitalOceanHost { + // Construct a new DigitalOceanHost object, to be sure it has the latest + // session and droplet info. + return new DigitalOceanHost(this.digitalOcean, this.dropletInfo, this.onDelete.bind(this)); + } + + // Callback to be invoked once server is deleted. + private onDelete() { + if (!this.installState.isClosed()) { + this.setInstallState(InstallState.CANCELED); + } + } +} + +class DigitalOceanHost implements server.ManagedServerHost { + constructor( + private digitalOcean: DigitalOceanSession, + private dropletInfo: DropletInfo, + private deleteCallback: Function + ) {} + + getMonthlyOutboundTransferLimit(): server.DataAmount { + // Details on the bandwidth limits can be found at + // https://www.digitalocean.com/community/tutorials/digitalocean-bandwidth-billing-faq + return {terabytes: this.dropletInfo.size.transfer}; + } + + getMonthlyCost(): server.MonetaryCost { + return {usd: this.dropletInfo.size.price_monthly}; + } + + getCloudLocation(): Region { + return new Region(this.dropletInfo.region.slug); + } + + delete(): Promise { + this.deleteCallback(); + return this.digitalOcean.deleteDroplet(this.dropletInfo.id); + } +} + +function startsWithCaseInsensitive(text: string, prefix: string) { + return text.slice(0, prefix.length).toLowerCase() === prefix.toLowerCase(); +} diff --git a/server_manager/web_app/fetcher.spec.ts b/server_manager/web_app/fetcher.spec.ts new file mode 100644 index 0000000000..48489718d0 --- /dev/null +++ b/server_manager/web_app/fetcher.spec.ts @@ -0,0 +1,28 @@ +// Copyright 2022 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {makePathApiClient} from './fetcher'; + +describe('makePathApiClient', () => { + const api = makePathApiClient('https://api.github.com/repos/Jigsaw-Code/'); + + if (process?.versions?.node) { + // This test relies on fetch(), which doesn't exist in Node (yet). + return; + } + it('GET', async () => { + const response = await api.request<{name: string}>('outline-server'); + expect(response.name).toEqual('outline-server'); + }); +}); diff --git a/server_manager/web_app/fetcher.ts b/server_manager/web_app/fetcher.ts new file mode 100644 index 0000000000..72bd01ad24 --- /dev/null +++ b/server_manager/web_app/fetcher.ts @@ -0,0 +1,43 @@ +// Copyright 2022 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {Fetcher, PathApiClient} from '../infrastructure/path_api'; + +async function fetchWrapper(request: HttpRequest): Promise { + const response = await fetch(request.url, request); + return { + status: response.status, + body: await response.text(), + }; +} + +/** + * @param fingerprint A SHA-256 hash of the expected leaf certificate, in binary encoding. + * @returns An HTTP client that enforces `fingerprint`, if set. + */ +function makeFetcher(fingerprint?: string): Fetcher { + if (fingerprint) { + return request => fetchWithPin(request, fingerprint); + } + return fetchWrapper; +} + +/** + * @param base A valid URL + * @param fingerprint A SHA-256 hash of the expected leaf certificate, in binary encoding. + * @returns A fully initialized API client. + */ +export function makePathApiClient(base: string, fingerprint?: string): PathApiClient { + return new PathApiClient(base, makeFetcher(fingerprint)); +} diff --git a/server_manager/web_app/gallery_app/index.html b/server_manager/web_app/gallery_app/index.html new file mode 100644 index 0000000000..37eafb0d56 --- /dev/null +++ b/server_manager/web_app/gallery_app/index.html @@ -0,0 +1,24 @@ + + + + + Outline Manager Components Gallery + + + + + diff --git a/server_manager/web_app/gallery_app/main.ts b/server_manager/web_app/gallery_app/main.ts new file mode 100644 index 0000000000..030dbdf913 --- /dev/null +++ b/server_manager/web_app/gallery_app/main.ts @@ -0,0 +1,312 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import '../ui_components/outline-about-dialog'; +import '../ui_components/outline-do-oauth-step'; +import '../ui_components/outline-gcp-oauth-step'; +import '../ui_components/outline-gcp-create-server-app'; +import '../ui_components/outline-server-view'; +import '../ui_components/outline-feedback-dialog'; +import '../ui_components/outline-share-dialog'; +import '../ui_components/outline-sort-span'; +import '../ui_components/outline-survey-dialog'; +import '../ui_components/outline-per-key-data-limit-dialog'; +import '@polymer/paper-checkbox/paper-checkbox'; + +import {PaperCheckboxElement} from '@polymer/paper-checkbox/paper-checkbox'; +import IntlMessageFormat from 'intl-messageformat'; +import {css, customElement, html, LitElement, property} from 'lit-element'; + +import * as gcp from '../../model/gcp'; +import {FakeManagedServer, FakeGcpAccount} from '../testing/models'; +import {OutlinePerKeyDataLimitDialog} from '../ui_components/outline-per-key-data-limit-dialog'; +import {COMMON_STYLES} from '../ui_components/cloud-install-styles'; +import {DisplayCloudId} from '../ui_components/cloud-assets'; + +const FAKE_SERVER = new FakeManagedServer('fake-id', true); + +async function makeLocalize(language: string) { + let messages: {[key: string]: string}; + try { + messages = await (await fetch(`./messages/${language}.json`)).json(); + } catch (e) { + window.alert(`Could not load messages for language "${language}"`); + } + return (msgId: string, ...args: string[]): string => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const params = {} as {[key: string]: any}; + for (let i = 0; i < args.length; i += 2) { + params[args[i]] = args[i + 1]; + } + if (!messages || !messages[msgId]) { + // Fallback that shows message id and params. + return `${msgId}(${JSON.stringify(params, null, ' ')})`; + } + // Ideally we would pre-parse and cache the IntlMessageFormat objects, + // but it's ok here because it's a test app. + const formatter = new IntlMessageFormat(messages[msgId], language); + return formatter.format(params) as string; + }; +} + +function fakeLocalize(id: string) { + return id; +} + +const GCP_LOCATIONS: gcp.ZoneOption[] = [ + { + cloudLocation: new gcp.Zone('us-central1-fake'), + available: true, + }, + { + cloudLocation: new gcp.Zone('europe-west3-fake'), + available: true, + }, + { + cloudLocation: new gcp.Zone('europe-west3-fake2'), + available: true, + }, + { + cloudLocation: new gcp.Zone('southamerica-east1-b'), + available: false, + }, + { + cloudLocation: new gcp.Zone('fake-location-z'), + available: true, + }, +]; + +const GCP_BILLING_ACCOUNTS: gcp.BillingAccount[] = [{id: '1234-123456', name: 'My Billing Account'}]; + +@customElement('outline-test-app') +export class TestApp extends LitElement { + @property({type: String}) dir = 'ltr'; + @property({type: Function}) localize: (...args: string[]) => string = fakeLocalize; + @property({type: String}) language = 'zz'; // Replaced asynchronously in the constructor. + @property({type: Boolean}) savePerKeyDataLimitSuccessful = true; + @property({type: Number}) keyDataLimit: number | undefined; + @property({type: String}) gcpRefreshToken = ''; + @property({type: Boolean}) gcpAccountHasBillingAccounts = false; + + static get styles() { + return [ + COMMON_STYLES, + css` + :host { + background: white; + display: block; + height: 100%; + overflow-y: auto; + padding: 10px; + width: 100%; + } + .widget { + display: block; + padding: 20px; + } + .backdrop { + background: var(--background-color); + } + `, + ]; + } + + constructor() { + super(); + console.log('Created'); + this.setLanguage('en'); + } + + async setLanguage(newLanguage: string) { + if (newLanguage === this.language) { + return; + } + this.localize = await makeLocalize(newLanguage); + this.language = newLanguage; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private select(querySelector: string): any { + return this.shadowRoot.querySelector(querySelector); + } + + private setKeyDataLimit(bytes: number) { + if ((this.select('#perKeyDataLimitSuccessCheckbox') as PaperCheckboxElement).checked) { + this.keyDataLimit = bytes; + console.log(`Per Key Data Limit set to ${bytes} bytes!`); + return true; + } + console.error('Per Key Data Limit failed to be set!'); + return false; + } + + private removeKeyDataLimit() { + if ((this.select('#perKeyDataLimitSuccessCheckbox') as PaperCheckboxElement).checked) { + this.keyDataLimit = undefined; + console.log('Per Key Data Limit Removed!'); + return true; + } + console.error('Per Key Data Limit failed to be removed!'); + return false; + } + + render() { + return html` +

Outline Manager Components Gallery

+ ${this.pageControls} + +
+

outline-gcp-create-server-app

+ + (this.gcpAccountHasBillingAccounts = !this.gcpAccountHasBillingAccounts)} + >Fake billing accounts + +
+ +
+

outline-server-view

+
+ +
+
+ +
+

outline-per-key-data-limit-dialog

+ + { + this.savePerKeyDataLimitSuccessful = !this.savePerKeyDataLimitSuccessful; + }} + id="perKeyDataLimitSuccessCheckbox" + >Save Successful + +
+ +
+

outline-about-dialog

+ + +
+ +
+

outline-do-oauth-step

+ +
+ +
+

outline-gcp-oauth-step

+ +
+ +
+

outline-feedback-dialog

+ + +
+ +
+

outline-share-dialog

+ + +
+ +
+

outline-sort-icon

+ { + const el = this.select('outline-sort-span'); + el.direction *= -1; + }} + >Column Header +
+ +
+

outline-survey-dialog

+ + +
+ `; + } + + get pageControls() { + return html`

+ + +

+

+

`; + } +} diff --git a/server_manager/web_app/gcp_account.ts b/server_manager/web_app/gcp_account.ts new file mode 100644 index 0000000000..2f6b1d9ebc --- /dev/null +++ b/server_manager/web_app/gcp_account.ts @@ -0,0 +1,301 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as gcp_api from '../cloud/gcp_api'; +import {sleep} from '../infrastructure/sleep'; +import {SCRIPT} from '../install_scripts/gcp_install_script'; +import * as gcp from '../model/gcp'; +import {BillingAccount, Project} from '../model/gcp'; +import * as server from '../model/server'; + +import {GcpServer} from './gcp_server'; +import * as server_install from './server_install'; + +/** Returns a unique, RFC1035-style name as required by GCE. */ +function makeGcpInstanceName(): string { + function pad2(val: number) { + return val.toString().padStart(2, '0'); + } + + const now = new Date(); + const year = now.getUTCFullYear().toString(); + const month = pad2(now.getUTCMonth() + 1); // January is month 0. + const day = pad2(now.getUTCDate()); + const hour = pad2(now.getUTCHours()); + const minute = pad2(now.getUTCMinutes()); + const second = pad2(now.getUTCSeconds()); + return `outline-${year}${month}${day}-${hour}${minute}${second}`; +} + +// Regions where the first f1-micro instance is free. +// See https://cloud.google.com/free/docs/gcp-free-tier/#compute +const FREE_TIER_REGIONS = new Set(['us-west1', 'us-central1', 'us-east1']); + +export function isInFreeTier(zone: gcp.Zone): boolean { + return FREE_TIER_REGIONS.has(zone.regionId); +} + +/** + * The Google Cloud Platform account model. + */ +export class GcpAccount implements gcp.Account { + private static readonly OUTLINE_PROJECT_NAME = 'Outline servers'; + private static readonly OUTLINE_FIREWALL_NAME = 'outline'; + private static readonly OUTLINE_FIREWALL_TAG = 'outline'; + private static readonly MACHINE_SIZE = 'e2-micro'; + private static readonly REQUIRED_GCP_SERVICES = ['compute.googleapis.com']; + + private readonly apiClient: gcp_api.RestApiClient; + + constructor( + private id: string, + private refreshToken: string, + private shadowboxSettings: server_install.ShadowboxSettings + ) { + this.apiClient = new gcp_api.RestApiClient(refreshToken); + } + + getId(): string { + return this.id; + } + + /** @see {@link Account#getName}. */ + async getName(): Promise { + const userInfo = await this.apiClient.getUserInfo(); + return userInfo?.email; + } + + /** Returns the refresh token. */ + getRefreshToken(): string { + return this.refreshToken; + } + + /** @see {@link Account#listServers}. */ + async listServers(projectId: string): Promise { + const result: GcpServer[] = []; + const filter = 'labels.outline=true'; + const listAllInstancesResponse = await this.apiClient.listAllInstances(projectId, filter); + const instanceMap = listAllInstancesResponse?.items ?? {}; + Object.values(instanceMap).forEach(({instances}) => { + instances?.forEach(instance => { + const {zoneId} = gcp_api.parseZoneUrl(instance.zone); + const locator = {projectId, zoneId, instanceId: instance.id}; + const id = `${this.id}:${instance.id}`; + result.push(new GcpServer(id, locator, instance.name, Promise.resolve(), this.apiClient)); + }); + }); + return result; + } + + /** @see {@link Account#listLocations}. */ + async listLocations(projectId: string): Promise { + const listZonesResponse = await this.apiClient.listZones(projectId); + const zones = listZonesResponse.items ?? []; + return zones.map(zoneInfo => ({ + cloudLocation: new gcp.Zone(zoneInfo.name), + available: zoneInfo.status === 'UP', + })); + } + + /** @see {@link Account#listProjects}. */ + async listProjects(): Promise { + const filter = 'labels.outline=true AND lifecycleState=ACTIVE'; + const response = await this.apiClient.listProjects(filter); + if (response.projects?.length > 0) { + return response.projects.map(project => { + return { + id: project.projectId, + name: project.name, + }; + }); + } + return []; + } + + /** @see {@link Account#createProject}. */ + async createProject(projectId: string, billingAccountId: string): Promise { + // Create GCP project + const createProjectData = { + projectId, + name: GcpAccount.OUTLINE_PROJECT_NAME, + labels: { + outline: 'true', + }, + }; + const createProjectResponse = await this.apiClient.createProject(createProjectData); + let createProjectOperation = null; + while (!createProjectOperation?.done) { + await sleep(2 * 1000); + createProjectOperation = await this.apiClient.resourceManagerOperationGet(createProjectResponse.name); + } + if (createProjectOperation.error) { + // TODO: Throw error. The project wasn't created so we should have nothing to delete. + } + + await this.configureProject(projectId, billingAccountId); + + return { + id: projectId, + name: GcpAccount.OUTLINE_PROJECT_NAME, + }; + } + + async isProjectHealthy(projectId: string): Promise { + const projectBillingInfo = await this.apiClient.getProjectBillingInfo(projectId); + if (!projectBillingInfo.billingEnabled) { + return false; + } + + const listEnabledServicesResponse = await this.apiClient.listEnabledServices(projectId); + for (const requiredService of GcpAccount.REQUIRED_GCP_SERVICES) { + const found = listEnabledServicesResponse.services.find(service => service.config.name === requiredService); + if (!found) { + return false; + } + } + + return true; + } + + async repairProject(projectId: string, billingAccountId: string): Promise { + return await this.configureProject(projectId, billingAccountId); + } + + /** @see {@link Account#listBillingAccounts}. */ + async listOpenBillingAccounts(): Promise { + const response = await this.apiClient.listBillingAccounts(); + if (response.billingAccounts?.length > 0) { + return response.billingAccounts + .filter(billingAccount => billingAccount.open) + .map(billingAccount => ({ + id: billingAccount.name.substring(billingAccount.name.lastIndexOf('/') + 1), + name: billingAccount.displayName, + })); + } + return []; + } + + private async createFirewallIfNeeded(projectId: string): Promise { + // Configure Outline firewall + const getFirewallResponse = await this.apiClient.listFirewalls(projectId, GcpAccount.OUTLINE_FIREWALL_NAME); + if (!getFirewallResponse?.items || getFirewallResponse?.items?.length === 0) { + const createFirewallData = { + name: GcpAccount.OUTLINE_FIREWALL_NAME, + direction: 'INGRESS', + priority: 1000, + targetTags: [GcpAccount.OUTLINE_FIREWALL_TAG], + allowed: [ + { + IPProtocol: 'all', + }, + ], + sourceRanges: ['0.0.0.0/0'], + }; + const createFirewallOperation = await this.apiClient.createFirewall(projectId, createFirewallData); + const errors = createFirewallOperation.error?.errors; + if (errors) { + throw new server.ServerInstallFailedError(`Firewall creation failed: ${errors}`); + } + } + } + + /** @see {@link Account#createServer}. */ + async createServer(projectId: string, name: string, zone: gcp.Zone): Promise { + // TODO: Move this to project setup. + await this.createFirewallIfNeeded(projectId); + + // Create VM instance + const gcpInstanceName = makeGcpInstanceName(); + const createInstanceData = { + name: gcpInstanceName, + description: name, // Show a human-readable name in the GCP console + machineType: `zones/${zone.id}/machineTypes/${GcpAccount.MACHINE_SIZE}`, + disks: [ + { + boot: true, + initializeParams: { + sourceImage: 'projects/ubuntu-os-cloud/global/images/family/ubuntu-2004-lts', + }, + }, + ], + networkInterfaces: [ + { + network: 'global/networks/default', + // Empty accessConfigs necessary to allocate ephemeral IP + accessConfigs: [{}], + }, + ], + labels: { + outline: 'true', + }, + tags: { + // This must match the firewall target tag. + items: [GcpAccount.OUTLINE_FIREWALL_TAG], + }, + metadata: { + items: [ + { + key: 'enable-guest-attributes', + value: 'TRUE', + }, + { + key: 'user-data', + value: this.getInstallScript(name), + }, + ], + }, + }; + const zoneLocator = {projectId, zoneId: zone.id}; + const createInstanceOperation = await this.apiClient.createInstance(zoneLocator, createInstanceData); + const errors = createInstanceOperation.error?.errors; + if (errors) { + throw new server.ServerInstallFailedError(`Instance creation failed: ${errors}`); + } + + const instanceId = createInstanceOperation.targetId; + const instanceLocator = {instanceId, ...zoneLocator}; + const instanceCreation = this.apiClient.computeEngineOperationZoneWait(zoneLocator, createInstanceOperation.name); + + const id = `${this.id}:${instanceId}`; + return new GcpServer(id, instanceLocator, gcpInstanceName, instanceCreation, this.apiClient); + } + + private async configureProject(projectId: string, billingAccountId: string): Promise { + // Link billing account + const updateProjectBillingInfoData = { + name: `projects/${projectId}/billingInfo`, + projectId, + billingAccountName: `billingAccounts/${billingAccountId}`, + }; + await this.apiClient.updateProjectBillingInfo(projectId, updateProjectBillingInfoData); + + // Enable APIs + const enableServicesData = { + serviceIds: GcpAccount.REQUIRED_GCP_SERVICES, + }; + const enableServicesResponse = await this.apiClient.enableServices(projectId, enableServicesData); + let enableServicesOperation = null; + while (!enableServicesOperation?.done) { + await sleep(2 * 1000); + enableServicesOperation = await this.apiClient.serviceUsageOperationGet(enableServicesResponse.name); + } + if (enableServicesResponse.error) { + // TODO: Throw error. + } + } + + private getInstallScript(serverName: string): string { + return '#!/bin/bash -eu\n' + server_install.getShellExportCommands(this.shadowboxSettings, serverName) + SCRIPT; + } +} diff --git a/server_manager/web_app/gcp_server.ts b/server_manager/web_app/gcp_server.ts new file mode 100644 index 0000000000..98f3a5c7ef --- /dev/null +++ b/server_manager/web_app/gcp_server.ts @@ -0,0 +1,274 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as gcp_api from '../cloud/gcp_api'; +import {sleep} from '../infrastructure/sleep'; +import {ValueStream} from '../infrastructure/value_stream'; +import {Zone} from '../model/gcp'; +import * as server from '../model/server'; +import {DataAmount, ManagedServerHost, MonetaryCost} from '../model/server'; +import {makePathApiClient} from './fetcher'; + +import {ShadowboxServer} from './shadowbox_server'; + +enum InstallState { + // Unknown state - server request may still be pending. + UNKNOWN = 0, + // The instance has been created. + INSTANCE_CREATED, + // The static IP has been allocated. + IP_ALLOCATED, + // The system has booted (detected by the creation of guest tags) + INSTANCE_RUNNING, + // The server has generated its management service certificate. + CERTIFICATE_CREATED, + // Server is running and has the API URL and certificate fingerprint set. + COMPLETED, + // Server installation failed. + FAILED, + // Server installation was canceled by the user. + CANCELED, +} + +function getCompletionFraction(state: InstallState): number { + // Values are based on observed installation timing. + // Installation typically takes ~2.6 minutes in total. + switch (state) { + case InstallState.UNKNOWN: + return 0.01; + case InstallState.INSTANCE_CREATED: + return 0.12; + case InstallState.IP_ALLOCATED: + return 0.14; + case InstallState.INSTANCE_RUNNING: + return 0.4; + case InstallState.CERTIFICATE_CREATED: + return 0.7; + case InstallState.COMPLETED: + return 1.0; + default: + return 0; + } +} + +function isFinal(state: InstallState): boolean { + return state === InstallState.COMPLETED || state === InstallState.FAILED || state === InstallState.CANCELED; +} + +export class GcpServer extends ShadowboxServer implements server.ManagedServer { + private static readonly GUEST_ATTRIBUTES_POLLING_INTERVAL_MS = 5 * 1000; + + private readonly instanceReadiness: Promise; + private readonly gcpHost: GcpHost; + private readonly installState = new ValueStream(InstallState.UNKNOWN); + + constructor( + id: string, + private locator: gcp_api.InstanceLocator, + private gcpInstanceName: string, // See makeGcpInstanceName() in gcp_account.ts. + instanceCreation: Promise, + private apiClient: gcp_api.RestApiClient + ) { + super(id); + // Optimization: start the check for a static IP immediately. + const hasStaticIp: Promise = this.hasStaticIp(); + this.instanceReadiness = instanceCreation + .then(async () => { + if (this.installState.isClosed()) { + return; + } + this.setInstallState(InstallState.INSTANCE_CREATED); + if (!(await hasStaticIp)) { + await this.promoteEphemeralIp(); + } + if (this.installState.isClosed()) { + return; + } + this.setInstallState(InstallState.IP_ALLOCATED); + this.pollInstallState(); // Start asynchronous polling. + }) + .catch(e => { + this.setInstallState(InstallState.FAILED); + throw e; + }); + this.gcpHost = new GcpHost(locator, gcpInstanceName, this.instanceReadiness, apiClient, this.onDelete.bind(this)); + } + + private getRegionLocator(): gcp_api.RegionLocator { + return { + regionId: new Zone(this.locator.zoneId).regionId, + projectId: this.locator.projectId, + }; + } + + private async hasStaticIp(): Promise { + try { + // By convention, the static IP for an Outline instance uses the instance's name. + await this.apiClient.getStaticIp(this.getRegionLocator(), this.gcpInstanceName); + return true; + } catch (e) { + if (is404(e)) { + // The IP address has not yet been reserved. + return false; + } + throw new server.ServerInstallFailedError(`Static IP check failed: ${e}`); + } + } + + private async promoteEphemeralIp(): Promise { + const instance = await this.apiClient.getInstance(this.locator); + // Promote ephemeral IP to static IP + const ipAddress = instance.networkInterfaces[0].accessConfigs[0].natIP; + const createStaticIpData = { + name: instance.name, + description: instance.description, + address: ipAddress, + }; + const createStaticIpOperation = await this.apiClient.createStaticIp(this.getRegionLocator(), createStaticIpData); + const operationErrors = createStaticIpOperation.error?.errors; + if (operationErrors) { + throw new server.ServerInstallFailedError(`Firewall creation failed: ${operationErrors}`); + } + } + + getHost(): ManagedServerHost { + return this.gcpHost; + } + + async *monitorInstallProgress(): AsyncGenerator { + for await (const state of this.installState.watch()) { + yield getCompletionFraction(state); + } + + if (this.installState.get() === InstallState.FAILED) { + throw new server.ServerInstallFailedError(); + } else if (this.installState.get() === InstallState.CANCELED) { + throw new server.ServerInstallCanceledError(); + } + yield getCompletionFraction(this.installState.get()); + } + + private async pollInstallState(): Promise { + while (!this.installState.isClosed()) { + const outlineGuestAttributes = await this.getOutlineGuestAttributes(); + if (outlineGuestAttributes.has('apiUrl') && outlineGuestAttributes.has('certSha256')) { + const certSha256 = outlineGuestAttributes.get('certSha256'); + const apiUrl = outlineGuestAttributes.get('apiUrl'); + this.setManagementApi(makePathApiClient(apiUrl, atob(certSha256))); + this.setInstallState(InstallState.COMPLETED); + break; + } else if (outlineGuestAttributes.has('install-error')) { + this.setInstallState(InstallState.FAILED); + break; + } else if (outlineGuestAttributes.has('certSha256')) { + this.setInstallState(InstallState.CERTIFICATE_CREATED); + } else if (outlineGuestAttributes.has('install-started')) { + this.setInstallState(InstallState.INSTANCE_RUNNING); + } + + await sleep(GcpServer.GUEST_ATTRIBUTES_POLLING_INTERVAL_MS); + } + } + + private async getOutlineGuestAttributes(): Promise> { + const result = new Map(); + const guestAttributes = await this.apiClient.getGuestAttributes(this.locator, 'outline/'); + const attributes = guestAttributes?.queryValue?.items ?? []; + attributes.forEach(entry => { + result.set(entry.key, entry.value); + }); + return result; + } + + private setInstallState(newState: InstallState): void { + console.debug(InstallState[newState]); + this.installState.set(newState); + if (isFinal(newState)) { + this.installState.close(); + } + } + + private onDelete(): void { + if (!this.installState.isClosed()) { + this.setInstallState(InstallState.CANCELED); + } + } +} + +class GcpHost implements server.ManagedServerHost { + constructor( + private readonly locator: gcp_api.InstanceLocator, + private readonly gcpInstanceName: string, + private readonly instanceReadiness: Promise, + private readonly apiClient: gcp_api.RestApiClient, + private readonly deleteCallback: () => void + ) {} + + async delete(): Promise { + this.deleteCallback(); + // The GCP API documentation doesn't specify whether instances can be deleted + // before creation has finished, and the static IP allocation is entirely + // asynchronous, so we must wait for instance setup to complete before starting + // deletion. Also, if creation failed, then deletion is trivially successful. + try { + await this.instanceReadiness; + } catch (e) { + console.warn(`Attempting deletion of server that failed setup: ${e}`); + } + const regionLocator = { + regionId: this.getCloudLocation().regionId, + projectId: this.locator.projectId, + }; + // By convention, the static IP for an Outline instance uses the instance's name. + await this.waitForDelete( + this.apiClient.deleteStaticIp(regionLocator, this.gcpInstanceName), + 'Deleted server did not have a static IP' + ); + await this.waitForDelete(this.apiClient.deleteInstance(this.locator), 'No instance for deleted server'); + } + + private async waitForDelete(deletion: Promise, msg404: string): Promise { + try { + await deletion; + // We assume that deletion will eventually succeed once the operation has + // been queued successfully, so there's no need to wait for it. + } catch (e) { + if (is404(e)) { + console.warn(msg404); + return; + } + throw e; + } + } + + getHostId(): string { + return this.locator.instanceId; + } + + getMonthlyCost(): MonetaryCost { + return undefined; + } + + getMonthlyOutboundTransferLimit(): DataAmount { + return undefined; + } + + getCloudLocation(): Zone { + return new Zone(this.locator.zoneId); + } +} + +function is404(error: Error): boolean { + return error instanceof gcp_api.HttpError && error.getStatusCode() === 404; +} diff --git a/server_manager/web_app/karma.conf.js b/server_manager/web_app/karma.conf.js new file mode 100644 index 0000000000..98160ee956 --- /dev/null +++ b/server_manager/web_app/karma.conf.js @@ -0,0 +1,58 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const webpack = require('webpack'); +const {makeConfig} = require('../base.webpack.js'); +process.env.CHROMIUM_BIN = require('puppeteer').executablePath(); + +const baseConfig = makeConfig({ + defaultMode: 'development', +}); + +const test_patterns = [ + '**/*.spec.ts', + // We need to test data_formatting in a browser context + './data_formatting.spec.ts', +]; + +let preprocessors = {}; +for (const pattern of test_patterns) { + preprocessors[pattern] = ['webpack']; +} + +module.exports = function (config) { + config.set({ + frameworks: ['jasmine'], + files: test_patterns, + preprocessors, + reporters: ['progress'], + colors: true, + logLevel: config.LOG_INFO, + browsers: ['ChromiumHeadless'], + singleRun: true, + concurrency: Infinity, + webpack: { + module: baseConfig.module, + resolve: baseConfig.resolve, + plugins: [ + ...baseConfig.plugins, + new webpack.ProvidePlugin({ + process: 'process/browser', + }), + ], + mode: baseConfig.mode, + }, + }); +}; diff --git a/server_manager/web_app/location_formatting.spec.ts b/server_manager/web_app/location_formatting.spec.ts new file mode 100644 index 0000000000..a31169796e --- /dev/null +++ b/server_manager/web_app/location_formatting.spec.ts @@ -0,0 +1,151 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as location from '../model/location'; +import {filterOptions, getShortName, localizeCountry} from './location_formatting'; + +describe('getShortName', () => { + it('basic case', () => { + expect( + getShortName({id: 'fake-id', location: location.SYDNEY}, msgId => { + expect(msgId).toEqual('geo-sydney'); + return 'foo'; + }) + ).toEqual('foo'); + }); + + it('city-state is converted to lowercase', () => { + expect( + getShortName({id: 'fake-id', location: location.SINGAPORE}, msgId => { + expect(msgId).toEqual('geo-sg'); + return 'foo'; + }) + ).toEqual('foo'); + }); + + it('returns the ID when geoId is null', () => { + expect( + getShortName({id: 'fake-id', location: null}, _msgId => { + fail(); + return null; + }) + ).toEqual('fake-id'); + }); + + it('returns empty string when the location is null', () => { + expect( + getShortName(null, _msgId => { + fail(); + return null; + }) + ).toEqual(''); + }); +}); + +describe('localizeCountry', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (!(Intl as any).DisplayNames) { + console.log('country localization requires modern Intl features'); + return; + } + + it('basic case', () => { + expect(localizeCountry(location.NEW_YORK_CITY, 'en')).toEqual('United States'); + }); + + it('other language', () => { + expect(localizeCountry(location.NEW_YORK_CITY, 'es')).toEqual('Estados Unidos'); + }); + + it('city-state is localized', () => { + expect(localizeCountry(location.SINGAPORE, 'en')).toEqual('Singapore'); + }); + + it('null is empty', () => { + expect(localizeCountry(null, 'en')).toEqual(''); + }); +}); + +describe('filterOptions', () => { + it('empty', () => { + expect(filterOptions([])).toEqual([]); + }); + + it('one available', () => { + const option = { + cloudLocation: {id: 'zone-id', location: location.SAO_PAULO}, + available: true, + }; + expect(filterOptions([option])).toEqual([option]); + }); + + it('one not available', () => { + const option = { + cloudLocation: {id: 'zone-id', location: location.SALT_LAKE_CITY}, + available: false, + }; + expect(filterOptions([option])).toEqual([option]); + }); + + it('one unrecognized', () => { + const option: location.CloudLocationOption = { + cloudLocation: {id: 'zone-id', location: null}, + available: true, + }; + expect(filterOptions([option])).toEqual([option]); + }); + + it('one unrecognized and unavailable', () => { + const option: location.CloudLocationOption = { + cloudLocation: {id: 'zone-id', location: null}, + available: false, + }; + expect(filterOptions([option])).toEqual([]); + }); + + it('one of each', () => { + const available = { + cloudLocation: {id: 'available', location: location.SAN_FRANCISCO}, + available: true, + }; + const unavailable = { + cloudLocation: {id: 'unavailable', location: location.SEOUL}, + available: false, + }; + const unrecognized: location.CloudLocationOption = { + cloudLocation: {id: 'unrecognized', location: null}, + available: true, + }; + const unrecognizedAndUnavailable: location.CloudLocationOption = { + cloudLocation: {id: 'unrecognized-and-unavailable', location: null}, + available: false, + }; + + const filtered = filterOptions([unrecognized, unavailable, unrecognizedAndUnavailable, available]); + expect(filtered).toEqual([unavailable, available, unrecognized]); + }); + + it('available preferred', () => { + const available = { + cloudLocation: {id: 'available', location: location.TOKYO}, + available: true, + }; + const unavailable = { + cloudLocation: {id: 'unavailable', location: location.TOKYO}, + available: false, + }; + const filtered = filterOptions([unavailable, available]); + expect(filtered).toEqual([available]); + }); +}); diff --git a/server_manager/web_app/location_formatting.ts b/server_manager/web_app/location_formatting.ts new file mode 100644 index 0000000000..2c962fa18c --- /dev/null +++ b/server_manager/web_app/location_formatting.ts @@ -0,0 +1,69 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {CloudLocation, CloudLocationOption, GeoLocation} from '../model/location'; + +/** + * Returns the localized place name, or the data center ID if the location is + * unknown. + */ +export function getShortName(cloudLocation: CloudLocation, localize: (id: string) => string): string { + if (!cloudLocation) { + return ''; + } + if (!cloudLocation.location) { + return cloudLocation.id; + } + return localize(`geo-${cloudLocation.location.id.toLowerCase()}`); +} + +/** + * Returns the localized country name, or "" if the country is unknown or + * unnecessary. + */ +export function localizeCountry(geoLocation: GeoLocation, language: string): string { + if (!geoLocation) { + return ''; + } + // TODO: Remove typecast after https://github.com/microsoft/TypeScript/pull/44022 + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const displayName = new (Intl as any).DisplayNames([language], {type: 'region'}); + return displayName.of(geoLocation.countryCode); +} + +/** + * Given an array of cloud location options, this function returns an array + * containing one representative option for each GeoLocation. Available + * options are preferred within each location. Available options with unknown + * GeoLocation (e.g. newly added zones) are placed at the end of the array. + */ +export function filterOptions(options: readonly T[]): T[] { + // Contains one available datacenter ID for each GeoLocation, or null if + // there are datacenters for that GeoLocation but none are available. + const map = new Map(); + const unmappedOptions: T[] = []; + + options.forEach(option => { + const geoLocation = option.cloudLocation.location; + if (geoLocation) { + if (option.available || !map.has(geoLocation.id)) { + map.set(geoLocation.id, option); + } + } else if (option.available) { + unmappedOptions.push(option); + } + }); + + return [...map.values(), ...unmappedOptions]; +} diff --git a/server_manager/web_app/main.ts b/server_manager/web_app/main.ts new file mode 100644 index 0000000000..becc0d5802 --- /dev/null +++ b/server_manager/web_app/main.ts @@ -0,0 +1,138 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import './ui_components/app-root'; + +import * as i18n from '../infrastructure/i18n'; + +import {App} from './app'; +import {CloudAccounts} from './cloud_accounts'; +import {ManualServerRepository} from './manual_server'; +import {AppRoot} from './ui_components/app-root'; +import {LanguageDef} from './ui_components/outline-language-picker'; + +const SUPPORTED_LANGUAGES: {[key: string]: LanguageDef} = { + af: {id: 'af', name: 'Afrikaans', dir: 'ltr'}, + am: {id: 'am', name: 'አማርኛ', dir: 'ltr'}, + ar: {id: 'ar', name: 'العربية', dir: 'rtl'}, + az: {id: 'az', name: 'azərbaycan', dir: 'ltr'}, + bg: {id: 'bg', name: 'български', dir: 'ltr'}, + bn: {id: 'bn', name: 'বাংলা', dir: 'ltr'}, + bs: {id: 'bs', name: 'bosanski', dir: 'ltr'}, + ca: {id: 'ca', name: 'català', dir: 'ltr'}, + cs: {id: 'cs', name: 'Čeština', dir: 'ltr'}, + da: {id: 'da', name: 'Dansk', dir: 'ltr'}, + de: {id: 'de', name: 'Deutsch', dir: 'ltr'}, + el: {id: 'el', name: 'Ελληνικά', dir: 'ltr'}, + en: {id: 'en', name: 'English', dir: 'ltr'}, + 'en-GB': {id: 'en-GB', name: 'English (United Kingdom)', dir: 'ltr'}, + es: {id: 'es', name: 'Español', dir: 'ltr'}, + 'es-419': {id: 'es-419', name: 'Español (Latinoamérica)', dir: 'ltr'}, + et: {id: 'et', name: 'eesti', dir: 'ltr'}, + fa: {id: 'fa', name: 'فارسی', dir: 'rtl'}, + fi: {id: 'fi', name: 'Suomi', dir: 'ltr'}, + fil: {id: 'fil', name: 'Filipino', dir: 'ltr'}, + fr: {id: 'fr', name: 'Français', dir: 'ltr'}, + he: {id: 'he', name: 'עברית', dir: 'rtl'}, + hi: {id: 'hi', name: 'हिन्दी', dir: 'ltr'}, + hr: {id: 'hr', name: 'Hrvatski', dir: 'ltr'}, + hu: {id: 'hu', name: 'magyar', dir: 'ltr'}, + hy: {id: 'hy', name: 'հայերեն', dir: 'ltr'}, + id: {id: 'id', name: 'Indonesia', dir: 'ltr'}, + is: {id: 'is', name: 'íslenska', dir: 'ltr'}, + it: {id: 'it', name: 'Italiano', dir: 'ltr'}, + ja: {id: 'ja', name: '日本語', dir: 'ltr'}, + ka: {id: 'ka', name: 'ქართული', dir: 'ltr'}, + kk: {id: 'kk', name: 'қазақ тілі', dir: 'ltr'}, + km: {id: 'km', name: 'ខ្មែរ', dir: 'ltr'}, + ko: {id: 'ko', name: '한국어', dir: 'ltr'}, + lo: {id: 'lo', name: 'ລາວ', dir: 'ltr'}, + lt: {id: 'lt', name: 'lietuvių', dir: 'ltr'}, + lv: {id: 'lv', name: 'latviešu', dir: 'ltr'}, + mk: {id: 'mk', name: 'македонски', dir: 'ltr'}, + mn: {id: 'mn', name: 'монгол', dir: 'ltr'}, + mr: {id: 'mr', name: 'मराठी', dir: 'ltr'}, + ms: {id: 'ms', name: 'Melayu', dir: 'ltr'}, + my: {id: 'my', name: 'မြန်မာ', dir: 'ltr'}, + ne: {id: 'ne', name: 'नेपाली', dir: 'ltr'}, + nl: {id: 'nl', name: 'Nederlands', dir: 'ltr'}, + no: {id: 'no', name: 'norsk', dir: 'ltr'}, + pl: {id: 'pl', name: 'polski', dir: 'ltr'}, + 'pt-BR': {id: 'pt-BR', name: 'Português (Brasil)', dir: 'ltr'}, + 'pt-PT': {id: 'pt-PT', name: 'Português (Portugal)', dir: 'ltr'}, + ro: {id: 'ro', name: 'română', dir: 'ltr'}, + ru: {id: 'ru', name: 'Русский', dir: 'ltr'}, + si: {id: 'si', name: 'සිංහල', dir: 'ltr'}, + sk: {id: 'sk', name: 'Slovenčina', dir: 'ltr'}, + sl: {id: 'sl', name: 'slovenščina', dir: 'ltr'}, + sq: {id: 'sq', name: 'shqip', dir: 'ltr'}, + sr: {id: 'sr', name: 'српски', dir: 'ltr'}, + 'sr-Latn': {id: 'sr-Latn', name: 'srpski (latinica)', dir: 'ltr'}, + sv: {id: 'sv', name: 'Svenska', dir: 'ltr'}, + sw: {id: 'sw', name: 'Kiswahili', dir: 'ltr'}, + ta: {id: 'ta', name: 'தமிழ்', dir: 'ltr'}, + th: {id: 'th', name: 'ไทย', dir: 'ltr'}, + tr: {id: 'tr', name: 'Türkçe', dir: 'ltr'}, + uk: {id: 'uk', name: 'Українська', dir: 'ltr'}, + ur: {id: 'ur', name: 'اردو', dir: 'rtl'}, + vi: {id: 'vi', name: 'Tiếng Việt', dir: 'ltr'}, + 'zh-CN': {id: 'zh-CN', name: '简体中文', dir: 'ltr'}, + 'zh-TW': {id: 'zh-TW', name: '繁體中文', dir: 'ltr'}, +}; + +function getLanguageToUse(): i18n.LanguageCode { + const supportedLanguages = i18n.languageList(Object.keys(SUPPORTED_LANGUAGES)); + const preferredLanguages = i18n.getBrowserLanguages(); + const overrideLanguage = window.localStorage.getItem('overrideLanguage'); + if (overrideLanguage) { + preferredLanguages.unshift(new i18n.LanguageCode(overrideLanguage)); + } + const defaultLanguage = new i18n.LanguageCode('en'); + return new i18n.LanguageMatcher(supportedLanguages, defaultLanguage).getBestSupportedLanguage(preferredLanguages); +} + +function sortLanguageDefsByName(languageDefs: LanguageDef[]) { + return languageDefs.sort((a, b) => { + return a.name > b.name ? 1 : -1; + }); +} + +document.addEventListener('WebComponentsReady', () => { + // Parse URL query params. + const params = new URL(document.URL).searchParams; + const debugMode = params.get('outlineDebugMode') === 'true'; + const version = params.get('version'); + + const shadowboxImageId = params.get('image'); + const shadowboxSettings = { + imageId: shadowboxImageId, + metricsUrl: params.get('metricsUrl'), + sentryApiUrl: params.get('sentryDsn'), + watchtowerRefreshSeconds: shadowboxImageId ? 30 : undefined, + }; + + const cloudAccounts = new CloudAccounts(shadowboxSettings, debugMode); + + // Create and start the app. + const language = getLanguageToUse(); + const languageDirection = SUPPORTED_LANGUAGES[language.string()].dir; + document.documentElement.setAttribute('dir', languageDirection); + const appRoot = document.getElementById('appRoot') as AppRoot; + appRoot.language = language.string(); + + const filteredLanguageDefs = Object.values(SUPPORTED_LANGUAGES); + appRoot.supportedLanguages = sortLanguageDefsByName(filteredLanguageDefs); + appRoot.setLanguage(language.string(), languageDirection); + new App(appRoot, version, new ManualServerRepository('manualServers'), cloudAccounts).start(); +}); diff --git a/server_manager/web_app/management_urls.spec.ts b/server_manager/web_app/management_urls.spec.ts new file mode 100644 index 0000000000..f993f54488 --- /dev/null +++ b/server_manager/web_app/management_urls.spec.ts @@ -0,0 +1,59 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {parseManualServerConfig} from './management_urls'; + +describe('parseManualServerConfig', () => { + it('basic case', () => { + const result = parseManualServerConfig('{"apiUrl":"http://abc.com/xyz", "certSha256":"1234567"}'); + expect(result.apiUrl).toEqual('http://abc.com/xyz'); + expect(result.certSha256).toEqual('1234567'); + }); + + it('ignores missing outer braces', () => { + const result = parseManualServerConfig('"apiUrl":"http://abc.com/xyz", "certSha256":"1234567"'); + expect(result.apiUrl).toEqual('http://abc.com/xyz'); + expect(result.certSha256).toEqual('1234567'); + }); + + it('ignores missing quotes on key names', () => { + const result = parseManualServerConfig('apiUrl:"http://abc.com/xyz", "certSha256":"1234567"'); + expect(result.apiUrl).toEqual('http://abc.com/xyz'); + expect(result.certSha256).toEqual('1234567'); + }); + + it('ignores missing quotes on values', () => { + const result = parseManualServerConfig('"apiUrl":http://abc.com/xyz, "certSha256":"1234567"'); + expect(result.apiUrl).toEqual('http://abc.com/xyz'); + expect(result.certSha256).toEqual('1234567'); + }); + + it('ignores content outside of braces', () => { + const result = parseManualServerConfig('working... {"apiUrl":http://abc.com/xyz, "certSha256":"1234567"} ALL DONE'); + expect(result.apiUrl).toEqual('http://abc.com/xyz'); + expect(result.certSha256).toEqual('1234567'); + }); + + it('strips whitespace', () => { + const result = parseManualServerConfig('{"apiUrl":http://abc.com/xyz, "certSha256":"123 4567"}'); + expect(result.apiUrl).toEqual('http://abc.com/xyz'); + expect(result.certSha256).toEqual('1234567'); + }); + + it('strips newlines', () => { + const result = parseManualServerConfig('{"apiUrl":http://abc.com/xyz, "certSha256":"123\n4567"}'); + expect(result.apiUrl).toEqual('http://abc.com/xyz'); + expect(result.certSha256).toEqual('1234567'); + }); +}); diff --git a/server_manager/web_app/management_urls.ts b/server_manager/web_app/management_urls.ts new file mode 100644 index 0000000000..0744b70a05 --- /dev/null +++ b/server_manager/web_app/management_urls.ts @@ -0,0 +1,43 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as jsonic from 'jsonic'; + +import {ManualServerConfig} from '../model/server'; + +// Parses a server management URL (generated by the server install script) leniently. +// TODO: ignore case of key names +// TODO: check value types +export function parseManualServerConfig(userInput: string): ManualServerConfig { + // Remove anything before and after the first and last braces, if found. + const indexOfFirstBrace = userInput.indexOf('{'); + if (indexOfFirstBrace >= 0) { + userInput = userInput.substring(indexOfFirstBrace); + } + const indexOfLastBrace = userInput.lastIndexOf('}'); + if (indexOfLastBrace >= 0) { + userInput = userInput.substring(0, indexOfLastBrace + 1); + } + + // Strip whitespace. + userInput = userInput.replace(/\s+/g, ''); + + const config = jsonic(userInput) as ManualServerConfig; + + if (!config.apiUrl) { + throw new Error('no apiUrl field'); + } + + return config; +} diff --git a/server_manager/web_app/manual_server.ts b/server_manager/web_app/manual_server.ts new file mode 100644 index 0000000000..ea28cc27b3 --- /dev/null +++ b/server_manager/web_app/manual_server.ts @@ -0,0 +1,100 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {hexToString} from '../infrastructure/hex_encoding'; +import * as server from '../model/server'; +import {makePathApiClient} from './fetcher'; + +import {ShadowboxServer} from './shadowbox_server'; + +class ManualServer extends ShadowboxServer implements server.ManualServer { + constructor(id: string, private manualServerConfig: server.ManualServerConfig, private forgetCallback: Function) { + super(id); + const fingerprint = hexToString(manualServerConfig.certSha256 ?? ''); + this.setManagementApi(makePathApiClient(manualServerConfig.apiUrl, fingerprint)); + } + + getCertificateFingerprint() { + return this.manualServerConfig.certSha256; + } + + forget(): void { + this.forgetCallback(); + } +} + +export class ManualServerRepository implements server.ManualServerRepository { + private servers: server.ManualServer[] = []; + + constructor(private storageKey: string) { + this.loadServers(); + } + + addServer(config: server.ManualServerConfig): Promise { + const existingServer = this.findServer(config); + if (existingServer) { + console.debug('server already added'); + return Promise.resolve(existingServer); + } + const server = this.createServer(config); + this.servers.push(server); + this.storeServers(); + return Promise.resolve(server); + } + + listServers(): Promise { + return Promise.resolve(this.servers); + } + + findServer(config: server.ManualServerConfig): server.ManualServer | undefined { + return this.servers.find(server => server.getManagementApiUrl() === config.apiUrl); + } + + private loadServers() { + this.servers = []; + const serversJson = localStorage.getItem(this.storageKey); + if (serversJson) { + try { + const serverConfigs = JSON.parse(serversJson); + this.servers = serverConfigs.map((config: server.ManualServerConfig) => { + return this.createServer(config); + }); + } catch (e) { + console.error('Error creating manual servers from localStorage'); + } + } + } + + private storeServers() { + const serverConfigs: server.ManualServerConfig[] = this.servers.map(server => { + return {apiUrl: server.getManagementApiUrl(), certSha256: server.getCertificateFingerprint()}; + }); + localStorage.setItem(this.storageKey, JSON.stringify(serverConfigs)); + } + + private createServer(config: server.ManualServerConfig) { + const server = new ManualServer(`manual:${config.apiUrl}`, config, () => { + this.forgetServer(server); + }); + return server; + } + + private forgetServer(serverToForget: server.ManualServer): void { + const apiUrl = serverToForget.getManagementApiUrl(); + this.servers = this.servers.filter(server => { + return apiUrl !== server.getManagementApiUrl(); + }); + this.storeServers(); + } +} diff --git a/server_manager/web_app/outline-gcp-create-server-app.ts b/server_manager/web_app/outline-gcp-create-server-app.ts new file mode 100644 index 0000000000..ef890c9490 --- /dev/null +++ b/server_manager/web_app/outline-gcp-create-server-app.ts @@ -0,0 +1,408 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import '@polymer/paper-dropdown-menu/paper-dropdown-menu'; +import '@polymer/paper-listbox/paper-listbox'; +import '@polymer/paper-input/paper-input'; +import '@polymer/paper-item/paper-item'; + +import './ui_components/outline-step-view'; +import './ui_components/outline-region-picker-step'; + +import {css, customElement, html, internalProperty, LitElement, property} from 'lit-element'; +import {unsafeHTML} from 'lit/directives/unsafe-html.js'; + +import {AppRoot} from './ui_components/app-root'; +import {BillingAccount, Project, Zone, Account} from '../model/gcp'; +import {GcpAccount, isInFreeTier} from './gcp_account'; +import {COMMON_STYLES} from './ui_components/cloud-install-styles'; +import {OutlineRegionPicker} from './ui_components/outline-region-picker-step'; +import {filterOptions, getShortName} from './location_formatting'; +import {CloudLocation} from '../model/location'; + +@customElement('outline-gcp-create-server-app') +export class GcpCreateServerApp extends LitElement { + @property({type: Function}) localize: (msgId: string, ...params: string[]) => string; + @property({type: String}) language: string; + @internalProperty() private currentPage = ''; + @internalProperty() private selectedProjectId = ''; + @internalProperty() private selectedBillingAccountId = ''; + @internalProperty() private isProjectBeingCreated = false; + + private account: GcpAccount; + private project: Project; + private billingAccounts: BillingAccount[] = []; + private regionPicker: OutlineRegionPicker; + private billingAccountsRefreshLoop: number = null; + + static get styles() { + return [ + COMMON_STYLES, + css` + :host { + --paper-input-container-input-color: var(--medium-gray); + } + .container { + display: flex; + flex-direction: column; + justify-content: center; + height: 100%; + align-items: center; + padding: 156px 0; + font-size: 14px; + } + .card { + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: space-between; + margin: 24px 0; + background: var(--background-contrast-color); + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 1px 3px 0 rgba(0, 0, 0, 0.2); + border-radius: 2px; + } + .section { + padding: 24px 12px; + color: var(--light-gray); + background: var(--background-contrast-color); + border-radius: 2px; + } + .section:not(:first-child) { + margin-top: 8px; + } + .section-header { + padding: 0 6px 0; + display: flex; + } + .section-content { + padding: 0 48px; + } + .instructions { + font-size: 16px; + line-height: 26px; + margin-left: 16px; + flex: 2; + } + .stepcircle { + height: 26px; + width: 26px; + font-size: 14px; + border-radius: 50%; + float: left; + vertical-align: middle; + color: #000; + background-color: #fff; + margin: auto; + text-align: center; + line-height: 26px; + } + @media (min-width: 1025px) { + paper-card { + /* Set min with for the paper-card to grow responsively. */ + min-width: 600px; + } + } + .card p { + color: var(--light-gray); + width: 100%; + text-align: center; + } + #projectName { + width: 250px; + } + #billingAccount { + width: 250px; + } + paper-button { + background: var(--primary-green); + color: var(--light-gray); + width: 100%; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 2px; + } + paper-button[disabled] { + color: var(--medium-gray); + background: transparent; + } + `, + ]; + } + + render() { + switch (this.currentPage) { + case 'billingAccountSetup': + return this.renderBillingAccountSetup(); + case 'projectSetup': + return this.renderProjectSetup(); + case 'regionPicker': + return this.renderRegionPicker(); + default: + } + } + + private renderBillingAccountSetup() { + const openLink = ''; + const closeLink = ''; + return html` + ${this.localize('gcp-billing-title')} + + ${unsafeHTML(this.localize('gcp-billing-description', 'openLink', openLink, 'closeLink', closeLink))} + + + + ${this.localize('gcp-billing-action')} + + + +
+ +

${unsafeHTML(this.localize('gcp-billing-body', 'openLink', openLink, 'closeLink', closeLink))}

+
+ +
+
`; + } + + private renderProjectSetup() { + return html` + Create your Google Cloud Platform project. + This will create a new project on your GCP account to hold your Outline servers. + + ${this.isProjectBeingCreated + ? // TODO: Support canceling server creation. + html`IN PROGRESS...` + : html` + CREATE PROJECT + `} + +
+
+ 1 +
Name your new Google Cloud Project
+
+
+ + +
+
+ +
+
+ 2 +
Choose your preferred billing method for this project
+
+
+ + + ${this.billingAccounts.map(billingAccount => { + return html`${billingAccount.name}`; + })} + + +
+
+ ${this.isProjectBeingCreated ? html`` : ''} +
`; + } + + private renderRegionPicker() { + return html` + `; + } + + async start(account: Account): Promise { + this.init(); + this.account = account as GcpAccount; + + try { + this.billingAccounts = await this.account.listOpenBillingAccounts(); + const projects = await this.account.listProjects(); + // TODO: We don't support multiple projects atm, but we will want to allow + // the user to choose the appropriate one. + this.project = projects?.[0]; + } catch (e) { + // TODO: Surface this error to the user. + console.warn('Error fetching GCP account info', e); + } + if (await this.isProjectHealthy()) { + this.showRegionPicker(); + } else if (!(this.billingAccounts?.length > 0)) { + this.showBillingAccountSetup(); + // Check every five seconds to see if an account has been added. + this.billingAccountsRefreshLoop = window.setInterval(() => { + try { + this.refreshBillingAccounts(); + } catch (e) { + console.warn('Billing account refresh error', e); + } + }, 5000); + } else { + this.showProjectSetup(this.project); + } + } + + private async isProjectHealthy(): Promise { + return this.project ? await this.account.isProjectHealthy(this.project.id) : false; + } + + disconnectedCallback() { + super.disconnectedCallback(); + this.stopRefreshingBillingAccounts(); + } + + private init() { + this.currentPage = ''; + this.selectedProjectId = ''; + this.selectedBillingAccountId = ''; + this.stopRefreshingBillingAccounts(); + } + + private showBillingAccountSetup(): void { + this.currentPage = 'billingAccountSetup'; + } + + private async refreshBillingAccounts(): Promise { + this.billingAccounts = await this.account.listOpenBillingAccounts(); + + if (this.billingAccounts?.length > 0) { + this.stopRefreshingBillingAccounts(); + if (await this.isProjectHealthy()) { + this.showRegionPicker(); + } else { + this.showProjectSetup(this.project); + } + bringToFront(); + } + } + + public stopRefreshingBillingAccounts(): void { + window.clearInterval(this.billingAccountsRefreshLoop); + this.billingAccountsRefreshLoop = null; + } + + private showError(message: string) { + const appRoot: AppRoot = document.getElementById('appRoot') as AppRoot; + appRoot.showError(message); + } + + private async handleBillingVerificationNextTap(): Promise { + try { + await this.refreshBillingAccounts(); + } catch (e) { + this.showError(this.localize('gcp-billing-error')); + } + if (this.billingAccounts?.length > 0) { + await this.showProjectSetup(); + } else { + this.showError(this.localize('gcp-billing-error-zero')); + } + } + + private async showProjectSetup(existingProject?: Project): Promise { + this.project = existingProject ?? null; + this.selectedProjectId = this.project?.id ?? this.makeProjectName(); + this.selectedBillingAccountId = this.billingAccounts[0].id; + this.currentPage = 'projectSetup'; + } + + private isProjectSetupNextEnabled(projectId: string, billingAccountId: string): boolean { + // TODO: Proper validation + return projectId !== '' && billingAccountId !== ''; + } + + private async handleProjectSetupNextTap(): Promise { + this.isProjectBeingCreated = true; + try { + if (!this.project) { + this.project = await this.account.createProject(this.selectedProjectId, this.selectedBillingAccountId); + } else { + await this.account.repairProject(this.project.id, this.selectedBillingAccountId); + } + this.showRegionPicker(); + } catch (e) { + this.showError(this.localize('gcp-project-setup-error')); + console.warn('Project setup failed:', e); + } + this.isProjectBeingCreated = false; + } + + private async showRegionPicker(): Promise { + const isProjectHealthy = await this.account.isProjectHealthy(this.project.id); + if (!isProjectHealthy) { + return this.showProjectSetup(); + } + + this.currentPage = 'regionPicker'; + const zoneOptions = await this.account.listLocations(this.project.id); + // Note: This relies on a side effect of the previous call to `await`. + // `this.regionPicker` is null after `this.currentPage`, and is only populated + // asynchronously. + this.regionPicker = this.shadowRoot.querySelector('#regionPicker') as OutlineRegionPicker; + this.regionPicker.options = filterOptions(zoneOptions).map(option => ({ + markedBestValue: isInFreeTier(option.cloudLocation), + ...option, + })); + } + + private onProjectIdChanged(event: CustomEvent) { + this.selectedProjectId = event.detail.value; + } + private onBillingAccountSelected(event: CustomEvent) { + this.selectedBillingAccountId = event.detail.value; + } + + private async onRegionSelected(event: CustomEvent) { + event.stopPropagation(); + + this.regionPicker.isServerBeingCreated = true; + const zone = event.detail.selectedLocation as Zone; + const name = this.makeLocalizedServerName(zone); + const server = await this.account.createServer(this.project.id, name, zone); + const params = {bubbles: true, composed: true, detail: {server}}; + const serverCreatedEvent = new CustomEvent('GcpServerCreated', params); + this.dispatchEvent(serverCreatedEvent); + } + + private makeProjectName(): string { + return `outline-${Math.random().toString(20).substring(3)}`; + } + + private makeLocalizedServerName(cloudLocation: CloudLocation): string { + const placeName = getShortName(cloudLocation, this.localize); + return this.localize('server-name', 'serverLocation', placeName); + } +} diff --git a/server_manager/web_app/server_install.spec.ts b/server_manager/web_app/server_install.spec.ts new file mode 100644 index 0000000000..125993aace --- /dev/null +++ b/server_manager/web_app/server_install.spec.ts @@ -0,0 +1,54 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {getShellExportCommands, ShadowboxSettings} from './server_install'; + +describe('getShellExportCommands', () => { + it('fully populated', () => { + const settings: ShadowboxSettings = { + imageId: 'foo', + metricsUrl: 'https://metrics.example/', + sentryApiUrl: 'https://sentry.example/', + watchtowerRefreshSeconds: 999, + }; + const serverName = 'Outline Server Foo'; + expect(getShellExportCommands(settings, serverName)).toEqual( + "export SB_IMAGE='foo'\n" + + "export WATCHTOWER_REFRESH_SECONDS='999'\n" + + "export SENTRY_API_URL='https://sentry.example/'\n" + + "export SB_METRICS_URL='https://metrics.example/'\n" + + 'export SB_DEFAULT_SERVER_NAME="$(printf \'Outline Server Foo\')"\n' + ); + }); + + it('minimal', () => { + const settings: ShadowboxSettings = { + imageId: null, + metricsUrl: '', + }; + const serverName = ''; + expect(getShellExportCommands(settings, serverName)).toEqual('export SB_DEFAULT_SERVER_NAME="$(printf \'\')"\n'); + }); + + it('server name escaping', () => { + const settings: ShadowboxSettings = { + imageId: '', + metricsUrl: null, + }; + const serverName = 'Outline Server فرانكفورت'; + expect(getShellExportCommands(settings, serverName)).toEqual( + 'export SB_DEFAULT_SERVER_NAME="$(printf \'Outline Server \\u0641\\u0631\\u0627\\u0646\\u0643\\u0641\\u0648\\u0631\\u062a\')"\n' + ); + }); +}); diff --git a/server_manager/web_app/server_install.ts b/server_manager/web_app/server_install.ts new file mode 100644 index 0000000000..b77cbb74f7 --- /dev/null +++ b/server_manager/web_app/server_install.ts @@ -0,0 +1,45 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** Represents the settings needed to launch a dockerized shadowbox. */ +export interface ShadowboxSettings { + imageId: string; + metricsUrl: string; + sentryApiUrl?: string; + watchtowerRefreshSeconds?: number; +} + +export function getShellExportCommands(settings: ShadowboxSettings, serverName: string): string { + const variables: {[name: string]: string | number} = { + SB_IMAGE: settings.imageId, + WATCHTOWER_REFRESH_SECONDS: settings.watchtowerRefreshSeconds, + SENTRY_API_URL: settings.sentryApiUrl, + SB_METRICS_URL: settings.metricsUrl, + }; + const lines: string[] = []; + for (const name in variables) { + if (variables[name]) { + lines.push(`export ${name}='${variables[name]}'`); + } + } + lines.push(`export SB_DEFAULT_SERVER_NAME="$(printf '${bashEscape(serverName)}')"`); + return lines.join('\n') + '\n'; +} + +function bashEscape(s: string): string { + // Replace each non-ASCII character with a unicode escape sequence that + // is understood by bash. This avoids an apparent bug in DigitalOcean's + // handling of unicode characters in the user_data value. + return s.replace(/\P{ASCII}/gu, c => '\\u' + c.charCodeAt(0).toString(16).padStart(4, '0')); +} diff --git a/server_manager/web_app/shadowbox_server.ts b/server_manager/web_app/shadowbox_server.ts new file mode 100644 index 0000000000..9b40261413 --- /dev/null +++ b/server_manager/web_app/shadowbox_server.ts @@ -0,0 +1,236 @@ +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as semver from 'semver'; + +import * as server from '../model/server'; +import {PathApiClient} from '../infrastructure/path_api'; + +interface AccessKeyJson { + id: string; + name: string; + accessUrl: string; +} + +interface ServerConfigJson { + name: string; + metricsEnabled: boolean; + serverId: string; + createdTimestampMs: number; + portForNewAccessKeys: number; + hostnameForAccessKeys: string; + version: string; + // This is the server default data limit. We use this instead of defaultDataLimit for API + // backwards compatibility. + accessKeyDataLimit?: server.DataLimit; +} + +// Byte transfer stats for the past 30 days, including both inbound and outbound. +// TODO: this is copied at src/shadowbox/model/metrics.ts. Both copies should +// be kept in sync, until we can find a way to share code between the web_app +// and shadowbox. +interface DataUsageByAccessKeyJson { + // The accessKeyId should be of type AccessKeyId, however that results in the tsc + // error TS1023: An index signature parameter type must be 'string' or 'number'. + // See https://github.com/Microsoft/TypeScript/issues/2491 + // TODO: this still says "UserId", changing to "AccessKeyId" will require + // a change on the shadowbox server. + bytesTransferredByUserId: {[accessKeyId: string]: number}; +} + +// Converts the access key JSON from the API to its model. +function makeAccessKeyModel(apiAccessKey: AccessKeyJson): server.AccessKey { + return apiAccessKey as server.AccessKey; +} + +export class ShadowboxServer implements server.Server { + private api: PathApiClient; + private serverConfig: ServerConfigJson; + + constructor(private readonly id: string) {} + + getId(): string { + return this.id; + } + + getAccessKey(accessKeyId: server.AccessKeyId): Promise { + return this.api.request('access-keys/' + accessKeyId).then(response => { + return makeAccessKeyModel(response); + }); + } + + listAccessKeys(): Promise { + console.info('Listing access keys'); + return this.api.request<{accessKeys: AccessKeyJson[]}>('access-keys').then(response => { + return response.accessKeys.map(makeAccessKeyModel); + }); + } + + async addAccessKey(): Promise { + console.info('Adding access key'); + return makeAccessKeyModel(await this.api.request('access-keys', 'POST')); + } + + renameAccessKey(accessKeyId: server.AccessKeyId, name: string): Promise { + console.info('Renaming access key'); + return this.api.requestForm('access-keys/' + accessKeyId + '/name', 'PUT', {name}); + } + + removeAccessKey(accessKeyId: server.AccessKeyId): Promise { + console.info('Removing access key'); + return this.api.request('access-keys/' + accessKeyId, 'DELETE'); + } + + async setDefaultDataLimit(limit: server.DataLimit): Promise { + console.info(`Setting server default data limit: ${JSON.stringify(limit)}`); + await this.api.requestJson(this.getDefaultDataLimitPath(), 'PUT', {limit}); + this.serverConfig.accessKeyDataLimit = limit; + } + + async removeDefaultDataLimit(): Promise { + console.info(`Removing server default data limit`); + await this.api.request(this.getDefaultDataLimitPath(), 'DELETE'); + delete this.serverConfig.accessKeyDataLimit; + } + + getDefaultDataLimit(): server.DataLimit | undefined { + return this.serverConfig.accessKeyDataLimit; + } + + private getDefaultDataLimitPath(): string { + const version = this.getVersion(); + if (semver.gte(version, '1.4.0')) { + // Data limits became a permanent feature in shadowbox v1.4.0. + return 'server/access-key-data-limit'; + } + return 'experimental/access-key-data-limit'; + } + + async setAccessKeyDataLimit(keyId: server.AccessKeyId, limit: server.DataLimit): Promise { + console.info(`Setting data limit of ${limit.bytes} bytes for access key ${keyId}`); + await this.api.requestJson(`access-keys/${keyId}/data-limit`, 'PUT', {limit}); + } + + async removeAccessKeyDataLimit(keyId: server.AccessKeyId): Promise { + console.info(`Removing data limit from access key ${keyId}`); + await this.api.request(`access-keys/${keyId}/data-limit`, 'DELETE'); + } + + async getDataUsage(): Promise { + const jsonResponse = await this.api.request('metrics/transfer'); + const usageMap = new Map(); + for (const [accessKeyId, bytes] of Object.entries(jsonResponse.bytesTransferredByUserId)) { + usageMap.set(accessKeyId, bytes ?? 0); + } + return usageMap; + } + + getName(): string { + return this.serverConfig?.name; + } + + async setName(name: string): Promise { + console.info('Setting server name'); + await this.api.requestJson('name', 'PUT', {name}); + this.serverConfig.name = name; + } + + getVersion(): string { + return this.serverConfig.version; + } + + getMetricsEnabled(): boolean { + return this.serverConfig.metricsEnabled; + } + + async setMetricsEnabled(metricsEnabled: boolean): Promise { + const action = metricsEnabled ? 'Enabling' : 'Disabling'; + console.info(`${action} metrics`); + await this.api.requestJson('metrics/enabled', 'PUT', {metricsEnabled}); + this.serverConfig.metricsEnabled = metricsEnabled; + } + + getMetricsId(): string { + return this.serverConfig.serverId; + } + + isHealthy(timeoutMs = 30000): Promise { + return new Promise((fulfill, _reject) => { + // Query the API and expect a successful response to validate that the + // service is up and running. + this.getServerConfig().then( + serverConfig => { + this.serverConfig = serverConfig; + fulfill(true); + }, + _e => { + fulfill(false); + } + ); + // Return not healthy if API doesn't complete within timeoutMs. + setTimeout(() => { + fulfill(false); + }, timeoutMs); + }); + } + + getCreatedDate(): Date { + return new Date(this.serverConfig.createdTimestampMs); + } + + async setHostnameForAccessKeys(hostname: string): Promise { + console.info(`setHostname ${hostname}`); + this.serverConfig.hostnameForAccessKeys = hostname; + await this.api.requestJson('server/hostname-for-access-keys', 'PUT', {hostname}); + this.serverConfig.hostnameForAccessKeys = hostname; + } + + getHostnameForAccessKeys(): string { + try { + return this.serverConfig?.hostnameForAccessKeys ?? new URL(this.api.base).hostname; + } catch (e) { + return ''; + } + } + + getPortForNewAccessKeys(): number | undefined { + try { + if (typeof this.serverConfig.portForNewAccessKeys !== 'number') { + return undefined; + } + return this.serverConfig.portForNewAccessKeys; + } catch (e) { + return undefined; + } + } + + async setPortForNewAccessKeys(newPort: number): Promise { + console.info(`setPortForNewAccessKeys: ${newPort}`); + await this.api.requestJson('server/port-for-new-access-keys', 'PUT', {port: newPort}); + this.serverConfig.portForNewAccessKeys = newPort; + } + + private async getServerConfig(): Promise { + console.info('Retrieving server configuration'); + return await this.api.request('server'); + } + + protected setManagementApi(api: PathApiClient): void { + this.api = api; + } + + getManagementApiUrl(): string { + return this.api.base; + } +} diff --git a/server_manager/web_app/start.action.sh b/server_manager/web_app/start.action.sh new file mode 100755 index 0000000000..5321eaa68e --- /dev/null +++ b/server_manager/web_app/start.action.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# +# Copyright 2018 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu + +rm -rf "${BUILD_DIR}/server_manager/web_app" + +node src/build/run_action.mjs server_manager/web_app/build_install_script + +webpack-dev-server --config=src/server_manager/browser.webpack.js --open diff --git a/server_manager/web_app/start_gallery.action.sh b/server_manager/web_app/start_gallery.action.sh new file mode 100755 index 0000000000..fba8924af4 --- /dev/null +++ b/server_manager/web_app/start_gallery.action.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# +# Copyright 2018 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu + +webpack-dev-server --config=src/server_manager/gallery.webpack.js --open \ No newline at end of file diff --git a/server_manager/web_app/survey.spec.ts b/server_manager/web_app/survey.spec.ts new file mode 100644 index 0000000000..c01d1daaad --- /dev/null +++ b/server_manager/web_app/survey.spec.ts @@ -0,0 +1,101 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {InMemoryStorage} from '../infrastructure/memory_storage'; + +import {OutlineSurveys} from './survey'; + +describe('Surveys', () => { + it('presents data limits surveys with the correct arguments', async done => { + const view = new FakeSurveyDialog(); + const storage = new InMemoryStorage(); + const surveys = new OutlineSurveys(view, storage, 0); + + await surveys.presentDataLimitsEnabledSurvey(); + expect(view.title).toEqual('survey-data-limits-title'); + expect(view.surveyLink).toEqual( + 'https://docs.google.com/forms/d/e/1FAIpQLSeXQ5WUHXQHlF1Ul_ViX52GjTUPlrRB_7rhwbol3dKJfM4Kiw/viewform' + ); + + await surveys.presentDataLimitsDisabledSurvey(); + expect(view.title).toEqual('survey-data-limits-title'); + expect(view.surveyLink).toEqual( + 'https://docs.google.com/forms/d/e/1FAIpQLSc2ZNx0C1a-alFlXLxhJ8jWk-WgcxqKilFoQ5ToI8HBOK9qRA/viewform' + ); + done(); + }); + + it('presents data limits surveys after the default prompt impression delay', async done => { + const TEST_PROMPT_IMPRESSION_DELAY_MS = 750; + const view = new FakeSurveyDialog(); + const storage = new InMemoryStorage(); + const surveys = new OutlineSurveys(view, storage, TEST_PROMPT_IMPRESSION_DELAY_MS); + + let start = Date.now(); + await surveys.presentDataLimitsEnabledSurvey(); + let delay = Date.now() - start; + expect(delay).toBeGreaterThanOrEqual(TEST_PROMPT_IMPRESSION_DELAY_MS); + + start = Date.now(); + await surveys.presentDataLimitsDisabledSurvey(); + delay = Date.now() - start; + expect(delay).toBeGreaterThanOrEqual(TEST_PROMPT_IMPRESSION_DELAY_MS); + done(); + }); + + it('presents data limits surveys once', async done => { + const view = new FakeSurveyDialog(); + const storage = new InMemoryStorage(); + const surveys = new OutlineSurveys(view, storage, 0); + + await surveys.presentDataLimitsEnabledSurvey(); + expect(storage.getItem('dataLimitsEnabledSurvey')).toEqual('true'); + await surveys.presentDataLimitsDisabledSurvey(); + expect(storage.getItem('dataLimitsDisabledSurvey')).toEqual('true'); + + spyOn(view, 'open'); + await surveys.presentDataLimitsEnabledSurvey(); + expect(view.open).not.toHaveBeenCalled(); + await surveys.presentDataLimitsDisabledSurvey(); + expect(view.open).not.toHaveBeenCalled(); + done(); + }); + + it('does not present data limits surveys after availability date', async done => { + const view = new FakeSurveyDialog(); + const storage = new InMemoryStorage(); + const yesterday = new Date(new Date().setDate(new Date().getDate() - 1)); + const surveys = new OutlineSurveys(view, storage, 0, yesterday); + spyOn(view, 'open'); + + await surveys.presentDataLimitsEnabledSurvey(); + expect(view.open).not.toHaveBeenCalled(); + await surveys.presentDataLimitsDisabledSurvey(); + expect(view.open).not.toHaveBeenCalled(); + done(); + }); +}); + +class FakeSurveyDialog implements polymer.Base { + title: string; + surveyLink: string; + is: 'fake-survey-dialog'; + localize(messageId: string) { + return messageId; + } + open(title: string, surveyLink: string) { + this.title = title; + this.surveyLink = surveyLink; + } +} diff --git a/server_manager/web_app/survey.ts b/server_manager/web_app/survey.ts new file mode 100644 index 0000000000..3afbf736f1 --- /dev/null +++ b/server_manager/web_app/survey.ts @@ -0,0 +1,66 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import {sleep} from '../infrastructure/sleep'; +import {Surveys} from '../model/survey'; + +export const DEFAULT_PROMPT_IMPRESSION_DELAY_MS = 3000; + +export class OutlineSurveys implements Surveys { + constructor( + private view: polymer.Base, + private storage: Storage = localStorage, + private promptImpressionDelayMs: number = DEFAULT_PROMPT_IMPRESSION_DELAY_MS, + private dataLimitsAvailabilityDate?: Date + ) {} + + async presentDataLimitsEnabledSurvey() { + if (this.isSurveyExpired(this.dataLimitsAvailabilityDate)) { + return; + } + await this.presentSurvey( + 'dataLimitsEnabledSurvey', + this.view.localize('survey-data-limits-title'), + 'https://docs.google.com/forms/d/e/1FAIpQLSeXQ5WUHXQHlF1Ul_ViX52GjTUPlrRB_7rhwbol3dKJfM4Kiw/viewform' + ); + } + + async presentDataLimitsDisabledSurvey() { + if (this.isSurveyExpired(this.dataLimitsAvailabilityDate)) { + return; + } + await this.presentSurvey( + 'dataLimitsDisabledSurvey', + this.view.localize('survey-data-limits-title'), + 'https://docs.google.com/forms/d/e/1FAIpQLSc2ZNx0C1a-alFlXLxhJ8jWk-WgcxqKilFoQ5ToI8HBOK9qRA/viewform' + ); + } + + // Displays a survey dialog for`surveyId` with title `surveyTitle` and a link to `surveyLink` + // after `promptImpressionDelayMs` has elapsed. Rate-limits the survey to once per user. + private async presentSurvey(surveyId: string, surveyTitle: string, surveyLink: string) { + if (this.storage.getItem(surveyId)) { + return; + } + await sleep(this.promptImpressionDelayMs); + this.view.open(surveyTitle, surveyLink); + this.storage.setItem(surveyId, 'true'); + } + + // Returns whether `surveyAvailabilityDate` is in the past. + private isSurveyExpired(surveyAvailabilityDate: Date | undefined) { + const now = new Date(); + return surveyAvailabilityDate && now > surveyAvailabilityDate; + } +} diff --git a/server_manager/web_app/test.action.sh b/server_manager/web_app/test.action.sh new file mode 100755 index 0000000000..9e5da6a5a1 --- /dev/null +++ b/server_manager/web_app/test.action.sh @@ -0,0 +1,18 @@ +#!/bin/bash -eu +# +# Copyright 2020 The Outline Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +npm run action server_manager/web_app/build_install_script +karma start "${ROOT_DIR}/src/server_manager/web_app/karma.conf.js" diff --git a/server_manager/web_app/testing/models.ts b/server_manager/web_app/testing/models.ts new file mode 100644 index 0000000000..de1e54b34e --- /dev/null +++ b/server_manager/web_app/testing/models.ts @@ -0,0 +1,279 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as accounts from '../../model/accounts'; +import * as digitalocean from '../../model/digitalocean'; +import * as gcp from '../../model/gcp'; +import * as server from '../../model/server'; + +export class FakeDigitalOceanAccount implements digitalocean.Account { + private servers: server.ManagedServer[] = []; + + constructor(private accessToken = 'fake-access-token') {} + + getId(): string { + return 'account-id'; + } + async getName(): Promise { + return 'fake-digitalocean-account-name'; + } + async getStatus(): Promise { + return { + needsBillingInfo: false, + needsEmailVerification: false, + dropletLimit: 3, + hasReachedLimit: false, + }; + } + listServers() { + return Promise.resolve(this.servers); + } + async hasReachedLimit(): Promise { + return false; + } + listLocations() { + return Promise.resolve([ + { + cloudLocation: new digitalocean.Region('AMS999'), + available: true, + }, + { + cloudLocation: new digitalocean.Region('FRA999'), + available: false, + }, + ]); + } + createServer(region: digitalocean.Region) { + const newServer = new FakeManagedServer(region.id, false); + this.servers.push(newServer); + return Promise.resolve(newServer); + } + getAccessToken(): string { + return this.accessToken; + } +} + +export class FakeGcpAccount implements gcp.Account { + constructor( + private refreshToken = 'fake-access-token', + private billingAccounts: gcp.BillingAccount[] = [], + private locations: gcp.ZoneOption[] = [] + ) {} + + getId() { + return 'id'; + } + async getName(): Promise { + return 'fake-gcp-account-name'; + } + getRefreshToken(): string { + return this.refreshToken; + } + createServer(_projectId: string, _name: string, _zone: gcp.Zone): Promise { + return undefined; + } + async listLocations(_projectId: string): Promise> { + return this.locations; + } + async listServers(_projectId: string): Promise { + return []; + } + async createProject(_id: string, _billingAccountId: string): Promise { + return { + id: 'project-id', + name: 'project-name', + }; + } + async isProjectHealthy(_projectId: string): Promise { + return true; + } + async listOpenBillingAccounts(): Promise { + return this.billingAccounts; + } + async listProjects(): Promise { + return []; + } +} + +export class FakeServer implements server.Server { + private name = 'serverName'; + private metricsId: string; + private metricsEnabled = false; + apiUrl: string; + constructor(protected id: string) { + this.metricsId = Math.random().toString(); + } + getId() { + return this.id; + } + getName() { + return this.name; + } + setName(name: string) { + this.name = name; + return Promise.resolve(); + } + getVersion() { + return '1.2.3'; + } + getAccessKey(accessKeyId: server.AccessKeyId) { + return Promise.reject(new Error(`Access key "${accessKeyId}" not found`)); + } + listAccessKeys() { + return Promise.resolve([]); + } + getMetricsEnabled() { + return this.metricsEnabled; + } + setMetricsEnabled(metricsEnabled: boolean) { + this.metricsEnabled = metricsEnabled; + return Promise.resolve(); + } + getMetricsId() { + return this.metricsId; + } + isHealthy() { + return Promise.resolve(true); + } + getCreatedDate() { + return new Date(); + } + getDataUsage() { + return Promise.resolve(new Map()); + } + addAccessKey() { + return Promise.reject(new Error('FakeServer.addAccessKey not implemented')); + } + renameAccessKey(_accessKeyId: server.AccessKeyId, _name: string) { + return Promise.reject(new Error('FakeServer.renameAccessKey not implemented')); + } + removeAccessKey(_accessKeyId: server.AccessKeyId) { + return Promise.reject(new Error('FakeServer.removeAccessKey not implemented')); + } + setHostnameForAccessKeys(_hostname: string) { + return Promise.reject(new Error('FakeServer.setHostname not implemented')); + } + getHostnameForAccessKeys() { + return 'fake-server'; + } + getManagementApiUrl() { + return this.apiUrl || Math.random().toString(); + } + getPortForNewAccessKeys(): number | undefined { + return undefined; + } + setPortForNewAccessKeys(): Promise { + return Promise.reject(new Error('FakeServer.setPortForNewAccessKeys not implemented')); + } + setAccessKeyDataLimit(_accessKeyId: string, _limit: server.DataLimit): Promise { + return Promise.reject(new Error('FakeServer.setAccessKeyDataLimit not implemented')); + } + removeAccessKeyDataLimit(_accessKeyId: string): Promise { + return Promise.reject(new Error('FakeServer.removeAccessKeyDataLimit not implemented')); + } + setDefaultDataLimit(_limit: server.DataLimit): Promise { + return Promise.reject(new Error('FakeServer.setDefaultDataLimit not implemented')); + } + removeDefaultDataLimit(): Promise { + return Promise.resolve(); + } + getDefaultDataLimit(): server.DataLimit | undefined { + return undefined; + } +} + +export class FakeManualServer extends FakeServer implements server.ManualServer { + constructor(public manualServerConfig: server.ManualServerConfig) { + super(manualServerConfig.apiUrl); + } + getManagementApiUrl() { + return this.manualServerConfig.apiUrl; + } + forget() { + return Promise.reject(new Error('FakeManualServer.forget not implemented')); + } + getCertificateFingerprint() { + return this.manualServerConfig.certSha256; + } +} + +export class FakeManualServerRepository implements server.ManualServerRepository { + private servers: server.ManualServer[] = []; + + addServer(config: server.ManualServerConfig) { + const newServer = new FakeManualServer(config); + this.servers.push(newServer); + return Promise.resolve(newServer); + } + + findServer(config: server.ManualServerConfig) { + return this.servers.find(server => server.getManagementApiUrl() === config.apiUrl); + } + + listServers() { + return Promise.resolve(this.servers); + } +} + +export class FakeManagedServer extends FakeServer implements server.ManagedServer { + constructor(id: string, private isInstalled = true) { + super(id); + } + async *monitorInstallProgress() { + yield 0.5; + if (!this.isInstalled) { + // Leave the progress bar at 0.5 and never return. + await new Promise(() => {}); + } + } + getHost() { + return { + getMonthlyOutboundTransferLimit: () => ({terabytes: 1}), + getMonthlyCost: () => ({usd: 5}), + getCloudLocation: () => new digitalocean.Region('AMS999'), + delete: () => Promise.resolve(), + getHostId: () => 'fake-host-id', + }; + } +} + +export class FakeCloudAccounts implements accounts.CloudAccounts { + constructor(private digitalOceanAccount: digitalocean.Account = null, private gcpAccount: gcp.Account = null) {} + + connectDigitalOceanAccount(accessToken: string): digitalocean.Account { + this.digitalOceanAccount = new FakeDigitalOceanAccount(accessToken); + return this.digitalOceanAccount; + } + + connectGcpAccount(refreshToken: string): gcp.Account { + this.gcpAccount = new FakeGcpAccount(refreshToken); + return this.gcpAccount; + } + + disconnectDigitalOceanAccount(): void { + this.digitalOceanAccount = null; + } + + disconnectGcpAccount(): void { + this.gcpAccount = null; + } + + getDigitalOceanAccount(): digitalocean.Account { + return this.digitalOceanAccount; + } + + getGcpAccount(): gcp.Account { + return this.gcpAccount; + } +} diff --git a/server_manager/web_app/ui_components/app-root.ts b/server_manager/web_app/ui_components/app-root.ts new file mode 100644 index 0000000000..2e78a16d84 --- /dev/null +++ b/server_manager/web_app/ui_components/app-root.ts @@ -0,0 +1,1133 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; +import '@polymer/app-layout/app-drawer/app-drawer'; +import '@polymer/app-layout/app-drawer-layout/app-drawer-layout'; +import '@polymer/app-layout/app-toolbar/app-toolbar'; +import '@polymer/iron-icon/iron-icon'; +import '@polymer/iron-icons/iron-icons'; +import '@polymer/iron-pages/iron-pages'; +import '@polymer/paper-icon-button/paper-icon-button'; +import '@polymer/paper-toast/paper-toast'; +import '@polymer/paper-dialog/paper-dialog'; +import '@polymer/paper-dialog-scrollable/paper-dialog-scrollable'; +import '@polymer/paper-listbox/paper-listbox'; +import '@polymer/paper-menu-button/paper-menu-button'; +import './cloud-install-styles'; +import './outline-about-dialog'; +import './outline-do-oauth-step'; +import './outline-gcp-oauth-step'; +import '../outline-gcp-create-server-app'; +import './outline-feedback-dialog'; +import './outline-survey-dialog'; +import './outline-intro-step'; +import './outline-per-key-data-limit-dialog'; +import './outline-language-picker'; +import './outline-manual-server-entry'; +import './outline-modal-dialog'; +import './outline-region-picker-step'; +import './outline-server-list'; +import './outline-tos-view'; + +import './if_messages'; + +import {AppLocalizeBehavior} from '@polymer/app-localize-behavior/app-localize-behavior'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; +import {PolymerElement} from '@polymer/polymer/polymer-element'; +import {DisplayCloudId} from './cloud-assets'; + +import type {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin'; +import type {AppDrawerElement} from '@polymer/app-layout/app-drawer/app-drawer'; +import type {AppDrawerLayoutElement} from '@polymer/app-layout/app-drawer-layout/app-drawer-layout'; +import type {PaperDialogElement} from '@polymer/paper-dialog/paper-dialog'; +import type {PaperToastElement} from '@polymer/paper-toast/paper-toast'; +import type {PolymerElementProperties} from '@polymer/polymer/interfaces'; +import type {OutlineRegionPicker} from './outline-region-picker-step'; +import type {OutlineDoOauthStep} from './outline-do-oauth-step'; +import type {GcpConnectAccountApp} from './outline-gcp-oauth-step'; +import type {GcpCreateServerApp} from '../outline-gcp-create-server-app'; +import type {OutlineServerList, ServerViewListEntry} from './outline-server-list'; +import type {OutlineManualServerEntry} from './outline-manual-server-entry'; +import type {OutlinePerKeyDataLimitDialog} from './outline-per-key-data-limit-dialog'; +import type {OutlineFeedbackDialog} from './outline-feedback-dialog'; +import type {OutlineAboutDialog} from './outline-about-dialog'; +import type {OutlineShareDialog} from './outline-share-dialog'; +import type {OutlineMetricsOptionDialog} from './outline-metrics-option-dialog'; +import type {OutlineModalDialog} from './outline-modal-dialog'; +import type {ServerView} from './outline-server-view'; +import type {LanguageDef} from './outline-language-picker'; + +const TOS_ACK_LOCAL_STORAGE_KEY = 'tos-ack'; + +/** A cloud account to be displayed */ +type AccountListEntry = { + id: string; + name: string; +}; + +/** An access key to be displayed */ +export type ServerListEntry = { + id: string; + accountId: string; + name: string; + isSynced: boolean; +}; + +// mixinBehaviors() returns `any`, but the documentation indicates that +// this is the actual return type. +const polymerElementWithLocalize = mixinBehaviors(AppLocalizeBehavior, PolymerElement) as new () => PolymerElement & + LegacyElementMixin & + AppLocalizeBehavior; + +export class AppRoot extends polymerElementWithLocalize { + static get template() { + return html` + + + + + +
+ + + + + +
+
+ + +
+ ${this.expandedServersTemplate()} +
+ + +
+ + [[localize('servers-add')]] + +
+ + + + + + [[localize('manager-resources')]] + + + + [[localize('nav-data-collection')]] + [[localize('nav-feedback')]] + [[localize('nav-help')]] + [[localize('nav-about')]] + + +
+ + +
+ + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + +
+ [[localize('close')]] +
+
+ + + + + [[localize('error-licenses')]] + + +
+ [[localize('close')]] +
+
+ +`; + } + + static expandedServersTemplate() { + return html` + +
+
+ [[localize('servers-digitalocean')]] + + +
+

[[localize('digitalocean-disconnect-account')]]

+ +
[[localize('disconnect')]]
+
+
+
+
+ +
+
+ +
+
+ [[localize('servers-gcp')]] + + +
+

[[localize('gcp-disconnect-account')]]

+ +
[[localize('disconnect')]]
+
+
+
+
+ +
+
+ +
+
+ [[localize('servers-manual')]] +
+
+ +
+
+ `; + } + + static minimizedServersTemplate() { + return html` + + + + + + + `; + } + + static get is() { + return 'app-root'; + } + + static get properties(): PolymerElementProperties { + return { + // Properties language and useKeyIfMissing are used by Polymer.AppLocalizeBehavior. + language: {type: String}, + supportedLanguages: {type: Array}, + useKeyIfMissing: {type: Boolean}, + serverList: {type: Array}, + selectedServerId: {type: String}, + digitalOceanAccount: Object, + gcpAccount: Object, + outlineVersion: String, + userAcceptedTos: { + type: Boolean, + // Get notified when the user clicks the OK button in the ToS view + observer: '_userAcceptedTosChanged', + }, + hasAcceptedTos: { + type: Boolean, + computed: '_computeHasAcceptedTermsOfService(userAcceptedTos)', + }, + currentPage: { + type: String, + observer: '_currentPageChanged', + }, + shouldShowSideBar: {type: Boolean}, + showManagerResourcesLink: {type: Boolean}, + }; + } + + selectedServerId = ''; + language = ''; + supportedLanguages: LanguageDef[] = []; + useKeyIfMissing = true; + serverList: ServerListEntry[] = []; + digitalOceanAccount: AccountListEntry = null; + gcpAccount: AccountListEntry = null; + outlineVersion = ''; + currentPage = 'intro'; + shouldShowSideBar = false; + showManagerResourcesLink = false; + + constructor() { + super(); + + this.addEventListener('RegionSelected', this.handleRegionSelected); + this.addEventListener('SetUpGenericCloudProviderRequested', this.handleSetUpGenericCloudProviderRequested); + this.addEventListener('SetUpAwsRequested', this.handleSetUpAwsRequested); + this.addEventListener('SetUpGcpRequested', this.handleSetUpGcpRequested); + this.addEventListener('ManualServerEntryCancelled', this.handleManualCancelled); + } + + /** + * Loads a new translation file and returns a Promise which resolves when the file is loaded or + * rejects when there was an error loading translations. + * + * @param language The language code to load translations for, eg 'en' + */ + loadLanguageResources(language: string) { + const localizeResourcesResponder = new Promise((resolve, reject) => { + // loadResources uses events and continuation instead of Promises. In order to make this + // function easier to use, we wrap the language-changing logic in event handlers which + // resolve or reject the Promise. Note that they need to clean up whichever event handler + // didn't fire so we don't leak it, which could cause future language changes to not work + // properly by triggering old event listeners. + const successHandler = () => { + this.removeEventListener('app-localize-resources-error', failureHandler); + resolve(); + }; + const failureHandler = () => { + this.removeEventListener('app-localize-resources-loaded', successHandler); + reject(new Error(`Failed to load resources for language ${language}`)); + }; + this.addEventListener('app-localize-resources-loaded', successHandler, {once: true}); + this.addEventListener('app-localize-resources-error', failureHandler, {once: true}); + }); + + const messagesUrl = `./messages/${language}.json`; + this.loadResources(messagesUrl, language, /* merge= */ false); + return localizeResourcesResponder; + } + + /** + * Sets the language and direction for the application + * @param language The ISO language code for the new language, e.g. 'en'. + */ + async setLanguage(language: string, direction: 'rtl' | 'ltr') { + await this.loadLanguageResources(language); + + const alignDir = direction === 'ltr' ? 'left' : 'right'; + (this.$.appDrawer as AppDrawerElement).align = alignDir; + (this.$.sideBar as AppDrawerElement).align = alignDir; + this.language = language; + + this.showManagerResourcesLink = this.hasTranslation('manager-resources'); + } + + hasTranslation(key: string) { + let message; + + try { + message = this.localize(key); + } catch (e) { + // failed to find translation + message = ''; + } + + return message !== key && message !== ''; + } + + showIntro() { + this.maybeCloseDrawer(); + this.selectedServerId = ''; + this.currentPage = 'intro'; + } + + getDigitalOceanOauthFlow(onCancel: Function): OutlineDoOauthStep { + const oauthFlow = this.$.digitalOceanOauth as OutlineDoOauthStep; + oauthFlow.onCancel = onCancel; + return oauthFlow; + } + + showDigitalOceanOauthFlow() { + this.currentPage = 'digitalOceanOauth'; + } + + getAndShowDigitalOceanOauthFlow(onCancel: Function) { + this.currentPage = 'digitalOceanOauth'; + const oauthFlow = this.getDigitalOceanOauthFlow(onCancel); + oauthFlow.showConnectAccount(); + return oauthFlow; + } + + getAndShowGcpOauthFlow(onCancel: Function) { + this.currentPage = 'gcpOauth'; + const oauthFlow = this.$.gcpOauth as GcpConnectAccountApp; + oauthFlow.onCancel = onCancel; + return oauthFlow; + } + + getAndShowGcpCreateServerApp(): GcpCreateServerApp { + this.currentPage = 'gcpCreateServer'; + return this.$.gcpCreateServer as GcpCreateServerApp; + } + + getAndShowRegionPicker(): OutlineRegionPicker { + this.currentPage = 'regionPicker'; + const regionPicker = this.$.regionPicker as OutlineRegionPicker; + regionPicker.reset(); + return regionPicker; + } + + getManualServerEntry() { + return this.$.manualEntry as OutlineManualServerEntry; + } + + showServerView() { + this.currentPage = 'serverView'; + } + + _currentPageChanged() { + if (this.currentPage !== 'gcpCreateServer') { + // The refresh loop will be restarted by App, which calls + // GcpCreateServerApp.start() whenever it switches back to this page. + (this.$.gcpCreateServer as GcpCreateServerApp).stopRefreshingBillingAccounts(); + } + } + + /** Gets the ServerView for the server given by its id */ + getServerView(displayServerId: string): Promise { + const serverList = this.shadowRoot.querySelector('#serverView'); + return serverList.getServerView(displayServerId); + } + + handleRegionSelected(e: CustomEvent) { + this.fire('SetUpDigitalOceanServerRequested', {region: e.detail.selectedLocation}); + } + + handleSetUpGenericCloudProviderRequested() { + this.handleManualServerSelected('generic'); + } + + handleSetUpAwsRequested() { + this.handleManualServerSelected('aws'); + } + + handleSetUpGcpRequested() { + this.handleManualServerSelected('gcp'); + } + + handleManualServerSelected(cloudProvider: 'generic' | 'aws' | 'gcp') { + const manualEntry = this.$.manualEntry as OutlineManualServerEntry; + manualEntry.clear(); + manualEntry.cloudProvider = cloudProvider; + this.currentPage = 'manualEntry'; + } + + handleManualCancelled() { + this.currentPage = 'intro'; + } + + showError(errorMsg: string) { + this.showToast(errorMsg, Infinity); + } + + showNotification(message: string, durationMs = 3000) { + this.showToast(message, durationMs); + } + + /** + * Show a toast with a message + * @param duration in seconds + */ + showToast(message: string, duration: number) { + const toast = this.$.toast as PaperToastElement; + toast.close(); + // Defer in order to trigger the toast animation, otherwise the + // update happens in place. + setTimeout(() => { + toast.show({ + text: message, + duration, + noOverlap: true, + }); + }, 0); + } + + closeError() { + (this.$.toast as PaperToastElement).close(); + } + + /** + * @param cb a function which accepts a single boolean which is true + * iff + * the user chose to retry the failing operation. + */ + showConnectivityDialog(cb: (retry: boolean) => void) { + const dialogTitle = this.localize('error-connectivity-title'); + const dialogText = this.localize('error-connectivity'); + this.showModalDialog(dialogTitle, dialogText, [ + this.localize('digitalocean-disconnect'), + this.localize('retry'), + ]).then(clickedButtonIndex => { + cb(clickedButtonIndex === 1); // pass true if user clicked retry + }); + } + + getConfirmation(title: string, text: string, confirmButtonText: string, continueFunc: Function) { + this.showModalDialog(title, text, [this.localize('cancel'), confirmButtonText]).then(clickedButtonIndex => { + if (clickedButtonIndex === 1) { + // user clicked to confirm. + continueFunc(); + } + }); + } + + showManualServerError(errorTitle: string, errorText: string) { + this.showModalDialog(errorTitle, errorText, [this.localize('cancel'), this.localize('retry')]).then( + clickedButtonIndex => { + const manualEntry = this.$.manualEntry as OutlineManualServerEntry; + if (clickedButtonIndex === 1) { + manualEntry.retryTapped(); + } + } + ); + } + + _hasManualServers(serverList: ServerListEntry[]) { + return serverList.filter(server => !server.accountId).length > 0; + } + + _userAcceptedTosChanged(userAcceptedTos: boolean) { + if (userAcceptedTos) { + window.localStorage[TOS_ACK_LOCAL_STORAGE_KEY] = Date.now(); + } + } + + _computeHasAcceptedTermsOfService(userAcceptedTos: boolean) { + return userAcceptedTos || !!window.localStorage[TOS_ACK_LOCAL_STORAGE_KEY]; + } + + _toggleAppDrawer() { + const drawerLayout = this.$.drawerLayout as AppDrawerLayoutElement; + const drawerNarrow = drawerLayout.narrow; + const forceNarrow = drawerLayout.forceNarrow; + if (drawerNarrow) { + if (forceNarrow) { + // The window width is below the responsive threshold. Do not force narrow mode. + drawerLayout.forceNarrow = false; + } + (this.$.appDrawer as AppDrawerElement).toggle(); + } else { + // Forcing narrow mode when the window width is above the responsive threshold effectively + // collapses the drawer. Conversely, reverting force narrow expands the drawer. + drawerLayout.forceNarrow = !forceNarrow; + } + } + + maybeCloseDrawer() { + const drawerLayout = this.$.drawerLayout as AppDrawerLayoutElement; + if (drawerLayout.narrow || drawerLayout.forceNarrow) { + (this.$.appDrawer as AppDrawerElement).close(); + } + } + + submitFeedbackTapped() { + (this.$.feedbackDialog as OutlineFeedbackDialog).open(); + this.maybeCloseDrawer(); + } + + aboutTapped() { + (this.$.aboutDialog as OutlineAboutDialog).open(); + this.maybeCloseDrawer(); + } + + _digitalOceanSignOutTapped() { + this.fire('DigitalOceanSignOutRequested'); + } + + _gcpSignOutTapped() { + this.fire('GcpSignOutRequested'); + } + + openManualInstallFeedback(prepopulatedMessage: string) { + (this.$.feedbackDialog as OutlineFeedbackDialog).open(prepopulatedMessage, true); + } + + openShareDialog(accessKey: string, s3Url: string) { + (this.$.shareDialog as OutlineShareDialog).open(accessKey, s3Url); + } + + openPerKeyDataLimitDialog( + keyName: string, + activeDataLimitBytes: number, + onDataLimitSet: (dataLimitBytes: number) => Promise, + onDataLimitRemoved: () => Promise + ) { + // attach listeners here + (this.$.perKeyDataLimitDialog as OutlinePerKeyDataLimitDialog).open( + keyName, + activeDataLimitBytes, + onDataLimitSet, + onDataLimitRemoved + ); + } + + openGetConnectedDialog(inviteUrl: string) { + const dialog = this.$.getConnectedDialog as PaperDialogElement; + if (dialog.children.length > 1) { + return; // The iframe is already loading. + } + // Reset the iframe's state, by replacing it with a newly constructed + // iframe. Unfortunately the location.reload API does not work in our case due to + // this Chrome error: + // "Blocked a frame with origin "outline://web_app" from accessing a cross-origin frame." + const iframe = document.createElement('iframe'); + iframe.onload = () => dialog.open(); + iframe.src = inviteUrl; + dialog.insertBefore(iframe, dialog.children[0]); + } + + closeGetConnectedDialog() { + const dialog = this.$.getConnectedDialog as PaperDialogElement; + dialog.close(); + const oldIframe = dialog.children[0]; + dialog.removeChild(oldIframe); + } + + showMetricsDialogForNewServer() { + (this.$.metricsDialog as OutlineMetricsOptionDialog).showMetricsOptInDialog(); + } + + /** @return A Promise which fulfills with the index of the button clicked. */ + showModalDialog(title: string, text: string, buttons: string[]): Promise { + return (this.$.modalDialog as OutlineModalDialog).open(title, text, buttons); + } + + closeModalDialog() { + return (this.$.modalDialog as OutlineModalDialog).close(); + } + + showLicensesTapped() { + const xhr = new XMLHttpRequest(); + xhr.onload = () => { + (this.$.licensesText as HTMLElement).innerText = xhr.responseText; + (this.$.licenses as PaperDialogElement).open(); + }; + xhr.onerror = () => { + console.error('could not load license.txt'); + }; + xhr.open('GET', '/ui_components/licenses/licenses.txt', true); + xhr.send(); + } + + _computeShouldShowSideBar() { + const drawerNarrow = (this.$.drawerLayout as AppDrawerLayoutElement).narrow; + const drawerOpened = (this.$.appDrawer as AppDrawerElement).opened; + if (drawerOpened && drawerNarrow) { + this.shouldShowSideBar = false; + } else { + this.shouldShowSideBar = drawerNarrow; + } + } + + _accountServerFilter(account: AccountListEntry) { + return (server: ServerListEntry) => account && server.accountId === account.id; + } + + _isServerManual(server: ServerListEntry) { + return !server.accountId; + } + + _sortServersByName(a: ServerListEntry, b: ServerListEntry) { + const aName = a.name.toUpperCase(); + const bName = b.name.toUpperCase(); + if (aName < bName) { + return -1; + } else if (aName > bName) { + return 1; + } + return 0; + } + + _computeServerClasses(selectedServerId: string, server: ServerListEntry) { + const serverClasses = []; + if (this._isServerSelected(selectedServerId, server)) { + serverClasses.push('selected'); + } + if (!server.isSynced) { + serverClasses.push('syncing'); + } + return serverClasses.join(' '); + } + + _computeServerImage(selectedServerId: string, server: ServerListEntry) { + if (this._isServerSelected(selectedServerId, server)) { + return 'server-icon-selected.png'; + } + return 'server-icon.png'; + } + + _getCloudId(accountId: string): DisplayCloudId { + // TODO: Replace separate account fields with a map. + if (this.gcpAccount && accountId === this.gcpAccount.id) { + return DisplayCloudId.GCP; + } else if (this.digitalOceanAccount && accountId === this.digitalOceanAccount.id) { + return DisplayCloudId.DO; + } + return null; + } + + _serverViewList(serverList: ServerListEntry[]): ServerViewListEntry[] { + return serverList.map(entry => ({ + id: entry.id, + name: entry.name, + cloudId: this._getCloudId(entry.accountId), + })); + } + + _isServerSelected(selectedServerId: string, server: ServerListEntry) { + return !!selectedServerId && selectedServerId === server.id; + } + + _showServer(event: Event & {model: {server: ServerListEntry}}) { + const server = event.model.server; + this.fire('ShowServerRequested', {displayServerId: server.id}); + this.maybeCloseDrawer(); + } +} +customElements.define(AppRoot.is, AppRoot); diff --git a/server_manager/web_app/ui_components/cloud-assets.ts b/server_manager/web_app/ui_components/cloud-assets.ts new file mode 100644 index 0000000000..e2eff6ae8e --- /dev/null +++ b/server_manager/web_app/ui_components/cloud-assets.ts @@ -0,0 +1,42 @@ +/* + Copyright 2021 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +export enum DisplayCloudId { + DO = 'do', + GCP = 'gcp', +} + +export function getCloudIcon(id: DisplayCloudId): string { + switch (id) { + case DisplayCloudId.DO: + return 'images/do_white_logo.svg'; + case DisplayCloudId.GCP: + return 'images/gcp-logo.svg'; + default: + return null; + } +} + +export function getCloudName(id: DisplayCloudId): string { + switch (id) { + case DisplayCloudId.DO: + return 'DigitalOcean'; + case DisplayCloudId.GCP: + return 'Google Cloud Platform'; + default: + return null; + } +} diff --git a/server_manager/web_app/ui_components/cloud-install-styles.ts b/server_manager/web_app/ui_components/cloud-install-styles.ts new file mode 100644 index 0000000000..d335e6e277 --- /dev/null +++ b/server_manager/web_app/ui_components/cloud-install-styles.ts @@ -0,0 +1,247 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import {html} from '@polymer/polymer/lib/utils/html-tag'; +import {unsafeCSS} from 'lit-element'; + +// Polymer style module to share styles between steps +// https://polymer-library.polymer-project.org/3.0/docs/devguide/style-shadow-dom#share-styles-between-elements +const styleElement = document.createElement('dom-module'); +styleElement.appendChild(html` `); +styleElement.register('cloud-install-styles'); + +// Shared styles for LitElement components +const commonStyleCss = styleElement.querySelector('template').content.textContent; +export const COMMON_STYLES = unsafeCSS(commonStyleCss); diff --git a/server_manager/web_app/ui_components/if_messages.ts b/server_manager/web_app/ui_components/if_messages.ts new file mode 100644 index 0000000000..8f1d2c4950 --- /dev/null +++ b/server_manager/web_app/ui_components/if_messages.ts @@ -0,0 +1,43 @@ +/* + Copyright 2024 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import {nothing, LitElement, html} from 'lit'; +import {customElement, property} from 'lit/decorators.js'; + +@customElement('if-messages') +export class IfMessages extends LitElement { + @property({ + type: Array, + attribute: 'message-ids', + converter: (value: string) => value.split(/,\s*/), + }) + messageIDs: string[] = []; + @property({type: Function, attribute: 'localize'}) localize: (msgId: string, ...params: string[]) => string; + + render() { + if ( + this.messageIDs.some(id => { + const result = this.localize(id); + + return result === id || result === undefined || result === ''; + }) + ) { + return nothing; + } + + return html``; + } +} diff --git a/server_manager/web_app/ui_components/licenses/README.md b/server_manager/web_app/ui_components/licenses/README.md new file mode 100644 index 0000000000..cd789c0ddb --- /dev/null +++ b/server_manager/web_app/ui_components/licenses/README.md @@ -0,0 +1,26 @@ +# HOWTO re-generate `license.txt` + +## Steps + +- `cd` to the root of your clone of this repo +- Ensure `node_modules` is up to date and only include dependencies of the Electron app by running `npm ci && npm run action server_manager/web_app/build` +- Copy `LICENSE` and the entire `node_modules` folder to `./src/server_manager/LICENSE` and `./src/server_manager/node_modules` +- `cd src/server_manager` +- `npx generate-license-file --input package.json --output web_app/ui_components/licenses/licenses.txt` +- `cd web_app/ui_components/licenses` +- `cat db-ip_license.txt >> licenses.txt` + +Done! (remember to delete the `./src/server_manager/node_modules` folder) + +> Note that the third step of copying `LICENSE` and `node_modules` is required because: +> +> - `generate-license-file` iterates all dependencies under `node_modules` folder in the current directory +> - `generate-license-file` will try to find a `LICENSE` file in the current directory, if not found, it will use `README.md` instead which is not what we want + +## Check + +To quickly look for non-compliant licenses: + +```bash +yarn licenses list --prod|grep -Ev \(@\|VendorUrl:\|VendorName:\|URL:\) +``` diff --git a/server_manager/web_app/ui_components/licenses/db-ip_license.txt b/server_manager/web_app/ui_components/licenses/db-ip_license.txt new file mode 100644 index 0000000000..650f42ded1 --- /dev/null +++ b/server_manager/web_app/ui_components/licenses/db-ip_license.txt @@ -0,0 +1,5 @@ +------ + +IP Geolocation by DB-IP (https://db-ip.com) + +This database is licensed under a Creative Commons Attribution 4.0 International License (https://creativecommons.org/licenses/by/4.0/) \ No newline at end of file diff --git a/server_manager/web_app/ui_components/licenses/licenses.txt b/server_manager/web_app/ui_components/licenses/licenses.txt new file mode 100644 index 0000000000..b282790f2b --- /dev/null +++ b/server_manager/web_app/ui_components/licenses/licenses.txt @@ -0,0 +1,11196 @@ +The following NPM packages may be included in this product: + + - @formatjs/intl-unified-numberformat@3.3.7 + - @formatjs/intl-utils@2.3.0 + +These packages each contain the following license and notice below: + +MIT License + +Copyright (c) 2019 FormatJS + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - @polymer/app-layout@3.1.0 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/app-layout.svg)](https://www.npmjs.com/package/@polymer/app-layout) +[![Build status](https://travis-ci.org/PolymerElements/app-layout.svg?branch=master)](https://travis-ci.org/PolymerElements/app-layout) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/app-layout) + +## App Layout + + + +A collection of elements, along with guidelines and templates that can be used to structure your app’s layout. + +## What is inside + +### Elements + +- [app-box](https://github.com/PolymerElements/app-layout/tree/master/app-box) - A container element that can have scroll effects - visual effects based on scroll position. + +- [app-drawer](https://github.com/PolymerElements/app-layout/tree/master/app-drawer) - A navigation drawer that can slide in from the left or right. + +- [app-drawer-layout](https://github.com/PolymerElements/app-layout/tree/master/app-drawer-layout) - A wrapper element that positions an app-drawer and other content. + +- [app-grid](https://github.com/PolymerElements/app-layout/tree/master/app-grid) - A helper class useful for creating responsive, fluid grid layouts using custom properties. + +- [app-header](https://github.com/PolymerElements/app-layout/tree/master/app-header) - A container element for app-toolbars at the top of the screen that can have scroll effects - visual effects based on scroll position. + +- [app-header-layout](https://github.com/PolymerElements/app-layout/tree/master/app-header-layout) - A wrapper element that positions an app-header and other content. + +- [app-toolbar](https://github.com/PolymerElements/app-layout/tree/master/app-toolbar) - A horizontal toolbar containing items that can be used for label, navigation, search and actions. + +### Templates + +The templates are a means to define, illustrate and share best practices in App Layout. Pick a template and customize it: + +- **Getting started** +([Demo](https://polymerelements.github.io/app-layout/templates/getting-started) - [Source](/templates/getting-started)) + +- **Landing page** +([Demo](https://polymerelements.github.io/app-layout/templates/landing-page) - [Source](/templates/landing-page)) + +- **Publishing: Zuperkülblog** +([Demo](https://polymerelements.github.io/app-layout/templates/publishing) - [Source](/templates/publishing)) + +- **Shop: Shrine** +([Demo](https://polymerelements.github.io/app-layout/templates/shrine) - [Source](/templates/shrine)) + +- **Blog: Pesto** +([Demo](https://polymerelements.github.io/app-layout/templates/pesto) - [Source](/templates/pesto)) + +- **Scroll effects: Test drive** +([Demo](https://polymerelements.github.io/app-layout/templates/test-drive) - [Source](/templates/test-drive)) + +### Patterns + +Sample code for various UI patterns: + +- **Transform navigation:** +As more screen space is available, side navigation can transform into tabs. +([Demo](https://www.webcomponents.org/element/PolymerElements/app-layout/demo/patterns/transform-navigation/index.html) - [Source](/patterns/transform-navigation/x-app.html)) + +- **Expand Card:** +Content cards may expand to take up more horizontal space. +([Demo](https://www.webcomponents.org/element/PolymerElements/app-layout/demo/patterns/expand-card/index.html) - [Source](/patterns/expand-card/index.html)) + +- **Material Design Responsive Toolbar:** +Toolbar changes its height and padding to adapt mobile screen size. +([Demo](https://www.webcomponents.org/element/PolymerElements/app-layout/demo/patterns/md-responsive-toolbar/index.html) - [Source](/patterns/md-responsive-toolbar/index.html)) + +## Users + +Here are some web apps built with App Layout: + +- [Youtube Web](https://www.youtube.com/new) +- [Google I/O 2016](https://events.google.com/io2016/) +- [Polymer project site](https://www.polymer-project.org/summit) +- [Polymer summit](https://www.polymer-project.org/summit) +- [Shop](https://shop.polymer-project.org) +- [News](https://news.polymer-project.org) +- [webcomponents.org](https://www.webcomponents.org/) +- [Chrome Status](https://www.chromestatus.com/) +- [Project Fi](https://fi.google.com/about/) +- [NASA Open Source Software](https://code.nasa.gov/) + +See: [Documentation](https://www.webcomponents.org/element/@polymer/app-layout), + [Demo](https://www.webcomponents.org/element/@polymer/app-layout/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/app-layout +``` + +### In an html file +```html + + + + + + + +
My app
+
+
+ + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/app-layout/app-layout.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + +
My app
+
+
+ + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/app-layout +cd app-layout +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/app-localize-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/app-localize-behavior.svg)](https://www.npmjs.com/package/@polymer/app-localize-behavior) +[![Build status](https://travis-ci.org/PolymerElements/app-localize-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/app-localize-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/app-localize-behavior) + +## <app-localize-behavior> +`app-localize-behavior` is a behavior that wraps the [format.js](http://formatjs.io/) library to +help you internationalize your application. Note that if you're on a browser that +does not natively support the [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl) +object, you must load the polyfill yourself. An example polyfill can +be found [here](https://github.com/andyearnshaw/Intl.js/). + +See: [Documentation](https://www.webcomponents.org/element/@polymer/app-localize-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/app-localize-behavior/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/app-localize-behavior +``` + +### In an html file using the localized element +```html + + + + + + + + + + + + + + +``` + +### Localizing a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {AppLocalizeBehavior} from '@polymer/app-localize-behavior/app-localize-behavior.js'; + +class SampleElement extends mixinBehaviors([AppLocalizeBehavior], PolymerElement) { + static get template() { + return html` +
{{localize('hello', 'name', 'Batman')}}
+ `; + } + + static get properties() { + return { + language: { value: 'en' }, + } + } + + function attached() { + this.loadResources(this.resolveUrl('locales.json')); + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/app-localize-behavior +cd app-localize-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/font-roboto@3.0.2 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/font-roboto.svg)](https://www.npmjs.com/package/@polymer/paper-input) +[![Build status](https://travis-ci.org/PolymerElements/font-roboto.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-input) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/font-roboto) + +## font-roboto +`font-roboto` loads the Roboto family of fonts from Google Fonts. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/font-roboto). + +## Usage + +### Installation +``` +npm install --save @polymer/font-roboto +``` + +### In an html file +```html + + + + + + +

This text is in Roboto.

+ + +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/font-roboto/roboto.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + +

This text is in Roboto.

+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/font-roboto +cd font-roboto +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-a11y-announcer@3.2.0 + +This package contains the following license and notice below: + + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-a11y-announcer.svg)](https://www.npmjs.com/package/@polymer/iron-a11y-announcer) +[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-announcer.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-announcer) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-a11y-announcer) + +## <iron-a11y-announcer> + +`iron-a11y-announcer` is a singleton element that is intended to add a11y +to features that require on-demand announcement from screen readers. In +order to make use of the announcer, it is best to request its availability +in the announcing element. +Note: announcements are only audible if you have a screen reader enabled. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-a11y-announcer), + [Demo](https://www.webcomponents.org/element/@polymer/iron-a11y-announcer/demo/demo/index.html) + +## Usage + +### Installation +``` +npm install --save @polymer/iron-a11y-announcer +``` + +### In an html file +```html + + + + + +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + `; + } + function attached() { + IronA11yAnnouncer.requestAvailability(); + } + + // After the `iron-a11y-announcer` has been made available, elements can + // make announces by firing bubbling `iron-announce` events. + // Note: announcements are only audible if you have a screen reader enabled. + function announce() { + IronA11yAnnouncer.instance.fire('iron-announce', + {text: 'Hello there!'}, {bubbles: true}); + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-a11y-announcer +cd iron-a11y-announcer +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +## Known Issues +This element doesn't work on Firefox (it doesn't read anything in Voice Over), since +`aria-live` has been broken since the Quantum redesign (see the [MDN docs demo](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions)) +-- we tested it on Firefox 60, but it doesn't look like a regression, so +it's probably broken on older versions as well. + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-a11y-keys-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-a11y-keys-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-a11y-keys-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-a11y-keys-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-a11y-keys-behavior) + +## <iron-a11y-keys-behavior> +`Polymer.IronA11yKeysBehavior` provides a normalized interface for processing +keyboard commands that pertain to [WAI-ARIA best practices](http://www.w3.org/TR/wai-aria-practices/#kbd_general_binding). +The element takes care of browser differences with respect to Keyboard events +and uses an expressive syntax to filter key presses. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-a11y-keys-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-a11y-keys-behavior/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-a11y-keys-behavior +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js'; + +class SampleElement extends extends mixinBehaviors([IronA11yKeysBehavior], PolymerElement) { + static get template() { + return html` +
[[pressed]]
+ `; + } + + static get properties() { + return { + pressed: {type: String, readOnly: true, value: ''}, + keyBindings: { + 'space': '_onKeydown', // same as 'space:keydown' + 'shift+tab': '_onKeydown', + 'enter:keypress': '_onKeypress', + 'esc:keyup': '_onKeyup' + } + } + } + + function _onKeydown: function(event) { + console.log(event.detail.combo); // KEY+MODIFIER, e.g. "shift+tab" + console.log(event.detail.key); // KEY only, e.g. "tab" + console.log(event.detail.event); // EVENT, e.g. "keydown" + console.log(event.detail.keyboardEvent); // the original KeyboardEvent + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-a11y-keys-behavior +cd iron-a11y-keys-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-ajax@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-ajax.svg)](https://www.npmjs.com/package/@polymer/iron-ajax) +[![Build status](https://travis-ci.org/PolymerElements/iron-ajax.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-ajax) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-ajax) + +## <iron-ajax> + +The `iron-ajax` element declaratively exposes network request functionality to +Polymer's data-binding system. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-ajax), + [Demo](https://www.webcomponents.org/element/@polymer/iron-ajax/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-ajax +``` + +### In an html file +```html + + + + + + + + + +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/iron-ajax/iron-ajax.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-ajax +cd iron-ajax +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-autogrow-textarea@3.0.3 + +This package contains the following license and notice below: + + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-autogrow-textarea.svg)](https://www.npmjs.com/package/@polymer/iron-autogrow-textarea) +[![Build status](https://travis-ci.org/PolymerElements/iron-autogrow-textarea.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-autogrow-textarea) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-autogrow-textarea) + + +## <iron-autogrow-textarea> + +`iron-autogrow-textarea` is an element containing a textarea that grows in height as more +lines of input are entered. Unless an explicit height or the `maxRows` property is set, it will +never scroll. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-autogrow-textarea), + [Demo](https://www.webcomponents.org/element/@polymer/iron-autogrow-textarea/demo/demo/index.html). + + + ## Usage + + ### Installation + ``` + npm install --save @polymer/iron-autogrow-textarea + ``` + + ### In an html file + ```html + + + + + + + + + ``` + ### In a Polymer 3 element + ```js + import {PolymerElement, html} from '@polymer/polymer'; + import '@polymer/iron-autogrow-textarea/iron-autogrow-textarea.js'; + + class SampleElement extends PolymerElement { + static get template() { + return html` + + `; + } + } + customElements.define('sample-element', SampleElement); + ``` + + ## Contributing + If you want to send a PR to this element, here are + the instructions for running the tests and demo locally: + + ### Installation + ```sh + git clone https://github.com/PolymerElements/iron-autogrow-textarea + cd iron-autogrow-textarea + npm install + npm install -g polymer-cli + ``` + + ### Running the demo locally + ```sh + polymer serve --npm + open http://127.0.0.1:/demo/ + ``` + + ### Running the tests + ```sh + polymer test --npm + ``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-behaviors@3.0.1 + +This package contains the following license and notice below: + + + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-behaviors.svg)](https://www.npmjs.com/package/@polymer/iron-behaviors) +[![Build status](https://travis-ci.org/PolymerElements/iron-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-behaviors) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-behaviors) + +## <iron-behaviors> +`` provides a set of behaviors for the iron elements. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-behaviors), + [Demo](https://www.webcomponents.org/element/@polymer/iron-behaviors/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-behaviors +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {IronButtonState} from '../iron-button-state.js'; +import {IronControlState} from '../iron-control-state.js'; + +class SampleElement extends mixinBehaviors([IronButtonState, IronControlState], PolymerElement) { + static get template() { + return html` + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-behaviors +cd iron-behaviors +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-checked-element-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-checked-element-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-checked-element-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-checked-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-checked-element-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-checked-element-behavior) + +## IronCheckedElementBehavior + +Use `IronCheckedElementBehavior` to implement a custom element that has a +`checked` property, which can be used for validation if the element is also +`required`. Element instances implementing this behavior will also be +registered for use in an `iron-form` element. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-checked-element-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-checked-element-behavior/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-checked-element-behavior +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import {IronCheckedElementBehavior} from '../iron-checked-element-behavior.js'; + +class SimpleCheckbox extends mixinBehaviors(IronCheckedElementBehavior, PolymerElement) { + static get template() { + return html` + + + + + {{label}} + `; + } + + static get properties() { + return {label: {type: String, value: 'not validated'}}; + } + + _checkValidity() { + this.validate(); + this.label = this.invalid ? 'is invalid' : 'is valid'; + } +} + +customElements.define('simple-checkbox', SimpleCheckbox); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-checked-element-behavior +cd iron-checked-element-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-collapse@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-collapse.svg)](https://www.npmjs.com/package/@polymer/iron-collapse) +[![Build status](https://travis-ci.org/PolymerElements/iron-collapse.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-collapse) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-collapse) + +## <iron-collapse> +`iron-collapse` creates a collapsible block of content. By default, the content +will be collapsed. Use `opened` or `toggle()` to show/hide the content. The +aria-expanded attribute should only be set on the button that controls the +collapsable area, not on the area itself. See +https://www.w3.org/WAI/GL/wiki/Using_aria-expanded_to_indicate_the_state_of_a_collapsible_element#Description + +`iron-collapse` adjusts the max-height/max-width of the collapsible element to show/hide +the content. So avoid putting padding/margin/border on the collapsible directly, +and instead put a div inside and style that. + +```html + + + +
+
Content goes here...
+
+
+``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--iron-collapse-transition-duration` | Animation transition duration | `300ms` | + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-collapse), + [Demo](https://www.webcomponents.org/element/@polymer/iron-collapse/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-collapse +``` + +### In an html file +```html + + + + + + +
Content goes here...
+
+ + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/iron-collapse/iron-collapse.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + +
Content goes here...
+
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-collapse +cd iron-collapse +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-dropdown@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-dropdown.svg)](https://www.npmjs.com/package/@polymer/iron-dropdown) +[![Build status](https://travis-ci.org/PolymerElements/iron-dropdown.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-dropdown) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-dropdown) + +## <iron-dropdown> + +`` displays content inside a fixed-position container, +positioned relative to another element. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-dropdown), + [Demo](https://www.webcomponents.org/element/@polymer/iron-dropdown/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-dropdown +``` + +### In an HTML file + +```html + + + + + + +
+ + +
Hello!
+
+
+ + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/iron-dropdown/iron-dropdown.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + + +
Hello!
+
+ `; + } + + _openDropdown() { + this.$.dropdown.open(); + } +} +customElements.define('sample-element', SampleElement); +``` + +In the above example, the `
` assigned to the `dropdown-content` slot will +be hidden until the dropdown element has `opened` set to true, or when the +`open` method is called on the element. + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-dropdown +cd iron-dropdown +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-fit-behavior@3.1.0 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-fit-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-fit-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-fit-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-fit-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-fit-behavior) + +## IronFitBehavior + +`IronFitBehavior` positions and fits an element in the bounds of another +element and optionally centers it in the window or the other element. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-fit-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-fit-behavior/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-fit-behavior +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import {IronFitBehavior} from '@polymer/iron-fit-behavior/iron-fit-behavior.js'; + +class SimpleFit extends mixinBehaviors(IronFitBehavior, PolymerElement) { + static get template() { + return html` + + verticalAlign: [[verticalAlign]], horizontalAlign: [[horizontalAlign]] + `; + } +} + +customElements.define('simple-fit', SimpleFit); +``` + +Then, in your HTML: + +```html + + + + +
+ The <simple-fit> below will be positioned within this div. + +
+``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-fit-behavior +cd iron-fit-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-flex-layout@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-flex-layout.svg)](https://www.npmjs.com/package/@polymer/iron-flex-layout) +[![Build status](https://travis-ci.org/PolymerElements/iron-flex-layout.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-flex-layout) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-flex-layout) + +## <iron-flex-layout> +The `` component provides simple ways to use +[CSS flexible box layout](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxes), +also known as flexbox. Note that this is an old element, that was written +before all modern browsers had non-prefixed flex styles. As such, nowadays you +don't really need to use this element anymore, and can use CSS flex styles +directly in your code. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-flex-layout), + [Demo](https://www.webcomponents.org/element/@polymer/iron-flex-layout/demo/demo/index.html). + +This component provides two different ways to use flexbox: + +1. [Layout classes](https://github.com/PolymerElements/iron-flex-layout/tree/master/iron-flex-layout-classes.html). +The layout class stylesheet provides a simple set of class-based flexbox rules, that +let you specify layout properties directly in markup. You must include this file +in every element that needs to use them. + +1. [Custom CSS mixins](https://github.com/PolymerElements/iron-flex-layout/blob/master/iron-flex-layout.html). +The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the `@apply` function. + +## Usage + +### Installation +``` +npm install --save @polymer/iron-flex-layout +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/iron-flex-layout/iron-flex-layout-classes.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + +
+
horizontal layout center alignment
+
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-flex-layout +cd iron-flex-layout +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-form-element-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-form-element-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-form-element-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-form-element-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-form-element-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-form-element-behavior) + +## IronFormElementBehavior +`IronFormElementBehavior` adds a `name`, `value` and `required` properties to +a custom element. This element is deprecated, and only exists for back compatibility +with Polymer 1.x (where `iron-form` was a type extension), and +it is not something you want to use. No contributions or fixes will be accepted. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-form-element-behavior). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-form-element-behavior +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {IronFormElementBehavior} from '@polymer/iron-form-element-behavior/iron-form-element-behavior.js'; + +class SampleElement extends mixinBehaviors([IronFormElementBehavior], PolymerElement) { + static get template() { + return html` + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-icon@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-icon.svg)](https://www.npmjs.com/package/@polymer/iron-icon) +[![Build status](https://travis-ci.org/PolymerElements/iron-icon.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icon) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-icon) + +## <iron-icon> + +The `iron-icon` element displays an icon. By default an icon renders as a 24px +square. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-icon), + [Demo](https://www.webcomponents.org/element/@polymer/iron-icon/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-icon +``` + +### In an HTML file + +```html + + + + + + + + + + + + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/iron-icon/iron-icon.js'; + +class ExampleElement extends PolymerElement { + static get template() { + return html` + + `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-icon +cd iron-icon +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-icons@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-icons.svg)](https://www.npmjs.com/package/@polymer/iron-icons) +[![Build status](https://travis-ci.org/PolymerElements/iron-icons.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-icons) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-icons) + +## <iron-icons> + +`iron-icons` is a utility import that includes the definition for the +`iron-icon` element, `iron-iconset-svg` element, as well as an import for the +default icon set. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-icons), + [Demo](https://www.webcomponents.org/element/@polymer/iron-icons/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-icons +``` + +### In an HTML file + +```html + + + + + + + + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/iron-icon/iron-icon.js'; +import '@polymer/iron-icons/iron-icons.js'; + +class ExampleElement extends PolymerElement { + static get template() { + return html` + + `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-icons +cd iron-icons +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-iconset-svg@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-iconset-svg.svg)](https://www.npmjs.com/package/@polymer/iron-iconset-svg) +[![Build status](https://travis-ci.org/PolymerElements/iron-iconset-svg.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-iconset-svg) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-iconset-svg) + +## <iron-iconset-svg> + +The `iron-iconset-svg` element allows users to define their own icon sets that +contain svg icons. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-iconset-svg), + [Demo](https://www.webcomponents.org/element/@polymer/iron-iconset-svg/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-iconset-svg +``` + +### In an HTML file + +```html + + + + + + + + + + + + + + + + + + + +``` + +### In a Polymer 3 element + +You can use an `` anywhere you could put a custom element, +such as in the shadow root of another component to expose icons to it. However, +if you're going to be creating many instances of the containing component, you +should move your `` out to a separate module. This prevents a +redundant `` from being added to the shadow root of each +instance of that component. See the demo (and specifically +`demo/svg-sample-icons.js`) for an example. + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/iron-iconset-svg/iron-iconset-svg.js'; +import '@polymer/iron-icon/iron-icon.js'; + +class ExampleElement extends PolymerElement { + static get template() { + return html` + + + + + + + + + + + + + `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-iconset-svg +cd iron-iconset-svg +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-input@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-input.svg)](https://www.npmjs.com/package/@polymer/iron-input) +[![Build status](https://travis-ci.org/PolymerElements/iron-input.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-input) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-input) + +## <iron-input> +`` adds two-way binding and custom validators using `Polymer.IronValidatorBehavior` +to ``. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-input), + [Demo](https://www.webcomponents.org/element/@polymer/iron-input/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-input +``` + +### In an html file +```html + + + + + + + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/iron-input/iron-input.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +### Two-way binding + +By default you can only get notified of changes to an `input`'s `value` due to user input: + +```html + +``` + +`iron-input` adds the `bind-value` property that mirrors the `value` property, and can be used +for two-way data binding. `bind-value` will notify if it is changed either by user input or by script. + +```html + + + +``` + +### Custom validators + +You can use custom validators that implement `Polymer.IronValidatorBehavior` with ``. + +```html + + + +``` + +### Stopping invalid input + +It may be desirable to only allow users to enter certain characters. You can use the +`prevent-invalid-input` and `allowed-pattern` attributes together to accomplish this. This feature +is separate from validation, and `allowed-pattern` does not affect how the input is validated. + +```html + + + + +``` + + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-input +cd iron-input +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-media-query@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-media-query.svg)](https://www.npmjs.com/package/@polymer/iron-media-query) +[![Build status](https://travis-ci.org/PolymerElements/iron-media-query.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-media-query) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-media-query) + +## <iron-media-query> +`iron-media-query` can be used to data bind to a CSS media query. +The `query` property is a bare CSS media query. +The `query-matches` property is a boolean representing whether the page matches that media query. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-media-query), + [Demo](https://www.webcomponents.org/element/@polymer/iron-media-query/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-media-query +``` + +### In an html file +```html + + + + + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/iron-media-query/iron-media-query.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-media-query +cd iron-media-query +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-menu-behavior@3.0.2 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-menu-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-menu-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-menu-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-menu-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-menu-behavior) + +## `IronMenuBehavior`, `IronMenubarBehavior` + +`IronMenuBehavior` and `IronMenubarBehavior` implement accessible menu and +menubar behaviors. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-menu-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-menu-behavior/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-menu-behavior +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import {IronMenuBehavior} from '@polymer/iron-menu-behavior/iron-menu-behavior.js'; + +class SimpleMenu extends mixinBehaviors(IronMenuBehavior, PolymerElement) { + static get template() { + return html` + + + + `; + } +} + +customElements.define('simple-menu', SimpleMenu); +``` + +Then, in your HTML: + +```html + + + + + +
Item 0
+
Item 1
+
Item 2 (disabled)
+
+``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-menu-behavior +cd iron-menu-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-meta@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-meta.svg)](https://www.npmjs.com/package/@polymer/iron-meta) +[![Build status](https://travis-ci.org/PolymerElements/iron-meta.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-meta) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-meta) + +## <iron-meta> + +`iron-meta` is a generic element you can use for sharing information across the +DOM tree. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-meta), + [Demo](https://www.webcomponents.org/element/@polymer/iron-meta/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-meta +``` + +### In an HTML file + +```html + + + + + + + + + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/iron-meta/iron-meta.js'; + +class ExampleElement extends PolymerElement { + static get properties() { + return { + prop: String, + }; + } + + static get template() { + return html` + + info: [[prop]] + `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-meta +cd iron-meta +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-overlay-behavior@3.0.3 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-overlay-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-overlay-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-overlay-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-overlay-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-overlay-behavior) + +## IronOverlayBehavior + +Use `IronOverlayBehavior` to implement an element that can be hidden or shown, and displays +on top of other content. It includes an optional backdrop, and can be used to implement a variety +of UI controls including dialogs and drop downs. Multiple overlays may be displayed at once. + +See the [demo source code](https://github.com/PolymerElements/iron-overlay-behavior/blob/master/demo/simple-overlay.js) +for an example. + +### Closing and canceling + +An overlay may be hidden by closing or canceling. The difference between close and cancel is user +intent. Closing generally implies that the user acknowledged the content on the overlay. By default, +it will cancel whenever the user taps outside it or presses the escape key. This behavior is +configurable with the `no-cancel-on-esc-key` and the `no-cancel-on-outside-click` properties. +`close()` should be called explicitly by the implementer when the user interacts with a control +in the overlay element. When the dialog is canceled, the overlay fires an 'iron-overlay-canceled' +event. Call `preventDefault` on this event to prevent the overlay from closing. + +### Positioning + +By default the element is sized and positioned to fit and centered inside the window. You can +position and size it manually using CSS. See `Polymer.IronFitBehavior`. + +### Backdrop + +Set the `with-backdrop` attribute to display a backdrop behind the overlay. The backdrop is +appended to `` and is of type ``. See its doc page for styling +options. + +In addition, `with-backdrop` will wrap the focus within the content in the light DOM. +Override the [`_focusableNodes` getter](#Polymer.IronOverlayBehavior:property-_focusableNodes) +to achieve a different behavior. + +### Limitations + +The element is styled to appear on top of other content by setting its `z-index` property. You +must ensure no element has a stacking context with a higher `z-index` than its parent stacking +context. You should place this element as a child of `` whenever possible. + +## <iron-overlay-backdrop> + +`iron-overlay-backdrop` is a backdrop used by `Polymer.IronOverlayBehavior`. It should be a +singleton. + +### Styling + +The following custom properties and mixins are available for styling. + +| Custom property | Description | Default | +| --- | --- | --- | +| `--iron-overlay-backdrop-background-color` | Backdrop background color | #000 | +| `--iron-overlay-backdrop-opacity` | Backdrop opacity | 0.6 | +| `--iron-overlay-backdrop` | Mixin applied to `iron-overlay-backdrop`. | {} | +| `--iron-overlay-backdrop-opened` | Mixin applied to `iron-overlay-backdrop` when it is displayed | {} | + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-overlay-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-overlay-behavior/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-overlay-behavior +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {IronOverlayBehavior} from '@polymer/iron-overlay-behavior/iron-overlay-behavior.js'; + +class SampleElement extends mixinBehaviors(IronOverlayBehavior, PolymerElement) { + static get template() { + return html` + +

Overlay Content

+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-overlay-behavior +cd iron-overlay-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-pages@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-pages.svg)](https://www.npmjs.com/package/@polymer/iron-pages) +[![Build status](https://travis-ci.org/PolymerElements/iron-pages.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-pages) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-pages) + +## <iron-pages> + +`iron-pages` is used to select one of its children to show. One use is to cycle +through a list of children "pages". + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-pages), + [Demo](https://www.webcomponents.org/element/@polymer/iron-pages/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-pages +``` + +### In an HTML file + +```html + + + + + + +
Page 0
+
Page 1
+
Page 2
+
Page 3
+
+ + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/iron-pages/iron-pages.js'; + +class ExampleElement extends PolymerElement { + static get template() { + return html` + +
Page 0
+
Page 1
+
Page 2
+
Page 3
+
+ `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-pages +cd iron-pages +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-range-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-range-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-range-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-range-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-range-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-range-behavior) + +## `IronRangeBehavior` + +`IronRangeBehavior` provides the behavior for something with a minimum to +maximum range. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-range-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-range-behavior/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-range-behavior +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import {IronRangeBehavior} from '@polymer/iron-range-behavior/iron-range-behavior.js'; + +class SimpleRange extends mixinBehaviors(IronRangeBehavior, PolymerElement) { + static get template() { + return html` + + + [[ratio]]% +
+ `; + } +} + +customElements.define('simple-range', SimpleRange); +``` + +Then, in your HTML: + +```html + +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-range-behavior +cd iron-range-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-resizable-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-resizable-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-resizable-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-resizable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-resizable-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-resizable-behavior) + +## IronResizableBehavior + +`IronResizableBehavior` is a behavior that can be used in Polymer elements to +coordinate the flow of resize events between "resizers" (elements that control the +size or hidden state of their children) and "resizables" (elements that need to be +notified when they are resized or un-hidden by their parents in order to take +action on their new measurements). + +Elements that perform measurement should add the `IronResizableBehavior` behavior to +their element definition and listen for the `iron-resize` event on themselves. +This event will be fired when they become showing after having been hidden, +when they are resized explicitly by another resizable, or when the window has been +resized. + +Note, the `iron-resize` event is non-bubbling. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-resizable-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-resizable-behavior/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-resizable-behavior +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {IronResizableBehavior} from '@polymer/iron-resizable-behavior/iron-resizable-behavior.js'; + +class SampleElement extends mixinBehaviors([IronResizableBehavior], PolymerElement) { + static get template() { + return html` + + width: [[width]] + height: [[height]] + `; + } + + static get properties() { + return { + width: Number, + height: Number, + } + } + + connectedCallback() { + super.connectedCallback(); + this.addEventListener('iron-resize', this.onIronResize.bind(this)); + } + + onIronResize() { + this.width = this.offsetWidth; + this.height = this.offsetHeight; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-resizable-behavior +cd iron-resizable-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-scroll-target-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-scroll-target-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-scroll-target-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-scroll-target-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-scroll-target-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-scroll-target-behavior) + +## IronScrollTargetBehavior + +`IronScrollTargetBehavior` allows an element to respond to scroll events from a +designated scroll target. + +Elements that consume this behavior can override the `_scrollHandler` +method to add logic on the scroll event. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-scroll-target-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-scroll-target-behavior/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-scroll-target-behavior +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {IronScrollTargetBehavior} from '@polymer/iron-scroll-target-behavior/iron-scroll-target-behavior.js'; + +class SampleElement extends mixinBehaviors(IronScrollTargetBehavior, PolymerElement) { + static get template() { + return html` +

Scrollable content here

+ `; + } + + _scrollHandler() { + console.log('_scrollHandler', this._scrollTop, this._scrollLeft); + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-scroll-target-behavior +cd iron-scroll-target-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-selector@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-selector.svg)](https://www.npmjs.com/package/@polymer/iron-selector) +[![Build status](https://travis-ci.org/PolymerElements/iron-selector.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-selector) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-selector) + +## <iron-selector>, `IronSelectableBehavior`, `IronMultiSelectableBehavior` + +`iron-selector` is an element which can be used to manage a list of elements +that can be selected. Tapping on the item will make the item selected. The +`selected` indicates which item is being selected. The default is to use the +index of the item. `iron-selector`'s functionality is entirely defined by +`IronMultiSelectableBehavior`. + +`IronSelectableBehavior` gives an element the concept of a selected child +element. By default, the element will select one of its selectable children +when a ['tap' +event](https://www.polymer-project.org/3.0/docs/devguide/gesture-events#gesture-event-types) +(synthesized by Polymer, roughly 'click') is dispatched to it. + +`IronSelectableBehavior` lets you ... + + - decide which children should be considered selectable (`selectable`), + - retrieve the currently selected element (`selectedItem`) and all elements + in the selectable set (`items`), + - change the selection (`select`, `selectNext`, etc.), + - decide how selected elements are modified to indicate their selected state + (`selectedClass`, `selectedAttribute`), + +... among other things. + +`IronMultiSelectableBehavior` includes all the features of +`IronSelectableBehavior` as well as a `multi` property, which can be set to +`true` to indicate that the element can have multiple selected child elements. +It also includes the `selectedItems` and `selectedValues` properties for +working with arrays of selectable elements and their corresponding values +(`multi` is `true`) - similar to the single-item versions provided by +`IronSelectableBehavior`: `selectedItem` and `selected`. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-selector), + [Demo](https://www.webcomponents.org/element/@polymer/iron-selector/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/iron-selector +``` + +### In an HTML file + +```html + + + + + + +
Item 1
+
Item 2
+
Item 3
+
+ + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/iron-selector/iron-selector.js'; + +class ExampleElement extends PolymerElement { + static get template() { + return html` + +
Item 1
+
Item 2
+
Item 3
+
+ `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/iron-selector +cd iron-selector +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/iron-validatable-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/iron-validatable-behavior.svg)](https://www.npmjs.com/package/@polymer/iron-validatable-behavior) +[![Build status](https://travis-ci.org/PolymerElements/iron-validatable-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-validatable-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/iron-validatable-behavior) + +## IronValidatableBehavior +Use `IronValidatableBehavior` to implement an element that validates user input. By using this behaviour, your custom element will get a public `validate()` method, which +will return the validity of the element, and a corresponding `invalid` attribute, +which can be used for styling. Can be used alongside an element implementing +the `IronValidatableBehavior` behaviour. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/iron-validatable-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/iron-validatable-behavior/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/iron-validatable-behavior +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {IronValidatableBehavior} from '@polymer/iron-validatable-behavior/iron-validatable-behavior.js'; + +class SampleElement extends mixinBehaviors([IronValidatableBehavior], PolymerElement) { + static get template() { + return html` + + + `; + + // Override this method if you want to implement custom validity + // for your element. This element is only valid if the value in the + // input is "cat". + function _getValidity() { + return this.$.input.value === 'cat'; + } + } +} +customElements.define('sample-element', SampleElement); +``` + +### In an html file using the element +```html + + + + + + + + + +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/iron-validatable-behavior +cd iron-validatable-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/neon-animation@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/neon-animation.svg)](https://www.npmjs.com/package/@polymer/neon-animation) +[![Build status](https://travis-ci.org/PolymerElements/neon-animation.svg?branch=master)](https://travis-ci.org/PolymerElements/neon-animation) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/neon-animation) + +## neon-animation + +`neon-animation` is a suite of elements and behaviors to implement pluggable animated transitions for Polymer Elements using [Web Animations](https://w3c.github.io/web-animations/). Please note that these elements do not include the web-animations polyfill. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/neon-animation), + [Demo](https://www.webcomponents.org/element/@polymer/neon-animation/demo/demo/index.html). + +_See [the guide](./guide.md) for detailed usage._ + +## Usage + +### Installation + +Element: +``` +npm install --save @polymer/neon-animation +``` + +Polyfill: +``` +npm install --save web-animations-js +``` + +### In an HTML file + +### `NeonAnimatableBehavior` +Elements that can be animated by `NeonAnimationRunnerBehavior` should implement the `NeonAnimatableBehavior` behavior, or `NeonAnimationRunnerBehavior` if they're also responsible for running an animation. + +#### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {NeonAnimatableBehavior} from '@polymer/neon-animation/neon-animatable-behavior.js'; + +class SampleElement extends mixinBehaviors([NeonAnimatableBehavior], PolymerElement) { + static get template() { + return html` + + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +### `NeonAnimationRunnerBehavior` + +#### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {NeonAnimationRunnerBehavior} from '@polymer/neon-animation/neon-animation-runner-behavior.js'; +import '@polymer/neon-animation/animations/scale-down-animation.js'; + +class SampleElement extends mixinBehaviors([NeonAnimationRunnerBehavior], PolymerElement) { + static get template() { + return html` +
this entire element will be animated after one second
+ `; + } + + connectedCallback() { + super.connectedCallback(); + + // must be set here because properties is static and cannot reference "this" + this.animationConfig = { + // provided by neon-animation/animations/scale-down-animation.js + name: 'scale-down-animation', + node: this, + }; + + setTimeout(() => this.playAnimation(), 1000); + } +} +customElements.define('sample-element', SampleElement); +``` + +### `` +A simple element that implements NeonAnimatableBehavior. + +#### In an html file +```html + + + + + +
this entire element and its parent will be animated after one second
+
+ + + + +``` + +#### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {NeonAnimationRunnerBehavior} from '@polymer/neon-animation/neon-animation-runner-behavior.js'; +import '@polymer/neon-animation/neon-animatable.js'; +import '@polymer/neon-animation/animations/scale-down-animation.js'; + +class SampleElement extends mixinBehaviors([NeonAnimationRunnerBehavior], PolymerElement) { + static get template() { + return html` +
this div will not be animated
+ +
this div and its parent will be animated after one second
+
+ `; + } + + connectedCallback() { + super.connectedCallback(); + + // must be set here because properties is static and cannot reference "this" + this.animationConfig = { + // provided by neon-animation/animations/scale-down-animation.js + name: 'scale-down-animation', + node: this.$.animatable, + }; + + setTimeout(() => this.playAnimation(), 1000); + } +} +customElements.define('sample-element', SampleElement); +``` + +### `` +`neon-animated-pages` manages a set of pages and runs an animation when +switching between them. + +#### In an html file +```html + + + + + + + 1 + 2 + 3 + 4 + 5 + + + + + + +``` + +#### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/neon-animation/neon-animated-pages.js'; +import '@polymer/neon-animation/neon-animatable.js'; +import '@polymer/neon-animation/animations/slide-from-right-animation.js'; +import '@polymer/neon-animation/animations/slide-left-animation.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + 1 + 2 + 3 + 4 + 5 + + + + `; + } + + increase() { + this.$.pages.selected = this.$.pages.selected + 1 % 5; + } + + decrease() { + this.$.pages.selected = (this.$.pages.selected - 1 + 5) % 5; + } +} +customElements.define('sample-element', SampleElement); +``` + +#### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {NeonAnimationRunnerBehavior} from '@polymer/neon-animation/neon-animation-runner-behavior.js'; +import '@polymer/neon-animation/animations/neon-animatable.js'; +import '@polymer/neon-animation/animations/scale-down-animation.js'; + +class SampleElement extends mixinBehaviors([NeonAnimationRunnerBehavior], PolymerElement) { + static get template() { + return html` +
this div will not be animated
+ +
this div and its parent will be animated after one second
+
+ `; + } + + connectedCallback() { + super.connectedCallback(); + + // must be set here because properties is static and cannot reference "this" + this.animationConfig = { + // provided by neon-animation/animations/scale-down-animation.js + name: 'scale-down-animation', + node: this.$.animatable, + }; + + setTimeout(() => this.playAnimation(), 1000); + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/neon-animation +cd neon-animation +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-behaviors@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-behaviors.svg)](https://www.npmjs.com/package/@polymer/paper-behaviors) +[![Build status](https://travis-ci.org/PolymerElements/paper-behaviors.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-behaviors) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-behaviors) + +## <paper-behaviors> +`` is a set of behaviours to help implement Material Design elements: + +- `PaperCheckedElementBehavior` to implement a custom element +that has a `checked` property similar to `IronCheckedElementBehavior` +and is compatible with having a ripple effect. +- `PaperInkyFocusBehavior` implements a ripple when the element has keyboard focus. +- `PaperRippleBehavior` dynamically implements a ripple +when the element has focus via pointer or keyboard. This behavior is intended to be used in conjunction with and after +`IronButtonState` and `IronControlState`. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-behaviors), + [Demo](https://www.webcomponents.org/element/@polymer/paper-behaviors/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-behaviors +``` + +### Example of using one of the behaviours in a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {PaperButtonBehavior} from '@polymer/paper-behaviors/paper-button-behavior.js'; + +class SampleElement extends mixinBehaviors([PaperButtonBehavior], PolymerElement) { + static get template() { + return html` + +
I am a ripple-y button
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-behaviors +cd paper-behaviors +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-button@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-button.svg)](https://www.npmjs.com/package/@polymer/paper-button) +[![Build status](https://travis-ci.org/PolymerElements/paper-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-button) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-button) + +## <paper-button> + +Material design: [Buttons](https://www.google.com/design/spec/components/buttons.html) + +`paper-button` is a button. When the user touches the button, a ripple effect emanates from the point of contact. It may be flat or raised. A raised button is styled with a shadow. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-button), + [Demo](https://www.webcomponents.org/element/@polymer/paper-button/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-button +``` + +### In an html file +```html + + + + + + link + raised + toggles + disabled + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-button/paper-button.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + link + raised + toggles + disabled + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-button +cd paper-button +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-checkbox@3.1.0 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-checkbox.svg)](https://www.npmjs.com/package/@polymer/paper-checkbox) +[![Build status](https://travis-ci.org/PolymerElements/paper-checkbox.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-checkbox) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-checkbox) + +## <paper-checkbox> + +`paper-checkbox` is a button that can be either checked or unchecked. User can +tap the checkbox to check or uncheck it. Usually you use checkboxes to allow +user to select multiple options from a set. If you have a single ON/OFF option, +avoid using a single checkbox and use `paper-toggle-button` instead. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-checkbox), + [Demo](https://www.webcomponents.org/element/@polymer/paper-checkbox/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/paper-checkbox +``` + +### In an HTML file + +```html + + + + + + Unchecked + Checked + Disabled + + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/paper-checkbox/paper-checkbox.js'; + +class ExampleElement extends PolymerElement { + static get template() { + return html` + Unchecked + Checked + Disabled + `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/paper-checkbox +cd paper-checkbox +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-dialog-behavior@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-dialog-behavior.svg)](https://www.npmjs.com/package/@polymer/paper-dialog-behavior) +[![Build status](https://travis-ci.org/PolymerElements/paper-dialog-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog-behavior) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-dialog-behavior) + +## PaperDialogBehavior + +Use `PaperDialogBehavior` and `paper-dialog-shared-styles.js` to implement a Material Design +dialog. + +For example, if `` implements this behavior: + +```html + +

Header

+
Dialog body
+
+ Cancel + Accept +
+
+``` + +`paper-dialog-shared-styles.js` provide styles for a header, content area, and an action area for buttons. +Use the `

` tag for the header and the `paper-dialog-buttons` or `buttons` class for the action area. You can use the +`paper-dialog-scrollable` element (in its own repository) if you need a scrolling content area. + +Use the `dialog-dismiss` and `dialog-confirm` attributes on interactive controls to close the +dialog. If the user dismisses the dialog with `dialog-confirm`, the `closingReason` will update +to include `confirmed: true`. + +### Accessibility + +This element has `role="dialog"` by default. Depending on the context, it may be more appropriate +to override this attribute with `role="alertdialog"`. + +If `modal` is set, the element will prevent the focus from exiting the element. +It will also ensure that focus remains in the dialog. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-dialog-behavior), + [Demo](https://www.webcomponents.org/element/@polymer/paper-dialog-behavior/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-dialog-behavior +``` + +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; +import {PaperDialogBehavior} from '@polymer/paper-dialog-behavior/paper-dialog-behavior.js'; + +class SampleElement extends mixinBehaviors(PaperDialogBehavior, PolymerElement) { + static get template() { + return html` + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-dialog-behavior +cd paper-dialog-behavior +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-dialog-scrollable@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-dialog-scrollable.svg)](https://www.npmjs.com/package/@polymer/paper-dialog-scrollable) +[![Build status](https://travis-ci.org/PolymerElements/paper-dialog-scrollable.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog-scrollable) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-dialog-scrollable) + +## <paper-dialog-scrollable> +`paper-dialog-scrollable` implements a scrolling area used in a Material Design dialog. It shows +a divider at the top and/or bottom indicating more content, depending on scroll position. Use this +together with elements implementing `PaperDialogBehavior`. + +```html + +

Header

+ + Lorem ipsum... + +
+ OK +
+
+``` + +It shows a top divider after scrolling if it is not the first child in its parent container, +indicating there is more content above. It shows a bottom divider if it is scrollable and it is not +the last child in its parent container, indicating there is more content below. The bottom divider +is hidden if it is scrolled to the bottom. + +If `paper-dialog-scrollable` is not a direct child of the element implementing `PaperDialogBehavior`, +remember to set the `dialogElement`: + +```html + +

Header

+
+

Sub-header

+ + Lorem ipsum... + +
+
+ OK +
+
+ + +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-dialog-scrollable` | Mixin for the scrollable content | {} | + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-dialog-scrollable), + [Demo](https://www.webcomponents.org/element/@polymer/paper-dialog-scrollable/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-dialog-scrollable +``` + +### In an html file +```html + + + + + + + +

Heading

+ +

Scrolalble content...

+
+
+ + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-dialog/paper-dialog.js'; +import '@polymer/paper-dialog-scrollable/paper-dialog-scrollable.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + +

Heading

+ +

Scrolalble content...

+
+
+ `; + } + + _openDialog() { + this.$.dialog.open(); + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-dialog-scrollable +cd paper-dialog-scrollable +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-dialog@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-dialog.svg)](https://www.npmjs.com/package/@polymer/paper-dialog) +[![Build status](https://travis-ci.org/PolymerElements/paper-dialog.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dialog) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-dialog) + +## <paper-dialog> +`` is a dialog with Material Design styling and optional animations when it is +opened or closed. It provides styles for a header, content area, and an action area for buttons. +You can use the `` element (in its own repository) if you need a scrolling +content area. To autofocus a specific child element after opening the dialog, give it the `autofocus` +attribute. See `PaperDialogBehavior` and `IronOverlayBehavior` for specifics. + +For example, the following code implements a dialog with a header, scrolling content area and +buttons. Focus will be given to the `dialog-confirm` button when the dialog is opened. + +```html + +

Header

+ + Lorem ipsum... + +
+ Cancel + Accept +
+
+``` + +### Styling + +See the docs for `PaperDialogBehavior` for the custom properties available for styling +this element. + +### Animations + +Set the `entry-animation` and/or `exit-animation` attributes to add an animation when the dialog +is opened or closed. See the documentation in +[PolymerElements/neon-animation](https://github.com/PolymerElements/neon-animation) for more info. + +For example: + +```html + + + +

Header

+
Dialog body
+
+``` + +### Accessibility + +See the docs for `PaperDialogBehavior` for accessibility features implemented by this +element. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-dialog), + [Demo](https://www.webcomponents.org/element/@polymer/paper-dialog/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-dialog +``` + +### In an html file +```html + + + + + + +

Content

+
+ + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-dialog/paper-dialog.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + +

Content

+
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-dialog +cd paper-dialog +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-dropdown-menu@3.2.0 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-dropdown-menu.svg)](https://www.npmjs.com/package/@polymer/paper-dropdown-menu) +[![Build status](https://travis-ci.org/PolymerElements/paper-dropdown-menu.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-dropdown-menu) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-dropdown-menu) + +## <paper-dropdown-menu> +`paper-dropdown-menu` is similar to a native browser select element. +`paper-dropdown-menu` works with selectable content. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-dropdown-menu), + [Demo](https://www.webcomponents.org/element/@polymer/paper-dropdown-menu/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-dropdown-menu +``` + +### In an html file +```html + + + + + + + + allosaurus + brontosaurus + carcharodontosaurus + diplodocus + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-dropdown-menu/paper-dropdown-menu.js'; +import '@polymer/paper-item/paper-item.js'; +import '@polymer/paper-listbox/paper-listbox.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + + allosaurus + brontosaurus + carcharodontosaurus + diplodocus + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-dropdown-menu +cd paper-dropdown-menu +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-icon-button@3.0.2 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-icon-button.svg)](https://www.npmjs.com/package/@polymer/paper-icon-button) +[![Build status](https://travis-ci.org/PolymerElements/paper-icon-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-icon-button) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-icon-button) + +## <paper-icon-button> +`paper-icon-button` is a button with an image placed at the center. When the user touches +the button, a ripple effect emanates from the center of the button. + +`paper-icon-button` does not include a default icon set. To use icons from the default +set, include `@polymer/iron-icons/iron-icons.js`, and use the `icon` attribute to specify which icon +from the icon set to use. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-icon-button), + [Demo](https://www.webcomponents.org/element/@polymer/paper-icon-button/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-icon-button +``` + +### In an html file +```html + + + + + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-icon-button/paper-icon-button.js'; +import '@polymer/iron-icons/iron-icons.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-icon-button +cd paper-icon-button +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-input@3.2.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-input.svg)](https://www.npmjs.com/package/@polymer/paper-input) +[![Build status](https://travis-ci.org/PolymerElements/paper-input.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-input) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-input) + +## <paper-input> +`` is a single-line text field with Material Design styling. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-input), + [Demo](https://www.webcomponents.org/element/@polymer/paper-input/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-input +``` + +### In an html file +```html + + + + + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-input/paper-input.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-input +cd paper-input +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-item@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-item.svg)](https://www.npmjs.com/package/@polymer/paper-item) +[![Build status](https://travis-ci.org/PolymerElements/paper-item.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-item) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-item) + +## <paper-item> +`` is an interactive list item. By default, it is a horizontal flexbox. +```html +Item +``` + +Use this element with `` to make Material Design styled two-line and three-line +items. + +```html + + +
Show your status
+
Your status is visible to everyone
+
+ +
+``` + +To use `paper-item` as a link, wrap it in an anchor tag. Since `paper-item` will +already receive focus, you may want to prevent the anchor tag from receiving +focus as well by setting its tabindex to -1. + +```html + + Polymer Project + +``` + +If you are concerned about performance and want to use `paper-item` in a `paper-listbox` +with many items, you can just use a native `button` with the `paper-item` class +applied (provided you have correctly included the shared styles): + +```html + + + + + + + +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-item-min-height` | Minimum height of the item | `48px` | +| `--paper-item` | Mixin applied to the item | `{}` | +| `--paper-item-selected-weight` | The font weight of a selected item | `bold` | +| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` | +| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` | +| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` | +| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` | +| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` | + +### Accessibility + +This element has `role="listitem"` by default. Depending on usage, it may be more appropriate to set +`role="menuitem"`, `role="menuitemcheckbox"` or `role="menuitemradio"`. + +```html + + + Show your status + + + +``` + + + +## <paper-icon-item> + +`` is a convenience element to make an item with icon. It is an interactive list +item with a fixed-width icon area, according to Material Design. This is useful if the icons are of +varying widths, but you want the item bodies to line up. Use this like a ``. The child +node with the slot `item-icon` is placed in the icon area. + +```html + + + Favorite + + +
+ Avatar +
+``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-item-icon-width` | Width of the icon area | `56px` | +| `--paper-item-icon` | Mixin applied to the icon area | `{}` | +| `--paper-icon-item` | Mixin applied to the item | `{}` | +| `--paper-item-selected-weight` | The font weight of a selected item | `bold` | +| `--paper-item-selected` | Mixin applied to selected paper-items | `{}` | +| `--paper-item-disabled-color` | The color for disabled paper-items | `--disabled-text-color` | +| `--paper-item-disabled` | Mixin applied to disabled paper-items | `{}` | +| `--paper-item-focused` | Mixin applied to focused paper-items | `{}` | +| `--paper-item-focused-before` | Mixin applied to :before focused paper-items | `{}` | + +### Changes in 2.0 + +Distribution is now done with the `slot="item-icon"` attributes (replacing the `item-icon` attribute): + + + + Favorite + + +## <paper-item-body> + +Use `` in a `` or `` to make two- or +three- line items. It is a flex item that is a vertical flexbox. + +```html + + +
Show your status
+
Your status is visible to everyone
+
+
+``` + +The child elements with the `secondary` attribute is given secondary text styling. + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-item-body-two-line-min-height` | Minimum height of a two-line item | `72px` | +| `--paper-item-body-three-line-min-height` | Minimum height of a three-line item | `88px` | +| `--paper-item-body-secondary-color` | Foreground color for the `secondary` area | `--secondary-text-color` | +| `--paper-item-body-secondary` | Mixin applied to the `secondary` area | `{}` | + + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-item), + [Demo](https://www.webcomponents.org/element/@polymer/paper-item/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-item +``` + +### In an html file +```html + + + + + + Item + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-item/paper-item.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + Item + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-item +cd paper-item +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-listbox@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-listbox.svg)](https://www.npmjs.com/package/@polymer/paper-listbox) +[![Build status](https://travis-ci.org/PolymerElements/paper-listbox.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-listbox) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-listbox) + +## <paper-listbox> +`` implements an accessible listbox control with Material Design styling. The focused item +is highlighted, and the selected item has bolded text. + +```html + + Item 1 + Item 2 + +``` + +An initial selection can be specified with the `selected` attribute. + +```html + + Item 1 + Item 2 + +``` + +Make a multi-select listbox with the `multi` attribute. Items in a multi-select listbox can be deselected, +and multiple item can be selected. + +```html + + Item 1 + Item 2 + +``` + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-listbox-background-color` | Menu background color | `--primary-background-color` | +| `--paper-listbox-color` | Menu foreground color | `--primary-text-color` | +| `--paper-listbox` | Mixin applied to the listbox | `{}` | + +### Accessibility + +`` has `role="listbox"` by default. A multi-select listbox will also have +`aria-multiselectable` set. It implements key bindings to navigate through the listbox with the up and +down arrow keys, esc to exit the listbox, and enter to activate a listbox item. Typing the first letter +of a listbox item will also focus it. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-listbox), + [Demo](https://www.webcomponents.org/element/@polymer/paper-listbox/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-listbox +``` + +### In an html file +```html + + + + + + +
item 1
+
item 2
+
item 3
+
+ + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-listbox/paper-listbox.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + +
item 1
+
item 2
+
item 3
+
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-listbox +cd paper-listbox +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-menu-button@3.1.0 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-menu-button.svg)](https://www.npmjs.com/package/@polymer/paper-menu-button) +[![Build status](https://travis-ci.org/PolymerElements/paper-menu-button.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-menu-button) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-menu-button) + +## <paper-menu-button> + +`paper-menu-button` allows one to compose a designated "trigger" element with +another element that represents "content", to create a dropdown menu that +displays the "content" when the "trigger" is clicked. + +The child element assigned to the `dropdown-trigger` slot will be used as the +"trigger" element. The child element assigned to the `dropdown-content` slot will be +used as the "content" element. + +The `paper-menu-button` is sensitive to its content's `iron-select` events. If +the "content" element triggers an `iron-select` event, the `paper-menu-button` +will close automatically. + +### Styling + +The following custom properties and mixins are also available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-menu-button-dropdown-background` | Background color of the paper-menu-button dropdown | `--primary-background-color` | +| `--paper-menu-button` | Mixin applied to the paper-menu-button | `{}` | +| `--paper-menu-button-disabled` | Mixin applied to the paper-menu-button when disabled | `{}` | +| `--paper-menu-button-dropdown` | Mixin applied to the paper-menu-button dropdown | `{}` | +| `--paper-menu-button-content` | Mixin applied to the paper-menu-button content | `{}` | + +## paper-menu-button-animations.js + +Defines these animations: +- <paper-menu-grow-height-animation> +- <paper-menu-grow-width-animation> +- <paper-menu-shrink-height-animation> +- <paper-menu-shrink-width-animation> + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-menu-button), + [Demo](https://www.webcomponents.org/element/@polymer/paper-menu-button/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-menu-button +``` + +### In an html file +```html + + + + + + + + + Share + Settings + Help + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-icon-button/paper-icon-button.js'; +import '@polymer/paper-item/paper-item.js'; +import '@polymer/paper-listbox/paper-listbox.js'; +import '@polymer/paper-menu-button/paper-menu-button.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + + + Share + Settings + Help + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-menu-button +cd paper-menu-button +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-progress@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-progress.svg)](https://www.npmjs.com/package/@polymer/paper-progress) +[![Build status](https://travis-ci.org/PolymerElements/paper-progress.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-progress) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-progress) + +## <paper-progress> + +The progress bars are for situations where the percentage completed can be +determined. They give users a quick sense of how much longer an operation +will take. + +There is also a secondary progress which is useful for displaying intermediate +progress, such as the buffer level during a streaming playback progress bar. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-progress), + [Demo](https://www.webcomponents.org/element/@polymer/paper-progress/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-progress +``` + +### In an html file +```html + + + + + + + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-progress/paper-progress.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-progress +cd paper-progress +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-ripple@3.0.2 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-ripple.svg)](https://www.npmjs.com/package/@polymer/paper-ripple) +[![Build status](https://travis-ci.org/PolymerElements/paper-ripple.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-ripple) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-ripple) + +## <paper-ripple> +`paper-ripple` provides a visual effect that other paper elements can +use to simulate a rippling effect emanating from the point of contact. The +effect can be visualized as a concentric circle with motion. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-ripple), + [Demo](https://www.webcomponents.org/element/@polymer/paper-ripple/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-ripple +``` + +### In an html file +```html + + + + + +
+ Click here +
+ + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-ripple/paper-ripple.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` +
+ Click here +
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-ripple +cd paper-ripple +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-styles@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-styles.svg)](https://www.npmjs.com/package/@polymer/paper-styles) +[![Build status](https://travis-ci.org/PolymerElements/paper-styles.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-styles) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-styles) + +## <paper-styles> +1. [default-theme.js](https://github.com/PolymerElements/paper-styles/blob/master/default-theme.html): text, +background and accent colors that match the default Material Design theme + +1. [shadow.js](https://github.com/PolymerElements/paper-styles/blob/master/shadow.html): Material Design +[elevation](https://material.io/design/environment/light-shadows.html#shadows) and shadow styles + +1. [typography.js](https://github.com/PolymerElements/paper-styles/blob/master/typography.html): +Material Design [font](http://www.google.com/design/spec/style/typography.html#typography-styles) styles and sizes + +1. [demo-pages.js](https://github.com/PolymerElements/paper-styles/blob/master/demo-pages.html): generic styles +used in the PolymerElements demo pages + +1. [color.js](https://github.com/PolymerElements/paper-styles/blob/master/color.html): +a complete list of the colors defined in the Material Design [palette](https://www.google.com/design/spec/style/color.html) + +We recommend importing each of these individual files, and using the style mixins +available in each ones, rather than the aggregated `paper-styles.html` as a whole. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-styles), + [Demo](https://www.webcomponents.org/element/@polymer/paper-styles/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-styles +``` + +### In an html file +```html + + + + + +
Headline
+
This is a lifted paper
+ + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-styles/typography.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + +
Headline
+
This is a lifted paper
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-styles +cd paper-styles +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-tabs@3.1.0 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-tabs.svg)](https://www.npmjs.com/package/@polymer/paper-tabs) +[![Build status](https://travis-ci.org/PolymerElements/paper-tabs.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-tabs) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-tabs) + +## <paper-tabs> + +`` makes it easy to explore and switch between different views or +functional aspects of an app, or to browse categorized data sets. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-tabs), + [Demo](https://www.webcomponents.org/element/@polymer/paper-tabs/demo/demo/index.html). + +## Usage + +### Installation + +``` +npm install --save @polymer/paper-tabs +``` + +### In an HTML file + +```html + + + + + + + Tab 0 + Tab 1 + Tab 2 + Tab 3 + + + +``` + +### In a Polymer 3 element + +```js +import {PolymerElement} from '@polymer/polymer/polymer-element.js'; +import {html} from '@polymer/polymer/lib/utils/html-tag.js'; + +import '@polymer/paper-tabs/paper-tabs.js'; +import '@polymer/paper-tabs/paper-tab.js'; + +class ExampleElement extends PolymerElement { + static get template() { + return html` + + Tab 0 + Tab 1 + Tab 2 + Tab 3 + + `; + } +} + +customElements.define('example-element', ExampleElement); +``` + +## Contributing + +If you want to send a PR to this element, here are the instructions for running +the tests and demo locally: + +### Installation + +```sh +git clone https://github.com/PolymerElements/paper-tabs +cd paper-tabs +npm install +npm install -g polymer-cli +``` + +### Running the demo locally + +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests + +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-toast@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-toast.svg)](https://www.npmjs.com/package/@polymer/paper-toast) +[![Build status](https://travis-ci.org/PolymerElements/paper-toast.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-toast) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-toast) + +## <paper-toast> +`paper-toast` provides a subtle notification toast. Only one `paper-toast` will +be visible on screen. + +Use `opened` to show the toast: + +Example: + +```html + +``` + +Also `open()` or `show()` can be used to show the toast: + +Example: + +```html +Open Toast + + +... + +openToast: function() { + this.$.toast.open(); +} +``` + +Set `duration` to 0, a negative number or Infinity to persist the toast on screen: + +Example: + +```html + + Show more + +``` + +`` is affected by the [stacking context](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context) of its container. Adding `` inside elements that create a new stacking context - e.g. ``, `` or `` - might result in toasts partially obstructed or clipped. Add `` to the top level (``) element, outside the structure, e.g.: + +```html + + + + +``` + +You can then use custom events to communicate with it from within child components, using `addEventListener` and `dispatchEvent`. + +### Styling + +The following custom properties and mixins are available for styling: + +| Custom property | Description | Default | +| --- | --- | --- | +| `--paper-toast-background-color` | The paper-toast background-color | `#323232` | +| `--paper-toast-color` | The paper-toast color | `#f1f1f1` | + +This element applies the mixin `--paper-font-common-base` but does not import `paper-styles/typography.html`. +In order to apply the `Roboto` font to this element, make sure you've imported `paper-styles/typography.html`. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-toast), + [Demo](https://www.webcomponents.org/element/@polymer/paper-toast/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-toast +``` + +### In an html file +```html + + + + + + + + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-toast/paper-toast.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` + + `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-toast +cd paper-toast +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/paper-tooltip@3.0.1 + +This package contains the following license and notice below: + +[![Published on NPM](https://img.shields.io/npm/v/@polymer/paper-tooltip.svg)](https://www.npmjs.com/package/@polymer/paper-tooltip) +[![Build status](https://travis-ci.org/PolymerElements/paper-tooltip.svg?branch=master)](https://travis-ci.org/PolymerElements/paper-tooltip) +[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://webcomponents.org/element/@polymer/paper-tooltip) + +## <paper-tooltip> +`` is a label that appears on hover and focus when the user +hovers over an element with the cursor or with the keyboard. It will be centered +to an anchor element specified in the `for` attribute, or, if that doesn't exist, +centered to the parent node containing it. + +See: [Documentation](https://www.webcomponents.org/element/@polymer/paper-tooltip), + [Demo](https://www.webcomponents.org/element/@polymer/paper-tooltip/demo/demo/index.html). + +## Usage + +### Installation +``` +npm install --save @polymer/paper-tooltip +``` + +### In an html file +```html + + + + + +
+ + Tooltip text +
+ +
+ + Tooltip text +
+ + +``` +### In a Polymer 3 element +```js +import {PolymerElement, html} from '@polymer/polymer'; +import '@polymer/paper-tooltip/paper-tooltip.js'; + +class SampleElement extends PolymerElement { + static get template() { + return html` +
+ + Tooltip text +
+ +
+ + Tooltip text +
+ `; + } +} +customElements.define('sample-element', SampleElement); +``` + +## Contributing +If you want to send a PR to this element, here are +the instructions for running the tests and demo locally: + +### Installation +```sh +git clone https://github.com/PolymerElements/paper-tooltip +cd paper-tooltip +npm install +npm install -g polymer-cli +``` + +### Running the demo locally +```sh +polymer serve --npm +open http://127.0.0.1:/demo/ +``` + +### Running the tests +```sh +polymer test --npm +``` + +----------- + +The following NPM package may be included in this product: + + - @polymer/polymer@3.4.1 + +This package contains the following license and notice below: + +// Copyright (c) 2017 The Polymer Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM packages may be included in this product: + + - @sentry/browser@6.7.1 + - @sentry/core@6.7.1 + - @sentry/hub@6.7.1 + - @sentry/minimal@6.7.1 + - @sentry/node@6.7.1 + - @sentry/types@6.7.1 + - @sentry/utils@6.7.1 + +These packages each contain the following license and notice below: + +BSD 3-Clause License + +Copyright (c) 2019, Sentry +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM package may be included in this product: + + - @sentry/electron@2.5.4 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2018 Sentry (https://sentry.io/) and individual contributors. +Copyright (c) 2017 Tim Fish + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - @sentry/tracing@6.7.1 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2020 Sentry (https://sentry.io/) and individual contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - @types/semver@7.3.9 + +This package contains the following license and notice below: + +MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + +----------- + +The following NPM packages may be included in this product: + + - @webcomponents/shadycss@1.11.0 + - @webcomponents/webcomponentsjs@2.6.0 + +These packages each contain the following license and notice below: + +# License + +Everything in this repo is BSD style license unless otherwise specified. + +Copyright (c) 2015 The Polymer Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +* Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM package may be included in this product: + + - abort-controller@3.0.0 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2017 Toru Nagashima + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - accepts@1.3.8 + - mime-types@2.1.35 + +These packages each contain the following license and notice below: + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - agent-base@6.0.2 + +This package contains the following license and notice below: + +agent-base +========== +### Turn a function into an [`http.Agent`][http.Agent] instance +[![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI) + +This module provides an `http.Agent` generator. That is, you pass it an async +callback function, and it returns a new `http.Agent` instance that will invoke the +given callback function when sending outbound HTTP requests. + +#### Some subclasses: + +Here's some more interesting uses of `agent-base`. +Send a pull request to list yours! + + * [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints + * [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints + * [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS + * [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install agent-base +``` + + +Example +------- + +Here's a minimal example that creates a new `net.Socket` connection to the server +for every HTTP request (i.e. the equivalent of `agent: false` option): + +```js +var net = require('net'); +var tls = require('tls'); +var url = require('url'); +var http = require('http'); +var agent = require('agent-base'); + +var endpoint = 'http://nodejs.org/api/'; +var parsed = url.parse(endpoint); + +// This is the important part! +parsed.agent = agent(function (req, opts) { + var socket; + // `secureEndpoint` is true when using the https module + if (opts.secureEndpoint) { + socket = tls.connect(opts); + } else { + socket = net.connect(opts); + } + return socket; +}); + +// Everything else works just like normal... +http.get(parsed, function (res) { + console.log('"response" event!', res.headers); + res.pipe(process.stdout); +}); +``` + +Returning a Promise or using an `async` function is also supported: + +```js +agent(async function (req, opts) { + await sleep(1000); + // etc… +}); +``` + +Return another `http.Agent` instance to "pass through" the responsibility +for that HTTP request to that agent: + +```js +agent(function (req, opts) { + return opts.secureEndpoint ? https.globalAgent : http.globalAgent; +}); +``` + + +API +--- + +## Agent(Function callback[, Object options]) → [http.Agent][] + +Creates a base `http.Agent` that will execute the callback function `callback` +for every HTTP request that it is used as the `agent` for. The callback function +is responsible for creating a `stream.Duplex` instance of some kind that will be +used as the underlying socket in the HTTP request. + +The `options` object accepts the following properties: + + * `timeout` - Number - Timeout for the `callback()` function in milliseconds. Defaults to Infinity (optional). + +The callback function should have the following signature: + +### callback(http.ClientRequest req, Object options, Function cb) → undefined + +The ClientRequest `req` can be accessed to read request headers and +and the path, etc. The `options` object contains the options passed +to the `http.request()`/`https.request()` function call, and is formatted +to be directly passed to `net.connect()`/`tls.connect()`, or however +else you want a Socket to be created. Pass the created socket to +the callback function `cb` once created, and the HTTP request will +continue to proceed. + +If the `https` module is used to invoke the HTTP request, then the +`secureEndpoint` property on `options` _will be set to `true`_. + + +License +------- + +(The MIT License) + +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[http-proxy-agent]: https://github.com/TooTallNate/node-http-proxy-agent +[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent +[pac-proxy-agent]: https://github.com/TooTallNate/node-pac-proxy-agent +[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent +[http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent + +----------- + +The following NPM package may be included in this product: + + - ajv@6.12.6 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015-2017 Evgeny Poberezkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - argparse@2.0.1 + +This package contains the following license and notice below: + +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see http://www.opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - array-flatten@1.1.1 + - path-to-regexp@0.1.7 + +These packages each contain the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - arrify@2.0.1 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - asn1@0.2.4 + +This package contains the following license and notice below: + +Copyright (c) 2011 Mark Cavage, All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE + +----------- + +The following NPM package may be included in this product: + + - assert-plus@1.0.0 + +This package contains the following license and notice below: + +# assert-plus + +This library is a super small wrapper over node's assert module that has two +things: (1) the ability to disable assertions with the environment variable +NODE\_NDEBUG, and (2) some API wrappers for argument testing. Like +`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks +like this: + +```javascript + var assert = require('assert-plus'); + + function fooAccount(options, callback) { + assert.object(options, 'options'); + assert.number(options.id, 'options.id'); + assert.bool(options.isManager, 'options.isManager'); + assert.string(options.name, 'options.name'); + assert.arrayOfString(options.email, 'options.email'); + assert.func(callback, 'callback'); + + // Do stuff + callback(null, {}); + } +``` + +# API + +All methods that *aren't* part of node's core assert API are simply assumed to +take an argument, and then a string 'name' that's not a message; `AssertionError` +will be thrown if the assertion fails with a message like: + + AssertionError: foo (string) is required + at test (/home/mark/work/foo/foo.js:3:9) + at Object. (/home/mark/work/foo/foo.js:15:1) + at Module._compile (module.js:446:26) + at Object..js (module.js:464:10) + at Module.load (module.js:353:31) + at Function._load (module.js:311:12) + at Array.0 (module.js:484:10) + at EventEmitter._tickCallback (node.js:190:38) + +from: + +```javascript + function test(foo) { + assert.string(foo, 'foo'); + } +``` + +There you go. You can check that arrays are of a homogeneous type with `Arrayof$Type`: + +```javascript + function test(foo) { + assert.arrayOfString(foo, 'foo'); + } +``` + +You can assert IFF an argument is not `undefined` (i.e., an optional arg): + +```javascript + assert.optionalString(foo, 'foo'); +``` + +Lastly, you can opt-out of assertion checking altogether by setting the +environment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have +lots of assertions, and don't want to pay `typeof ()` taxes to v8 in +production. Be advised: The standard functions re-exported from `assert` are +also disabled in assert-plus if NDEBUG is specified. Using them directly from +the `assert` module avoids this behavior. + +The complete list of APIs is: + +* assert.array +* assert.bool +* assert.buffer +* assert.func +* assert.number +* assert.finite +* assert.object +* assert.string +* assert.stream +* assert.date +* assert.regexp +* assert.uuid +* assert.arrayOfArray +* assert.arrayOfBool +* assert.arrayOfBuffer +* assert.arrayOfFunc +* assert.arrayOfNumber +* assert.arrayOfFinite +* assert.arrayOfObject +* assert.arrayOfString +* assert.arrayOfStream +* assert.arrayOfDate +* assert.arrayOfRegexp +* assert.arrayOfUuid +* assert.optionalArray +* assert.optionalBool +* assert.optionalBuffer +* assert.optionalFunc +* assert.optionalNumber +* assert.optionalFinite +* assert.optionalObject +* assert.optionalString +* assert.optionalStream +* assert.optionalDate +* assert.optionalRegexp +* assert.optionalUuid +* assert.optionalArrayOfArray +* assert.optionalArrayOfBool +* assert.optionalArrayOfBuffer +* assert.optionalArrayOfFunc +* assert.optionalArrayOfNumber +* assert.optionalArrayOfFinite +* assert.optionalArrayOfObject +* assert.optionalArrayOfString +* assert.optionalArrayOfStream +* assert.optionalArrayOfDate +* assert.optionalArrayOfRegexp +* assert.optionalArrayOfUuid +* assert.AssertionError +* assert.fail +* assert.ok +* assert.equal +* assert.notEqual +* assert.deepEqual +* assert.notDeepEqual +* assert.strictEqual +* assert.notStrictEqual +* assert.throws +* assert.doesNotThrow +* assert.ifError + +# Installation + + npm install assert-plus + +## License + +The MIT License (MIT) +Copyright (c) 2012 Mark Cavage + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +## Bugs + +See . + +----------- + +The following NPM package may be included in this product: + + - asynckit@0.4.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2016 Alex Indigo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - aws-sign2@0.7.0 + - forever-agent@0.6.1 + - oauth-sign@0.9.0 + - request@2.88.2 + - tunnel-agent@0.6.0 + +These packages each contain the following license and notice below: + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +----------- + +The following NPM package may be included in this product: + + - aws4@1.11.0 + +This package contains the following license and notice below: + +Copyright 2013 Michael Hart (michael.hart.au@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - base64-js@1.5.1 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jameson Little + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - bcrypt-pbkdf@1.0.2 + +This package contains the following license and notice below: + +The Blowfish portions are under the following license: + +Blowfish block cipher for OpenBSD +Copyright 1997 Niels Provos +All rights reserved. + +Implementation advice by David Mazieres . + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +The bcrypt_pbkdf portions are under the following license: + +Copyright (c) 2013 Ted Unangst + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + + +Performance improvements (Javascript-specific): + +Copyright 2016, Joyent Inc +Author: Alex Wilson + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - bignumber.js@9.0.2 + +This package contains the following license and notice below: + +The MIT License (MIT) +===================== + +Copyright © `<2021>` `Michael Mclaughlin` + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the “Software”), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - body-parser@1.20.0 + - type-is@1.6.18 + +These packages each contain the following license and notice below: + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - buffer-equal-constant-time@1.0.1 + +This package contains the following license and notice below: + +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of salesforce.com, nor GoInstant, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM packages may be included in this product: + + - builder-util-runtime@8.7.5 + - electron-updater@4.3.9 + +These packages each contain the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015 Loopline Systems + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - bytes@3.1.2 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - call-bind@1.0.2 + - get-intrinsic@1.1.1 + +These packages each contain the following license and notice below: + +MIT License + +Copyright (c) 2020 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - caseless@0.12.0 + +This package contains the following license and notice below: + +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS + +----------- + +The following NPM package may be included in this product: + + - circle-flags@1.0.0 + +This package contains the following license and notice below: + +# MIT License + +Copyright (c) 2022 HatScripts + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - clipboard-polyfill@2.8.6 + +This package contains the following license and notice below: + +# License + +The MIT License (MIT) + +Copyright (c) 2014 Lucas Garron + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - combined-stream@1.0.8 + - delayed-stream@1.0.0 + +These packages each contain the following license and notice below: + +Copyright (c) 2011 Debuggable Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - content-disposition@0.5.4 + - forwarded@0.2.0 + - vary@1.1.2 + +These packages each contain the following license and notice below: + +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - content-type@1.0.4 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - cookie-signature@1.0.6 + +This package contains the following license and notice below: + +# cookie-signature + + Sign and unsign cookies. + +## Example + +```js +var cookie = require('cookie-signature'); + +var val = cookie.sign('hello', 'tobiiscool'); +val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI'); + +var val = cookie.sign('hello', 'tobiiscool'); +cookie.unsign(val, 'tobiiscool').should.equal('hello'); +cookie.unsign(val, 'luna').should.be.false; +``` + +## License + +(The MIT License) + +Copyright (c) 2012 LearnBoost <tj@learnboost.com> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - cookie@0.4.2 + - cookie@0.5.0 + +These packages each contain the following license and notice below: + +(The MIT License) + +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - core-util-is@1.0.2 + +This package contains the following license and notice below: + +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - dashdash@1.14.1 + +This package contains the following license and notice below: + +# This is the MIT license + +Copyright (c) 2013 Trent Mick. All rights reserved. +Copyright (c) 2013 Joyent Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - debug@2.6.9 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - debug@4.3.4 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the 'Software'), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - depd@2.0.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014-2018 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - destroy@1.2.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2015-2022 Douglas Christopher Wilson doug@somethingdoug.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - dotenv@8.2.0 + +This package contains the following license and notice below: + +Copyright (c) 2015, Scott Motte +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM package may be included in this product: + + - ecc-jsbn@0.1.2 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jeremie Miller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - ecdsa-sig-formatter@1.0.11 + +This package contains the following license and notice below: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 D2L Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------- + +The following NPM package may be included in this product: + + - ee-first@1.1.1 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - encodeurl@1.0.2 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - escape-html@1.0.3 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2015 Tiancheng "Timothy" Gu + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - etag@1.8.1 + - proxy-addr@2.0.7 + +These packages each contain the following license and notice below: + +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - event-target-shim@5.0.1 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015 Toru Nagashima + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - express@4.18.1 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - extend@3.0.2 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Stefan Thomas + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - extsprintf@1.3.0 + - jsprim@1.4.2 + +These packages each contain the following license and notice below: + +Copyright (c) 2012, Joyent, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE + +----------- + +The following NPM packages may be included in this product: + + - fast-deep-equal@3.1.3 + - json-schema-traverse@0.4.1 + +These packages each contain the following license and notice below: + +MIT License + +Copyright (c) 2017 Evgeny Poberezkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - fast-json-stable-stringify@2.1.0 + +This package contains the following license and notice below: + +This software is released under the MIT license: + +Copyright (c) 2017 Evgeny Poberezkin +Copyright (c) 2013 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - fast-text-encoding@1.0.3 + - outline-manager@1.14.0 + +These packages each contain the following license and notice below: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------- + +The following NPM package may be included in this product: + + - finalhandler@1.2.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014-2022 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - form-data@2.3.3 + +This package contains the following license and notice below: + +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - fresh@0.5.2 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - fs-extra@10.1.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2011-2017 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - function-bind@1.1.1 + +This package contains the following license and notice below: + +Copyright (c) 2013 Raynos. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - gaxios@4.3.3 + - gaxios@5.0.0 + - gcp-metadata@5.0.0 + - google-auth-library@8.0.2 + +These packages each contain the following license and notice below: + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------- + +The following NPM packages may be included in this product: + + - getpass@0.1.7 + - http-signature@1.2.0 + - sshpk@1.16.1 + +These packages each contain the following license and notice below: + +Copyright Joyent, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - google-p12-pem@3.1.4 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Ryan Seys + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - graceful-fs@4.2.8 + +This package contains the following license and notice below: + +The ISC License + +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - gtoken@5.3.2 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Ryan Seys + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - har-schema@2.0.0 + +This package contains the following license and notice below: + +Copyright (c) 2015, Ahmad Nassri + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - har-validator@5.1.5 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2018 Ahmad Nassri + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - has-symbols@1.0.3 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2016 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - has@1.0.3 + +This package contains the following license and notice below: + +Copyright (c) 2013 Thiago de Arruda + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - http-errors@2.0.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - https-proxy-agent@5.0.0 + +This package contains the following license and notice below: + +https-proxy-agent +================ +### An HTTP(s) proxy `http.Agent` implementation for HTTPS +[![Build Status](https://github.com/TooTallNate/node-https-proxy-agent/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-https-proxy-agent/actions?workflow=Node+CI) + +This module provides an `http.Agent` implementation that connects to a specified +HTTP or HTTPS proxy server, and can be used with the built-in `https` module. + +Specifically, this `Agent` implementation connects to an intermediary "proxy" +server and issues the [CONNECT HTTP method][CONNECT], which tells the proxy to +open a direct TCP connection to the destination server. + +Since this agent implements the CONNECT HTTP method, it also works with other +protocols that use this method when connecting over proxies (i.e. WebSockets). +See the "Examples" section below for more. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install https-proxy-agent +``` + + +Examples +-------- + +#### `https` module example + +``` js +var url = require('url'); +var https = require('https'); +var HttpsProxyAgent = require('https-proxy-agent'); + +// HTTP/HTTPS proxy to connect to +var proxy = process.env.http_proxy || 'http://168.63.76.32:3128'; +console.log('using proxy server %j', proxy); + +// HTTPS endpoint for the proxy to connect to +var endpoint = process.argv[2] || 'https://graph.facebook.com/tootallnate'; +console.log('attempting to GET %j', endpoint); +var options = url.parse(endpoint); + +// create an instance of the `HttpsProxyAgent` class with the proxy server information +var agent = new HttpsProxyAgent(proxy); +options.agent = agent; + +https.get(options, function (res) { + console.log('"response" event!', res.headers); + res.pipe(process.stdout); +}); +``` + +#### `ws` WebSocket connection example + +``` js +var url = require('url'); +var WebSocket = require('ws'); +var HttpsProxyAgent = require('https-proxy-agent'); + +// HTTP/HTTPS proxy to connect to +var proxy = process.env.http_proxy || 'http://168.63.76.32:3128'; +console.log('using proxy server %j', proxy); + +// WebSocket endpoint for the proxy to connect to +var endpoint = process.argv[2] || 'ws://echo.websocket.org'; +var parsed = url.parse(endpoint); +console.log('attempting to connect to WebSocket %j', endpoint); + +// create an instance of the `HttpsProxyAgent` class with the proxy server information +var options = url.parse(proxy); + +var agent = new HttpsProxyAgent(options); + +// finally, initiate the WebSocket connection +var socket = new WebSocket(endpoint, { agent: agent }); + +socket.on('open', function () { + console.log('"open" event!'); + socket.send('hello world'); +}); + +socket.on('message', function (data, flags) { + console.log('"message" event! %j %j', data, flags); + socket.close(); +}); +``` + +API +--- + +### new HttpsProxyAgent(Object options) + +The `HttpsProxyAgent` class implements an `http.Agent` subclass that connects +to the specified "HTTP(s) proxy server" in order to proxy HTTPS and/or WebSocket +requests. This is achieved by using the [HTTP `CONNECT` method][CONNECT]. + +The `options` argument may either be a string URI of the proxy server to use, or an +"options" object with more specific properties: + + * `host` - String - Proxy host to connect to (may use `hostname` as well). Required. + * `port` - Number - Proxy port to connect to. Required. + * `protocol` - String - If `https:`, then use TLS to connect to the proxy. + * `headers` - Object - Additional HTTP headers to be sent on the HTTP CONNECT method. + * Any other options given are passed to the `net.connect()`/`tls.connect()` functions. + + +License +------- + +(The MIT License) + +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +[CONNECT]: http://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_Tunneling + +----------- + +The following NPM package may be included in this product: + + - iconv-lite@0.4.24 + +This package contains the following license and notice below: + +Copyright (c) 2011 Alexander Shtuchkin + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - inherits@2.0.4 + +This package contains the following license and notice below: + +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - intl-format-cache@4.3.1 + - intl-messageformat-parser@3.6.4 + - intl-messageformat@7.8.4 + +These packages each contain the following license and notice below: + +Copyright (c) 2019, Oath Inc. + +Licensed under the terms of the New BSD license. See below for terms. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +- Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +- Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +- Neither the name of Oath Inc. nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of Oath Inc. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM package may be included in this product: + + - intl-messageformat-parser@1.4.0 + +This package contains the following license and notice below: + +Copyright 2014 Yahoo! Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the Yahoo! Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +Inspired by and derived from: +messageformat.js https://github.com/SlexAxton/messageformat.js +Copyright 2014 Alex Sexton +Apache License, Version 2.0 + +----------- + +The following NPM package may be included in this product: + + - intl-messageformat@2.2.0 + +This package contains the following license and notice below: + +Copyright 2013 Yahoo! Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of the Yahoo! Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ +Pluralization rules built from +https://github.com/papandreou/node-cldr +which is licensed under the BSD license and has the following license: + +Copyright (c) 2012, Andreas Lind Petersen +All rights reserved. + +See the following for more details: +https://github.com/papandreou/node-cldr/blob/master/LICENSE + +----------- + +The following NPM package may be included in this product: + + - ipaddr.js@1.9.1 + +This package contains the following license and notice below: + +Copyright (C) 2011-2017 whitequark + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - is-stream@2.0.1 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - is-typedarray@1.0.0 + +This package contains the following license and notice below: + +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - isstream@0.1.2 + +This package contains the following license and notice below: + +The MIT License (MIT) +===================== + +Copyright (c) 2015 Rod Vagg +--------------------------- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - js-yaml@4.1.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (C) 2011-2015 by Vitaly Puzrin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - jsbn@0.1.1 + +This package contains the following license and notice below: + +Licensing +--------- + +This software is covered under the following copyright: + +/* + * Copyright (c) 2003-2005 Tom Wu + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ + +Address all questions regarding this license to: + + Tom Wu + tjw@cs.Stanford.EDU + +----------- + +The following NPM package may be included in this product: + + - json-bigint@1.0.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2013 Andrey Sidorov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - json-schema@0.4.0 + +This package contains the following license and notice below: + +Dojo is available under *either* the terms of the BSD 3-Clause "New" License *or* the +Academic Free License version 2.1. As a recipient of Dojo, you may choose which +license to receive this code under (except as noted in per-module LICENSE +files). Some modules may not be the copyright of the Dojo Foundation. These +modules contain explicit declarations of copyright in both the LICENSE files in +the directories in which they reside and in the code itself. No external +contributions are allowed under licenses which are fundamentally incompatible +with the AFL-2.1 OR and BSD-3-Clause licenses that Dojo is distributed under. + +The text of the AFL-2.1 and BSD-3-Clause licenses is reproduced below. + +------------------------------------------------------------------------------- +BSD 3-Clause "New" License: +********************** + +Copyright (c) 2005-2015, The Dojo Foundation +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the Dojo Foundation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- +The Academic Free License, v. 2.1: +********************************** + +This Academic Free License (the "License") applies to any original work of +authorship (the "Original Work") whose owner (the "Licensor") has placed the +following notice immediately following the copyright notice for the Original +Work: + +Licensed under the Academic Free License version 2.1 + +1) Grant of Copyright License. Licensor hereby grants You a world-wide, +royalty-free, non-exclusive, perpetual, sublicenseable license to do the +following: + +a) to reproduce the Original Work in copies; + +b) to prepare derivative works ("Derivative Works") based upon the Original +Work; + +c) to distribute copies of the Original Work and Derivative Works to the +public; + +d) to perform the Original Work publicly; and + +e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor hereby grants You a world-wide, +royalty-free, non-exclusive, perpetual, sublicenseable license, under patent +claims owned or controlled by the Licensor that are embodied in the Original +Work as furnished by the Licensor, to make, use, sell and offer for sale the +Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred +form of the Original Work for making modifications to it and all available +documentation describing how to modify the Original Work. Licensor hereby +agrees to provide a machine-readable copy of the Source Code of the Original +Work along with each copy of the Original Work that Licensor distributes. +Licensor reserves the right to satisfy this obligation by placing a +machine-readable copy of the Source Code in an information repository +reasonably calculated to permit inexpensive and convenient access by You for as +long as Licensor continues to distribute the Original Work, and by publishing +the address of that information repository in a notice immediately following +the copyright notice that applies to the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names +of any contributors to the Original Work, nor any of their trademarks or +service marks, may be used to endorse or promote products derived from this +Original Work without express prior written permission of the Licensor. Nothing +in this License shall be deemed to grant any rights to trademarks, copyrights, +patents, trade secrets or any other intellectual property of Licensor except as +expressly stated herein. No patent license is granted to make, use, sell or +offer to sell embodiments of any patent claims other than the licensed claims +defined in Section 2. No right is granted to the trademarks of Licensor even if +such marks are included in the Original Work. Nothing in this License shall be +interpreted to prohibit Licensor from licensing under different terms from this +License any Original Work that Licensor otherwise would have a right to +license. + +5) This section intentionally omitted. + +6) Attribution Rights. You must retain, in the Source Code of any Derivative +Works that You create, all copyright, patent or trademark notices from the +Source Code of the Original Work, as well as any notices of licensing and any +descriptive text identified therein as an "Attribution Notice." You must cause +the Source Code for any Derivative Works that You create to carry a prominent +Attribution Notice reasonably calculated to inform recipients that You have +modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that +the copyright in and to the Original Work and the patent rights granted herein +by Licensor are owned by the Licensor or are sublicensed to You under the terms +of this License with the permission of the contributor(s) of those copyrights +and patent rights. Except as expressly stated in the immediately proceeding +sentence, the Original Work is provided under this License on an "AS IS" BASIS +and WITHOUT WARRANTY, either express or implied, including, without limitation, +the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. +This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No +license to Original Work is granted hereunder except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, +whether in tort (including negligence), contract, or otherwise, shall the +Licensor be liable to any person for any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License +or the use of the Original Work including, without limitation, damages for loss +of goodwill, work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses. This limitation of liability shall not +apply to liability for death or personal injury resulting from Licensor's +negligence to the extent applicable law prohibits such limitation. Some +jurisdictions do not allow the exclusion or limitation of incidental or +consequential damages, so this exclusion and limitation may not apply to You. + +9) Acceptance and Termination. If You distribute copies of the Original Work or +a Derivative Work, You must make a reasonable effort under the circumstances to +obtain the express assent of recipients to the terms of this License. Nothing +else but this License (or another written agreement between Licensor and You) +grants You permission to create Derivative Works based upon the Original Work +or to exercise any of the rights granted in Section 1 herein, and any attempt +to do so except under the terms of this License (or another written agreement +between Licensor and You) is expressly prohibited by U.S. copyright law, the +equivalent laws of other countries, and by international treaty. Therefore, by +exercising any of the rights granted to You in Section 1 herein, You indicate +Your acceptance of this License and all of its terms and conditions. + +10) Termination for Patent Action. This License shall terminate automatically +and You may no longer exercise any of the rights granted to You by this License +as of the date You commence an action, including a cross-claim or counterclaim, +against Licensor or any licensee alleging that the Original Work infringes a +patent. This termination provision shall not apply for an action alleging +patent infringement by combinations of the Original Work with other software or +hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this +License may be brought only in the courts of a jurisdiction wherein the +Licensor resides or in which Licensor conducts its primary business, and under +the laws of that jurisdiction excluding its conflict-of-law provisions. The +application of the United Nations Convention on Contracts for the International +Sale of Goods is expressly excluded. Any use of the Original Work outside the +scope of this License or after its termination shall be subject to the +requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et +seq., the equivalent laws of other countries, and international treaty. This +section shall survive the termination of this License. + +12) Attorneys Fees. In any action to enforce the terms of this License or +seeking damages relating thereto, the prevailing party shall be entitled to +recover its costs and expenses, including, without limitation, reasonable +attorneys' fees and costs incurred in connection with such action, including +any appeal of such action. This section shall survive the termination of this +License. + +13) Miscellaneous. This License represents the complete agreement concerning +the subject matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent necessary to +make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether +in upper or lower case, means an individual or a legal entity exercising rights +under, and complying with all of the terms of, this License. For legal +entities, "You" includes any entity that controls, is controlled by, or is +under common control with you. For purposes of this definition, "control" means +(i) the power, direct or indirect, to cause the direction or management of such +entity, whether by contract or otherwise, or (ii) ownership of fifty percent +(50%) or more of the outstanding shares, or (iii) beneficial ownership of such +entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise +restricted or conditioned by this License or by law, and Licensor promises not +to interfere with or be responsible for such uses by You. + +This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. +Permission is hereby granted to copy and distribute this license without +modification. This license may not be modified without the express written +permission of its copyright owner. + +----------- + +The following NPM packages may be included in this product: + + - json-stringify-safe@5.0.1 + - lru-cache@6.0.0 + - semver@7.3.7 + - yallist@4.0.0 + +These packages each contain the following license and notice below: + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - jsonfile@6.1.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - jsonic@0.3.1 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2013-2017 Richard Rodger + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - jwa@2.0.0 + - jws@4.0.0 + +These packages each contain the following license and notice below: + +Copyright (c) 2013 Brian J. Brennan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - lazy-val@1.0.5 + +This package contains the following license and notice below: + +## lazy-val + +Lazy value. + +```typescript +class Lazy { + constructor(creator: () => Promise) + readonly hasValue: boolean + value: Promise +} +``` + +----------- + +The following NPM packages may be included in this product: + + - lit-element@2.5.1 + - lit-html@1.4.1 + +These packages each contain the following license and notice below: + +BSD 3-Clause License + +Copyright (c) 2017, The Polymer Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM package may be included in this product: + + - lodash.escaperegexp@4.1.2 + +This package contains the following license and notice below: + +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + +----------- + +The following NPM package may be included in this product: + + - lodash.isequal@4.5.0 + +This package contains the following license and notice below: + +Copyright JS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + +----------- + +The following NPM package may be included in this product: + + - lru_map@0.3.3 + +This package contains the following license and notice below: + +# Least Recently Used (LRU) cache algorithm + +A finite key-value map using the [Least Recently Used (LRU)](http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used) algorithm, where the most recently-used items are "kept alive" while older, less-recently used items are evicted to make room for newer items. + +Useful when you want to limit use of memory to only hold commonly-used things. + +[![Build status](https://travis-ci.org/rsms/js-lru.svg?branch=master)](https://travis-ci.org/rsms/js-lru) + +## Terminology & design + +- Based on a doubly-linked list for low complexity random shuffling of entries. + +- The cache object iself has a "head" (least recently used entry) and a + "tail" (most recently used entry). + +- The "oldest" and "newest" are list entries -- an entry might have a "newer" and + an "older" entry (doubly-linked, "older" being close to "head" and "newer" + being closer to "tail"). + +- Key lookup is done through a key-entry mapping native object, which on most + platforms mean `O(1)` complexity. This comes at a very low memory cost (for + storing two extra pointers for each entry). + +Fancy ASCII art illustration of the general design: + +```txt + entry entry entry entry + ______ ______ ______ ______ + | head |.newer => | |.newer => | |.newer => | tail | +.oldest = | A | | B | | C | | D | = .newest + |______| <= older.|______| <= older.|______| <= older.|______| + + removed <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- added +``` + +## Example + +```js +let c = new LRUMap(3) +c.set('adam', 29) +c.set('john', 26) +c.set('angela', 24) +c.toString() // -> "adam:29 < john:26 < angela:24" +c.get('john') // -> 26 + +// Now 'john' is the most recently used entry, since we just requested it +c.toString() // -> "adam:29 < angela:24 < john:26" +c.set('zorro', 141) // -> {key:adam, value:29} + +// Because we only have room for 3 entries, adding 'zorro' caused 'adam' +// to be removed in order to make room for the new entry +c.toString() // -> "angela:24 < john:26 < zorro:141" +``` + +# Usage + +**Recommended:** Copy the code in lru.js or copy the lru.js and lru.d.ts files into your source directory. For minimal functionality, you only need the lines up until the comment that says "Following code is optional". + +**Using NPM:** [`yarn add lru_map`](https://www.npmjs.com/package/lru_map) (note that because NPM is one large flat namespace, you need to import the module as "lru_map" rather than simply "lru".) + +**Using AMD:** An [AMD](https://github.com/amdjs/amdjs-api/blob/master/AMD.md#amd) module loader like [`amdld`](https://github.com/rsms/js-amdld) can be used to load this module as well. There should be nothing to configure. + +**Testing**: + +- Run tests with `npm test` +- Run benchmarks with `npm run benchmark` + +**ES compatibility:** This implementation is compatible with modern JavaScript environments and depend on the following features not found in ES5: + +- `const` and `let` keywords +- `Symbol` including `Symbol.iterator` +- `Map` + +> Note: If you need ES5 compatibility e.g. to use with older browsers, [please use version 2](https://github.com/rsms/js-lru/tree/v2) which has a slightly less feature-full API but is well-tested and about as fast as this implementation. + +**Using with TypeScript** + +This module comes with complete typing coverage for use with TypeScript. If you copied the code or files rather than using a module loader, make sure to include `lru.d.ts` into the same location where you put `lru.js`. + +```ts +import {LRUMap} from './lru' +// import {LRUMap} from 'lru' // when using via AMD +// import {LRUMap} from 'lru_map' // when using from NPM +console.log('LRUMap:', LRUMap) +``` + +# API + +The API imitates that of [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map), which means that in most cases you can use `LRUMap` as a drop-in replacement for `Map`. + +```ts +export class LRUMap { + // Construct a new cache object which will hold up to limit entries. + // When the size == limit, a `put` operation will evict the oldest entry. + // + // If `entries` is provided, all entries are added to the new map. + // `entries` should be an Array or other iterable object whose elements are + // key-value pairs (2-element Arrays). Each key-value pair is added to the new Map. + // null is treated as undefined. + constructor(limit :number, entries? :Iterable<[K,V]>); + + // Convenience constructor equivalent to `new LRUMap(count(entries), entries)` + constructor(entries :Iterable<[K,V]>); + + // Current number of items + size :number; + + // Maximum number of items this map can hold + limit :number; + + // Least recently-used entry. Invalidated when map is modified. + oldest :Entry; + + // Most recently-used entry. Invalidated when map is modified. + newest :Entry; + + // Replace all values in this map with key-value pairs (2-element Arrays) from + // provided iterable. + assign(entries :Iterable<[K,V]>) : void; + + // Put into the cache associated with . Replaces any existing entry + // with the same key. Returns `this`. + set(key :K, value :V) : LRUMap; + + // Purge the least recently used (oldest) entry from the cache. + // Returns the removed entry or undefined if the cache was empty. + shift() : [K,V] | undefined; + + // Get and register recent use of . + // Returns the value associated with or undefined if not in cache. + get(key :K) : V | undefined; + + // Check if there's a value for key in the cache without registering recent use. + has(key :K) : boolean; + + // Access value for without registering recent use. Useful if you do not + // want to chage the state of the map, but only "peek" at it. + // Returns the value associated with if found, or undefined if not found. + find(key :K) : V | undefined; + + // Remove entry from cache and return its value. + // Returns the removed value, or undefined if not found. + delete(key :K) : V | undefined; + + // Removes all entries + clear() : void; + + // Returns an iterator over all keys, starting with the oldest. + keys() : Iterator; + + // Returns an iterator over all values, starting with the oldest. + values() : Iterator; + + // Returns an iterator over all entries, starting with the oldest. + entries() : Iterator<[K,V]>; + + // Returns an iterator over all entries, starting with the oldest. + [Symbol.iterator]() : Iterator<[K,V]>; + + // Call `fun` for each entry, starting with the oldest entry. + forEach(fun :(value :V, key :K, m :LRUMap)=>void, thisArg? :any) : void; + + // Returns an object suitable for JSON encoding + toJSON() : Array<{key :K, value :V}>; + + // Returns a human-readable text representation + toString() : string; +} + +// An entry holds the key and value, and pointers to any older and newer entries. +// Entries might hold references to adjacent entries in the internal linked-list. +// Therefore you should never store or modify Entry objects. Instead, reference the +// key and value of an entry when needed. +interface Entry { + key :K; + value :V; +} +``` + +If you need to perform any form of finalization of items as they are evicted from the cache, wrapping the `shift` method is a good way to do it: + +```js +let c = new LRUMap(123); +c.shift = function() { + let entry = LRUMap.prototype.shift.call(this); + doSomethingWith(entry); + return entry; +} +``` + +The internals calls `shift` as entries need to be evicted, so this method is guaranteed to be called for any item that's removed from the cache. The returned entry must not include any strong references to other entries. See note in the documentation of `LRUMap.prototype.set()`. + + +# MIT license + +Copyright (c) 2010-2016 Rasmus Andersson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - media-typer@0.3.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - merge-descriptors@1.0.1 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - methods@1.1.2 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2013-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - mime-db@1.52.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015-2022 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - mime@1.6.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - ms@2.0.0 + - ms@2.1.2 + +These packages each contain the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - ms@2.1.3 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2020 Vercel, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - negotiator@0.6.3 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2012-2014 Federico Romero +Copyright (c) 2012-2014 Isaac Z. Schlueter +Copyright (c) 2014-2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - node-fetch@2.6.7 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2016 David Frank + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - node-forge@1.3.1 + +This package contains the following license and notice below: + +You may use the Forge project under the terms of either the BSD License or the +GNU General Public License (GPL) Version 2. + +The BSD License is recommended for most projects. It is simple and easy to +understand and it places almost no restrictions on what you can do with the +Forge project. + +If the GPL suits your project better you are also free to use Forge under +that license. + +You don't have to do anything special to choose one license or the other and +you don't have to notify anyone which license you are using. You are free to +use this project in commercial projects as long as the copyright header is +left intact. + +If you are a commercial entity and use this set of libraries in your +commercial software then reasonable payment to Digital Bazaar, if you can +afford it, is not required but is expected and would be appreciated. If this +library saves you time, then it's saving you money. The cost of developing +the Forge software was on the order of several hundred hours and tens of +thousands of dollars. We are attempting to strike a balance between helping +the development community while not being taken advantage of by lucrative +commercial entities for our efforts. + +------------------------------------------------------------------------------- +New BSD License (3-clause) +Copyright (c) 2010, Digital Bazaar, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Digital Bazaar, Inc. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL DIGITAL BAZAAR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------- + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +----------- + +The following NPM package may be included in this product: + + - object-inspect@1.12.2 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2013 James Halliday + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - on-finished@2.4.1 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - parseurl@1.3.3 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - performance-now@2.1.0 + +This package contains the following license and notice below: + +Copyright (c) 2013 Braveg1rl + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - psl@1.8.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2017 Lupo Montero lupomontero@gmail.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - punycode@2.1.1 + +This package contains the following license and notice below: + +Copyright Mathias Bynens + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - qs@6.10.3 + - qs@6.5.3 + +These packages each contain the following license and notice below: + +BSD 3-Clause License + +Copyright (c) 2014, Nathan LaFreniere and other [contributors](https://github.com/ljharb/qs/graphs/contributors) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM package may be included in this product: + + - range-parser@1.2.1 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2014-2022 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM packages may be included in this product: + + - safe-buffer@5.1.2 + - safe-buffer@5.2.1 + +These packages each contain the following license and notice below: + +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - safer-buffer@2.1.2 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - sax@1.2.4 + +This package contains the following license and notice below: + +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - send@0.18.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2014-2022 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - serve-static@1.15.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 LearnBoost +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - setprototypeof@1.2.0 + +This package contains the following license and notice below: + +Copyright (c) 2015, Wes Todd + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - side-channel@1.0.4 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2019 Jordan Harband + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - statuses@2.0.1 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - toidentifier@1.0.1 + +This package contains the following license and notice below: + +MIT License + +Copyright (c) 2016 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - tough-cookie@2.5.0 + +This package contains the following license and notice below: + +Copyright (c) 2015, Salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM packages may be included in this product: + + - tslib@1.14.1 + - tslib@2.4.0 + +These packages each contain the following license and notice below: + +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - tweetnacl@0.14.5 + +This package contains the following license and notice below: + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +----------- + +The following NPM package may be included in this product: + + - universalify@2.0.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2017, Ryan Zimmerman + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - unpipe@1.0.0 + +This package contains the following license and notice below: + +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - uri-js@4.4.1 + +This package contains the following license and notice below: + +Copyright 2011 Gary Court. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court. + +----------- + +The following NPM package may be included in this product: + + - utils-merge@1.0.1 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2013-2017 Jared Hanson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - uuid@3.4.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +----------- + +The following NPM package may be included in this product: + + - verror@1.10.0 + +This package contains the following license and notice below: + +Copyright (c) 2016, Joyent, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE + +----------- + +The following NPM package may be included in this product: + + - web-animations-js@2.3.2 + +This package contains the following license and notice below: + +What is Web Animations? +----------------------- + +A new JavaScript API for driving animated content on the web. By unifying +the animation features of SVG and CSS, Web Animations unlocks features +previously only usable declaratively, and exposes powerful, high-performance +animation capabilities to developers. + +What is in this repository? +--------------------------- + +A JavaScript implementation of the Web Animations API that provides Web +Animation features in browsers that do not support it natively. The polyfill +falls back to the native implementation when one is available. + +Quick start +----------- + +Here's a simple example of an animation that fades and scales a `
`. +[Try it as a live demo.](http://jsbin.com/yageyezabo/edit?html,js,output) + +```html + + + + +
Hello world!
+ + + +``` + +Documentation +------------- + +* [Codelab tutorial](https://github.com/web-animations/web-animations-codelabs) +* [Examples of usage](/docs/examples.md) +* [Live demos](https://web-animations.github.io/web-animations-demos) +* [MDN reference](https://developer.mozilla.org/en-US/docs/Web/API/Element/animate) +* [W3C specification](https://drafts.csswg.org/web-animations/) + +We love feedback! +----------------- + +* For feedback on the API and the specification: + * File an issue on GitHub: + * Alternatively, send an email to with subject line +"[web-animations] ... message topic ..." +([archives](http://lists.w3.org/Archives/Public/public-fx/)). + +* For issues with the polyfill, report them on GitHub: +. + +Keep up-to-date +--------------- + +Breaking polyfill changes will be announced on this low-volume mailing list: +[web-animations-changes@googlegroups.com](https://groups.google.com/forum/#!forum/web-animations-changes). + +More info +--------- + +* [Technical details about the polyfill](/docs/support.md) + * [Browser support](/docs/support.md#browser-support) + * [Fallback to native](/docs/support.md#native-fallback) + * [Feature list](/docs/support.md#features) + * [Feature deprecation and removal processes](/docs/support.md#process-for-breaking-changes) +* To test experimental API features, try one of the + [experimental targets](/docs/experimental.md) + +----------- + +The following NPM package may be included in this product: + + - webidl-conversions@3.0.1 + +This package contains the following license and notice below: + +# The BSD 2-Clause License + +Copyright (c) 2014, Domenic Denicola +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------- + +The following NPM package may be included in this product: + + - whatwg-url@5.0.0 + +This package contains the following license and notice below: + +The MIT License (MIT) + +Copyright (c) 2015–2016 Sebastian Mayr + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------- + +This file was generated with generate-license-file! https://www.npmjs.com/package/generate-license-file------ + +IP Geolocation by DB-IP (https://db-ip.com) + +This database is licensed under a Creative Commons Attribution 4.0 International License (https://creativecommons.org/licenses/by/4.0/) \ No newline at end of file diff --git a/server_manager/web_app/ui_components/outline-about-dialog.ts b/server_manager/web_app/ui_components/outline-about-dialog.ts new file mode 100644 index 0000000000..d43d72fafb --- /dev/null +++ b/server_manager/web_app/ui_components/outline-about-dialog.ts @@ -0,0 +1,102 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import '@polymer/paper-dialog/paper-dialog'; +import './cloud-install-styles'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +export interface OutlineAboutDialog extends Element { + open(): void; +} + +Polymer({ + _template: html` + + + +
+ +
+

+

+ > +

+

+ + + +

+
+ [[localize('close')]] +
+
+ `, + + is: 'outline-about-dialog', + + properties: { + localize: Function, + outlineVersion: String, + }, + + open() { + this.$.dialog.open(); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-cloud-instructions-view.ts b/server_manager/web_app/ui_components/outline-cloud-instructions-view.ts new file mode 100644 index 0000000000..8d73572811 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-cloud-instructions-view.ts @@ -0,0 +1,106 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import '@polymer/iron-icons/iron-icons'; +import '@polymer/paper-button/paper-button'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; +Polymer({ + _template: html` + +
+
+
[[title]]
+
+ [[localize('manual-server-show-me')]] +
+
+
+ +
+ +
+ +
+
+ `, + + is: 'outline-cloud-instructions-view', + + properties: { + title: String, + imagePath: String, + thumbnailPath: String, + instructions: Array, + localize: Function, + }, + + _openImage() { + this.fire('OpenImageRequested', {imagePath: this.imagePath}); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-do-oauth-step.ts b/server_manager/web_app/ui_components/outline-do-oauth-step.ts new file mode 100644 index 0000000000..fb471ea7d9 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-do-oauth-step.ts @@ -0,0 +1,179 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import '@polymer/iron-pages/iron-pages'; +import './cloud-install-styles'; +import './outline-step-view'; + +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +export interface OutlineDoOauthStep extends Element { + onCancel: Function; + showConnectAccount(): void; + showAccountActive(): void; + showBilling(): void; + showEmailVerification(): void; +} + +Polymer({ + _template: html` + + + + + [[localize('oauth-connect-title')]] + [[localize('oauth-connect-description')]] + +
+ +

[[localize('oauth-connect-tag')]]

+
+ [[localize('cancel')]] +
+
+ + + [[localize('oauth-activate-account')]] + [[localize('oauth-verify')]] + +
+ +

[[localize('oauth-verify-tag')]]

+
+ [[localize('oauth-sign-out')]] +
+
+ + + [[localize('oauth-activate-account')]] + [[localize('oauth-billing')]] + +
+ +

[[localize('oauth-billing-tag')]]

+
+ [[localize('oauth-sign-out')]] +
+
+ + + [[localize('oauth-activate-account')]] + [[localize('oauth-account-active')]] + +
+ +

[[localize('oauth-account-active-tag')]]

+
+ [[localize('oauth-sign-out')]] +
+
+
+ `, + + is: 'outline-do-oauth-step', + + properties: { + currentPage: { + type: String, + value: 'connectAccount', + }, + cancelButtonText: { + type: String, + value: 'Cancel', + }, + localize: { + type: Function, + }, + onCancel: Function, + }, + + _cancelTapped() { + if (this.onCancel) { + this.onCancel(); + } + }, + + showEmailVerification() { + this.currentPage = 'verifyEmail'; + }, + + showBilling() { + this.currentPage = 'enterBilling'; + }, + + showAccountActive() { + this.currentPage = 'accountActive'; + }, + + showConnectAccount() { + this.currentPage = 'connectAccount'; + }, +}); diff --git a/server_manager/web_app/ui_components/outline-feedback-dialog.ts b/server_manager/web_app/ui_components/outline-feedback-dialog.ts new file mode 100644 index 0000000000..9e257b7909 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-feedback-dialog.ts @@ -0,0 +1,269 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/paper-dialog/paper-dialog'; +import '@polymer/paper-dropdown-menu/paper-dropdown-menu'; +import '@polymer/paper-item/paper-item'; +import '@polymer/paper-listbox/paper-listbox'; +import '@polymer/paper-input/paper-input'; +import '@polymer/paper-input/paper-textarea'; +// This is needed to fix the "KeyframeEffect is not defined" +// see https://github.com/PolymerElements/paper-swatch-picker/issues/36 +import 'web-animations-js/web-animations-next.min'; + +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +export interface OutlineFeedbackDialog extends Element { + open(prepopulatedMessage?: string, showInstallationFailed?: boolean): void; +} + +export interface FeedbackDetail { + feedbackCategory: string; + userFeedback: string; + userEmail: string; + cloudProvider?: string; +} + +Polymer({ + _template: html` + + + +

[[title]]

+
+

[[feedbackExplanation]]

+ + + [[localize('feedback-general')]] + [[localize('feedback-install')]] + [[localize('feedback-connection')]] + [[localize('feedback-connection-others')]] + [[localize('feedback-management')]] + [[localize('feedback-suggestion')]] + + + + + DigitalOcean + Amazon Web Services + Google Cloud Platform + [[localize('feedback-other')]] + + + +

[[localize('feedback-disclaimer')]]

+ +

+
+ +

+ [[localize('cancel')]] + [[localize('feedback-submit')]] +

+
+ `, + + is: 'outline-feedback-dialog', + + properties: { + title: String, + feedbackExplanation: String, + feedbackCategories: { + type: Object, + readOnly: true, + value: { + // Maps a category to its `feedbackCategoryListbox` item index. + GENERAL: 0, + INSTALLATION: 1, + CONNECTION: 2, + CONNECTION_OTHERS: 3, + MANAGEMENT: 4, + SUGGESTIONS: 5, + }, + }, + hasEnteredEmail: { + type: Boolean, + value: false, + }, + shouldShowCloudProvider: { + type: Boolean, + value: false, + }, + shouldShowLanguageDisclaimer: { + type: Boolean, + computed: '_computeShouldShowLanguageDisclaimer(hasEnteredEmail)', + }, + localize: { + type: Function, + }, + }, + + open(prepopulatedMessage: string, showInstallationFailed: boolean) { + // The localized category doesn't get displayed the first time opening the + // dialog (or after updating language) because the selected list item won't + // notice the localization change. + // This is a known issue and here is a workaround (force the selected item change): + // https://github.com/PolymerElements/paper-dropdown-menu/issues/159#issuecomment-229958448 + this.$.feedbackCategoryListbox.selected = undefined; + + // Clear all fields, in case feedback had already been entered. + if (showInstallationFailed) { + this.title = this.localize('feedback-title-install'); + this.feedbackExplanation = this.localize('feedback-explanation-install'); + this.$.dialog.classList.add('installationFailed'); + this.$.feedbackCategoryListbox.selected = this.feedbackCategories.INSTALLATION; + } else { + this.title = this.localize('feedback-title-generic'); + this.feedbackExplanation = ''; + this.$.dialog.classList.remove('installationFailed'); + this.$.feedbackCategoryListbox.selected = this.feedbackCategories.GENERAL; + } + this.$.userFeedback.invalid = false; + this.$.userFeedback.value = prepopulatedMessage || ''; + this.$.userEmail.value = ''; + this.$.cloudProviderListbox.selected = undefined; + this.$.dialog.open(); + }, + + submitTappedHandler() { + // Verify that userFeedback is entered. + if (!this.$.userFeedback.value) { + this.$.userFeedback.invalid = true; + return; + } + const data: FeedbackDetail = { + feedbackCategory: this.$.feedbackCategory.selectedItemLabel, + userFeedback: this.$.userFeedback.value, + userEmail: this.$.userEmail.value, + }; + const selectedCloudProvider = this.$.cloudProvider.selectedItemLabel; + if (this.shouldShowCloudProvider && !!selectedCloudProvider) { + data.cloudProvider = selectedCloudProvider; + } + this.fire('SubmitFeedback', data); + this.$.dialog.close(); + }, + + userEmailValueChanged() { + this.hasEnteredEmail = !!this.$.userEmail.value; + }, + + feedbackCategoryChanged() { + const selectedCategory = this.$.feedbackCategoryListbox.selected; + if ( + selectedCategory === this.feedbackCategories.INSTALLATION || + selectedCategory === this.feedbackCategories.CONNECTION || + selectedCategory === this.feedbackCategories.CONNECTION_OTHERS + ) { + this.shouldShowCloudProvider = true; + } else { + this.shouldShowCloudProvider = false; + } + this.$.dialog.notifyResize(); + }, + + userFeedbackValueChanged() { + // Hides any error message when the user starts typing feedback. + this.$.userFeedback.invalid = false; + + // Make the paper-dialog (vertically) re-center. + this.$.dialog.notifyResize(); + }, + + // Returns whether the window's locale is English (i.e. EN, en-US) and the user has + // entered their email. + _computeShouldShowLanguageDisclaimer(hasEnteredEmail: boolean) { + return !window.navigator.language.match(/^en/i) && hasEnteredEmail; + }, +}); diff --git a/server_manager/web_app/ui_components/outline-gcp-oauth-step.ts b/server_manager/web_app/ui_components/outline-gcp-oauth-step.ts new file mode 100644 index 0000000000..5f47c676d5 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-gcp-oauth-step.ts @@ -0,0 +1,107 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import '@polymer/polymer/polymer-legacy'; +import '@polymer/iron-pages/iron-pages'; +import './outline-step-view'; + +import {css, customElement, html, LitElement, property} from 'lit-element'; +import {COMMON_STYLES} from '../ui_components/cloud-install-styles'; + +@customElement('outline-gcp-oauth-step') +export class GcpConnectAccountApp extends LitElement { + @property({type: Function}) onCancel: Function; + @property({type: Function}) localize: Function; + + static get styles() { + return [ + COMMON_STYLES, + css` + :host { + } + .container { + display: flex; + flex-direction: column; + justify-content: center; + height: 100%; + align-items: center; + padding: 132px 0; + font-size: 14px; + } + #connectAccount img { + width: 48px; + height: 48px; + margin-bottom: 12px; + } + .card { + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: space-between; + margin: 24px 0; + padding: 24px; + background: var(--background-contrast-color); + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 1px 3px 0 rgba(0, 0, 0, 0.2); + border-radius: 2px; + } + @media (min-width: 1025px) { + paper-card { + /* Set min with for the paper-card to grow responsively. */ + min-width: 600px; + } + } + .card p { + color: var(--light-gray); + width: 100%; + text-align: center; + } + .card paper-button { + color: var(--light-gray); + width: 100%; + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 2px; + } + .card paper-button[disabled] { + color: var(--medium-gray); + background: transparent; + } + /* Mirror images */ + :host(:dir(rtl)) .mirror { + transform: scaleX(-1); + } + `, + ]; + // TODO: RTL + } + + render() { + return html` + ${this.localize('gcp-oauth-connect-title')} + ${this.localize('oauth-connect-description')} + +
+ +

${this.localize('oauth-connect-tag')}

+
+ ${this.localize('cancel')} +
+
`; + } + + private onCancelTapped() { + if (this.onCancel) { + this.onCancel(); + } + } +} diff --git a/server_manager/web_app/ui_components/outline-help-bubble.ts b/server_manager/web_app/ui_components/outline-help-bubble.ts new file mode 100644 index 0000000000..b8ae5af01e --- /dev/null +++ b/server_manager/web_app/ui_components/outline-help-bubble.ts @@ -0,0 +1,175 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import {IronFitBehavior} from '@polymer/iron-fit-behavior/iron-fit-behavior'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +export interface OutlineHelpBubble extends Element { + show(positionTarget: Element, arrowDirection: string, leftOrRightOffset: string): void; + hide(): void; +} + +Polymer({ + _template: html` + + +
+
+
+
+
+ `, + + is: 'outline-help-bubble', + + behaviors: [IronFitBehavior], + + ready() { + // Prevent help bubble from overlapping with it's positionTarget. + this.setAttribute('no-overlap', true); + + // Help bubble should default to hidden until show is called. + this.setAttribute('hidden', true); + }, + + show(positionTarget: Element, arrowDirection: string, leftOrRightOffset: string) { + this.removeAttribute('hidden'); + + // Set arrow direction. + this.classList.add('showArrow-' + arrowDirection); + + // Apply left or right offset to arrow, e.g. display an up-pointing + // arrow on the top right. + const isUpOrDown = arrowDirection === 'up' || arrowDirection === 'down'; + if (isUpOrDown && (leftOrRightOffset === 'left' || leftOrRightOffset === 'right')) { + this.classList.add('offset-' + leftOrRightOffset); + } + + // Position the help bubble. + this.positionTarget = positionTarget; + this.refit(); + + // Listen to scroll and resize events so the help bubble can reposition if needed. + window.addEventListener('scroll', this.refit.bind(this)); + window.addEventListener('resize', this.refit.bind(this)); + }, + + hide() { + this.setAttribute('hidden', true); + window.removeEventListener('scroll', this.refit.bind(this)); + window.removeEventListener('resize', this.refit.bind(this)); + this.fire('outline-help-bubble-dismissed'); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-iconset.ts b/server_manager/web_app/ui_components/outline-iconset.ts new file mode 100644 index 0000000000..24838a8397 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-iconset.ts @@ -0,0 +1,55 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import '@polymer/iron-iconset-svg/iron-iconset-svg'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +const template = html` + + + + + + + + + + + + + + + + + + + + + + + + +`; + +document.head.appendChild(template.content); diff --git a/server_manager/web_app/ui_components/outline-intro-step.ts b/server_manager/web_app/ui_components/outline-intro-step.ts new file mode 100644 index 0000000000..6a6d3fea6b --- /dev/null +++ b/server_manager/web_app/ui_components/outline-intro-step.ts @@ -0,0 +1,420 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import '@polymer/paper-button/paper-button'; +import './cloud-install-styles'; +import './outline-step-view'; +import './style.css'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +const DO_CARD_HTML = html` + +
+
+
+ [[localize('setup-recommended')]] +
+ + +
+
DigitalOcean
+
+
+
    +
  • [[localize('setup-do-easiest')]]
  • +
  • [[localize('setup-do-cost')]]
  • +
  • [[localize('setup-do-data')]]
  • +
  • [[localize('setup-cancel')]]
  • +
+

[[localize('setup-do-create')]]

+
+
+ +
+`; + +const GCP_STYLES = html` + +`; + +const GCP_CARD_HTML = html` + ${GCP_STYLES} + +
+
+
[[localize('setup-recommended')]]
+ + +
+
Google Cloud Platform
+
+
+
    +
  • [[localize('setup-gcp-easy')]]
  • +
  • +
  • +
  • [[localize('setup-cancel')]]
  • +
+

[[localize('setup-gcp-create')]]

+
+
+ +
+`; + +// TODO: Delete this card once we have full confidence in the new GCP flow. +const GCP_LEGACY_CARD_HTML = html` + ${GCP_STYLES} +
+
+
[[localize('setup-advanced')]]
+ +
+
Google Cloud Platform
+
+
+
    +
  • [[localize('setup-step-by-step')]]
  • +
  • [[localize('setup-firewall-instructions')]]
  • +
  • [[localize('setup-simple-commands')]]
  • +
+
+
+ +
+`; + +const AWS_CARD_HTML = html` + +
+
+
[[localize('setup-advanced')]]
+ +
+
Amazon Lightsail
+
+
+
    +
  • [[localize('setup-step-by-step')]]
  • +
  • [[localize('setup-firewall-instructions')]]
  • +
  • [[localize('setup-simple-commands')]]
  • +
+
+
+ +
+`; + +const MANUAL_CARD_HTML = html` + +
+
+
[[localize('setup-advanced')]]
+ +
+
[[localize('setup-anywhere')]]
+
+
+
    +
  • [[localize('setup-tested')]]
  • +
  • [[localize('setup-simple-commands')]]
  • +
+
+
+ +
+`; + +Polymer({ + _template: html` + + + + + [[localize('setup-title')]] + [[localize('setup-description')]] + +
+ ${DO_CARD_HTML} ${GCP_CARD_HTML} ${GCP_LEGACY_CARD_HTML} ${AWS_CARD_HTML} ${MANUAL_CARD_HTML} +
+
+ `, + + is: 'outline-intro-step', + + properties: { + digitalOceanAccountName: { + type: String, + value: null, + }, + gcpAccountName: { + type: String, + value: null, + }, + localize: { + type: Function, + }, + }, + + _openLinkFreeTier: '', + _openLinkIpPrice: '', + _openLinkFreeTrial: '', + _closeLink: '', + + _computeIsAccountConnected(accountName: string) { + return Boolean(accountName); + }, + + _showNewGcpFlow(gcpAccountName: string) { + return outline.gcpAuthEnabled || this._computeIsAccountConnected(gcpAccountName); + }, + + connectToDigitalOceanTapped() { + if (this.digitalOceanAccountName) { + this.fire('CreateDigitalOceanServerRequested'); + } else { + this.fire('ConnectDigitalOceanAccountRequested'); + } + }, + + setUpGenericCloudProviderTapped() { + this.fire('SetUpGenericCloudProviderRequested'); + }, + + setUpAwsTapped() { + this.fire('SetUpAwsRequested'); + }, + + setUpGcpTapped() { + if (this.gcpAccountName) { + this.fire('CreateGcpServerRequested'); + } else { + this.fire('ConnectGcpAccountRequested'); + } + }, + + setUpGcpAdvancedTapped() { + this.fire('SetUpGcpRequested'); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-language-picker.ts b/server_manager/web_app/ui_components/outline-language-picker.ts new file mode 100644 index 0000000000..eb46967805 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-language-picker.ts @@ -0,0 +1,99 @@ +/* + Copyright 2018 The Outline Authors + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; +import '@polymer/paper-dropdown-menu/paper-dropdown-menu'; +import '@polymer/paper-listbox/paper-listbox'; +import '@polymer/paper-item/paper-item'; +import '@polymer/iron-icon/iron-icon'; +import '@polymer/iron-icons/iron-icons'; +import './cloud-install-styles'; + +import {html, PolymerElement} from '@polymer/polymer'; +import type {PolymerElementProperties} from '@polymer/polymer/interfaces'; + +export type LanguageDef = { + id: string; + name: string; + dir: 'ltr' | 'rtl'; +}; + +export class OutlineLanguagePicker extends PolymerElement { + static get template() { + return html` + + + + + + `; + } + + static get is() { + return 'outline-language-picker'; + } + + static get properties(): PolymerElementProperties { + return { + selectedLanguage: {type: String}, + languages: {type: Array}, + }; + } + + selectedLanguage = ''; + languages: LanguageDef[] = []; + + _shouldHideCheckmark(language: string, languageCode: string) { + return language !== languageCode; + } + + _languageChanged(event: CustomEvent) { + const languageCode = event.detail.value; + const languageDir = this.languages.find(lang => lang.id === languageCode).dir; + + const params = {bubbles: true, composed: true, detail: {languageCode, languageDir}}; + const customEvent = new CustomEvent('SetLanguageRequested', params); + this.dispatchEvent(customEvent); + } +} + +customElements.define(OutlineLanguagePicker.is, OutlineLanguagePicker); diff --git a/server_manager/web_app/ui_components/outline-manual-server-entry.ts b/server_manager/web_app/ui_components/outline-manual-server-entry.ts new file mode 100644 index 0000000000..e8040406c1 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-manual-server-entry.ts @@ -0,0 +1,491 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; +import '@polymer/iron-collapse/iron-collapse'; +import '@polymer/iron-icon/iron-icon'; +import '@polymer/iron-icons/iron-icons'; +import '@polymer/paper-button/paper-button'; +import '@polymer/paper-dialog/paper-dialog'; +import '@polymer/paper-input/paper-textarea'; +import '@polymer/paper-progress/paper-progress'; +import './cloud-install-styles'; +import './outline-cloud-instructions-view'; +import './outline-step-view'; +import './style.css'; + +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +import type {IronCollapseElement} from '@polymer/iron-collapse/iron-collapse'; +import type {IronIconElement} from '@polymer/iron-icon/iron-icon'; + +export interface OutlineManualServerEntry extends Element { + clear(): void; + retryTapped(): void; + cancelTapped(): void; + cloudProvider: 'generic' | 'aws' | 'gcp'; + enableDoneButton: boolean; + showConnection: boolean; +} + +Polymer({ + _template: html` + + + + [[localize('manual-server-title')]] + [[localize('manual-server-description', 'cloudProvider', cloudProviderName)]] + +
+ +
+
[[localize('experimental')]]
+ [[localize('setup-gcp-promo')]] +
+
+
+ + 1 +
[[localize('gcp-create-server')]]
+ +
+ +
+ +
    +
  1. +
  2. [[localize('gcp-name-your-project')]]
  3. +
  4. [[localize('gcp-click-create')]]
  5. +
+
+
+
+ +
    +
  1. +
  2. [[localize('gcp-firewall-create-1')]]
  3. +
  4. [[localize('gcp-firewall-create-2')]]
  5. +
  6. [[localize('gcp-firewall-create-3')]]
  7. +
  8. [[localize('gcp-firewall-create-4')]]
  9. +
  10. [[localize('gcp-click-create')]]
  11. +
+
+
+
+ +
    +
  1. +
  2. [[localize('gcp-type-outline-server')]]
  3. +
  4. [[localize('gcp-select-region')]]
  5. +
  6. [[localize('gcp-select-machine-type')]]
  7. +
  8. [[localize('gcp-select-networking')]]
  9. +
  10. [[localize('gcp-type-network-tag')]]
  11. +
  12. [[localize('gcp-click-create')]]
  13. +
+
+
+
+
+ +
+
+ 1 +
[[localize('manual-server-firewall')]]
+ +
+ +
+ +
    +
  1. +
  2. [[localize('aws-lightsail-firewall-1')]]
  3. +
  4. [[localize('aws-lightsail-firewall-2')]]
  5. +
  6. [[localize('aws-lightsail-firewall-3')]]
  7. +
  8. [[localize('aws-lightsail-firewall-4')]]
  9. +
  10. [[localize('aws-lightsail-firewall-5')]]
  11. +
+
+
+
+
+ +
+
+ [[installScriptStepNumber]] +
[[localize('manual-server-install-run')]]
+
+
+
+ sudo bash -c "$(wget -qO- + https://raw.githubusercontent.com/Jigsaw-Code/outline-apps/master/server_manager/install_scripts/install_server.sh)" +
+
+
+ +
+
+ [[pasteJsonStepNumber]] +
[[localize('manual-server-install-paste')]]
+
+
+ +
+
+
+ [[localize('cancel')]] + [[localize('done')]] +
+ +
+
+ `, + + is: 'outline-manual-server-entry', + + properties: { + placeholderText: { + type: String, + value: + '{"apiUrl":"https://xxx.xxx.xxx.xxx:xxxxx/xxxxxxxxxxxxxxxxxxxxxx","certSha256":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}', + }, + showConnection: Boolean, + cloudProvider: { + type: String, + value: 'generic', + }, + cloudProviderName: { + type: String, + computed: '_computeCloudProviderName(cloudProvider)', + }, + isCloudProviderAws: { + type: Boolean, + computed: '_computeIsCloudProviderAws(cloudProvider)', + }, + isCloudProviderGcp: { + type: Boolean, + computed: '_computeIsCloudProviderGcp(cloudProvider)', + }, + isGenericCloudProvider: { + type: Boolean, + computed: '_computeIsGenericCloudProvider(cloudProvider)', + }, + installScriptStepNumber: { + type: Number, + computed: '_computeInstallScriptStepNumber(isGenericCloudProvider)', + }, + pasteJsonStepNumber: { + type: Number, + computed: '_computePasteJsonStepNumber(installScriptStepNumber)', + }, + enableDoneButton: { + type: Boolean, + value: false, + }, + localize: { + type: Function, + }, + }, + + doneTapped() { + this.showConnection = true; + this.fire('ManualServerEntered', { + userInput: this.$.serverConfig.value, + }); + }, + + cancelTapped() { + this.fire('ManualServerEntryCancelled'); + }, + + retryTapped() { + this.showConnection = false; + this.doneTapped(); + }, + + gcpNewFlowTapped() { + this.fire('ConnectGcpAccountRequested'); + }, + + clear() { + this.$.serverConfig.value = ''; + this.showConnection = false; + for (const dropdown of this.root.querySelectorAll('.instructions-collapse')) { + dropdown.hide(); + } + }, + + _computeCloudProviderName(cloudProvider: string) { + switch (cloudProvider) { + case 'aws': + return 'Amazon Web Services'; + case 'gcp': + return 'Google Cloud Platform'; + default: + return ''; + } + }, + + _computeIsCloudProviderAws(cloudProvider: string) { + return cloudProvider === 'aws'; + }, + + _computeIsCloudProviderGcp(cloudProvider: string) { + return cloudProvider === 'gcp'; + }, + + _computeIsGenericCloudProvider(cloudProvider: string) { + return cloudProvider === 'generic'; + }, + + _computeInstallScriptStepNumber(isGenericCloudProvider: boolean) { + return isGenericCloudProvider ? 1 : 2; + }, + + _computePasteJsonStepNumber(installScriptStepNumber: number) { + return installScriptStepNumber + 1; + }, + + _toggleAwsDropDown() { + this._toggleDropDown(this.$.awsDropDown, this.$.awsDropDownIcon); + }, + + _toggleGcpFirewallDropDown() { + this._toggleDropDown(this.$.gcpFirewallDropDown, this.$.gcpFirewallDropDownIcon); + }, + + _toggleGcpCreateServerDropDown() { + this._toggleDropDown(this.$.gcpCreateServerDropDown, this.$.gcpCreateServerDropDownIcon); + }, + + _toggleGcpCreateProjectDropDown() { + this._toggleDropDown(this.$.gcpCreateProjectDropDown, this.$.gcpCreateProjectDropDownIcon); + }, + + _toggleDropDown(dropDown: IronCollapseElement, icon: IronIconElement) { + dropDown.toggle(); + icon.icon = dropDown.opened ? 'arrow-drop-up' : 'arrow-drop-down'; + }, + + onServerConfigChanged() { + this.fire('ManualServerEdited', { + userInput: this.$.serverConfig.value, + }); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-metrics-option-dialog.ts b/server_manager/web_app/ui_components/outline-metrics-option-dialog.ts new file mode 100644 index 0000000000..c48dd19dcb --- /dev/null +++ b/server_manager/web_app/ui_components/outline-metrics-option-dialog.ts @@ -0,0 +1,70 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import '@polymer/paper-button/paper-button'; +import '@polymer/paper-dialog/paper-dialog'; +import './cloud-install-styles'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +export interface OutlineMetricsOptionDialog extends Element { + showMetricsOptInDialog(): void; +} + +Polymer({ + _template: html` + + +
+

[[localize('metrics-title')]]

+

+
+ [[localize('metrics-skip')]] + [[localize('metrics-share')]] +
+
+ `, + + is: 'outline-metrics-option-dialog', + + properties: { + localize: { + type: Function, + }, + }, + + showMetricsOptInDialog() { + this.$.metricsEnabledDialog.open(); + }, + + enableMetricsRequested() { + this.fire('EnableMetricsRequested'); + }, + + disableMetricsRequested() { + this.fire('DisableMetricsRequested'); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-modal-dialog.ts b/server_manager/web_app/ui_components/outline-modal-dialog.ts new file mode 100644 index 0000000000..dec422cda0 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-modal-dialog.ts @@ -0,0 +1,82 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/paper-dialog/paper-dialog'; + +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +export interface OutlineModalDialog extends Element { + open(title: string, text: string, buttons: string[]): Promise; + close(): void; +} + +Polymer({ + _template: html` + + + +

[[title]]

+
[[text]]
+

+ +

+
+ `, + + is: 'outline-modal-dialog', + + properties: { + title: String, + text: String, + buttons: Array, + }, + + // Returns a Promise which fulfills with the index of the button clicked. + open(title: string, text: string, buttons: string[]) { + this.title = title; + this.text = text; + this.buttons = buttons; + this.$.dialog.open(); + return new Promise((fulfill, reject) => { + this.fulfill = fulfill; + this.reject = reject; + }); + }, + + close() { + this.$.dialog.close(); + }, + + buttonTapped(event: Event & {model: {index: number}}) { + if (!this.fulfill) { + console.error('outline-modal-dialog: this.fulfill not defined'); + return; + } + this.fulfill(event.model.index); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-per-key-data-limit-dialog.ts b/server_manager/web_app/ui_components/outline-per-key-data-limit-dialog.ts new file mode 100644 index 0000000000..e72ff935b8 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-per-key-data-limit-dialog.ts @@ -0,0 +1,367 @@ +/* + Copyright 2020 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import '@polymer/paper-button/paper-button'; +import '@polymer/paper-checkbox/paper-checkbox'; +import '@polymer/paper-dialog/paper-dialog'; +import '@polymer/paper-dropdown-menu/paper-dropdown-menu'; +import '@polymer/paper-input/paper-input'; +import '@polymer/paper-item/paper-item'; +import '@polymer/paper-listbox/paper-listbox'; + +import {PaperDialogElement} from '@polymer/paper-dialog/paper-dialog'; +import {PaperInputElement} from '@polymer/paper-input/paper-input'; +import {PaperListboxElement} from '@polymer/paper-listbox/paper-listbox'; +import {css, customElement, html, internalProperty, LitElement, property} from 'lit-element'; + +import { + bytesToDisplayDataAmount, + DisplayDataAmount, + displayDataAmountToBytes, + formatBytesParts, +} from '../data_formatting'; + +import {COMMON_STYLES} from './cloud-install-styles'; + +/** + * A floating window representing settings specific to individual access keys. Its state is + * dynamically set when opened using the open() method instead of with any in-HTML attributes. + * + * This element relies on conceptual separation of the data limit as input by the user, the data + * limit of the UI key, and the actual data limit as saved on the server. App controls the UI data + * limit and the request to the server, and the display key in the element is never itself changed. + */ +@customElement('outline-per-key-data-limit-dialog') +export class OutlinePerKeyDataLimitDialog extends LitElement { + static get styles() { + return [ + COMMON_STYLES, + css` + #container { + width: 100%; + display: flex; + flex-flow: column nowrap; + } + + #dataLimitIcon { + /* Split the padding evenly between the icon and the section to be bidirectional. */ + padding: 0 12px; + } + + #headerSection { + display: flex; + flex-direction: row; + padding: 0 12px; + } + + #headerSection h3 { + font-size: 18px; + font-weight: 500; + color: rgba(0, 0, 0, 0.87); + line-height: 24px; + } + + #menuSection { + flex: 1; + padding: 0 78px; + margin-top: 10px; + } + + #buttonsSection { + margin-top: 10px; + display: flex; + flex-direction: row-reverse; + } + + paper-button { + display: flex; + height: 36px; + text-align: center; + } + + #save { + background-color: var(--primary-green); + color: #fff; + } + + #save[disabled] { + color: var(--dark-gray); + background-color: rgba(0, 0, 0, 0.13); + } + + #menu { + display: flex; + flex-flow: row nowrap; + } + + #unitsDropdown { + width: 50px; + padding: 0 10px; + } + + paper-checkbox { + /* We want the ink to be the color we're going to, not coming from */ + --paper-checkbox-checked-color: var(--primary-green); + --paper-checkbox-checked-ink-color: var(--dark-gray); + --paper-checkbox-unchecked-color: var(--dark-gray); + --paper-checkbox-unchecked-ink-color: var(--primary-green); + } + + paper-listbox paper-item:hover { + cursor: pointer; + background-color: var(--background-contrast-color); + color: #fff; + } + `, + ]; + } + + /** + * @member _keyName The displayed name of the UI access key representing the key we're working on. + */ + @internalProperty() _keyName = ''; + /** + * @member _activeDataLimitBytes The data limit, if it exists, on the access key we're working on. + */ + @internalProperty() _initialDataLimitBytes: number = undefined; + /** + * @member _showDataLimit Whether the menu for inputting the data limit should be shown. + * Controlled by the checkbox. + */ + @internalProperty() _showDataLimit = false; + /** + * @member _enableSave Whether the save button is enabled. Controlled by the validator on the + * input. + */ + @internalProperty() _enableSave = false; + + /** + * @member language The ISO 3166-1 alpha-2 language code used for i18n. + */ + @property({type: String}) language = ''; + @property({type: Function}) localize: Function; + + private _onDataLimitSet?: OnSetDataLimitHandler; + private _onDataLimitRemoved?: OnRemoveDataLimitHandler; + + override render() { + return html` + + +
+ +

${this.localize('per-key-data-limit-dialog-title', 'keyName', this._keyName)}

+
+ +
+ ${this.localize('save')} + ${this.localize('cancel')} +
+
+ `; + } + + private renderDataLimit() { + return html` + + `; + } + + private _queryAs(selector: string): T { + return this.shadowRoot.querySelector(selector) as T; + } + + private get _input(): PaperInputElement { + return this._queryAs('#dataLimitInput'); + } + + private _dataLimitValue() { + return Number(this._input?.value) ?? 0; + } + + private _dataLimitUnit(): 'GB' | 'MB' { + return this._queryAs('#unitsListbox').selected as 'GB' | 'MB'; + } + + private _getInternationalizedUnit(bytes: number) { + return formatBytesParts(bytes, this.language).unit; + } + + private _initialUnit(): 'GB' | 'MB' { + return bytesToDisplayDataAmount(this._initialDataLimitBytes)?.unit || 'GB'; + } + + private _initialValue() { + return bytesToDisplayDataAmount(this._initialDataLimitBytes)?.value.toString() || ''; + } + + private async _setCustomLimitTapped() { + this._showDataLimit = !this._showDataLimit; + if (this._showDataLimit) { + await this.updateComplete; + this._input?.focus(); + } + } + + private _setSaveButtonDisabledState() { + this._enableSave = !this._input?.invalid ?? false; + } + + private async _onSaveButtonTapped() { + const change = this._dataLimitChange(); + if (change === Change.UNCHANGED) { + return; + } + const result = + change === Change.SET + ? await this._onDataLimitSet(displayDataAmountToBytes(this.inputDataLimit())) + : await this._onDataLimitRemoved(); + if (result) { + this.close(); + } + } + + /** + * Calculates what type of change, or none at all, the user made. + */ + private _dataLimitChange(): Change { + if (this._showDataLimit) { + if (this._initialDataLimitBytes === undefined) { + // The user must have clicked the checkbox and input a limit. + return Change.SET; + } + const inputLimit = displayDataAmountToBytes(this.inputDataLimit()); + if (inputLimit !== this._initialDataLimitBytes) { + return Change.SET; + } + return Change.UNCHANGED; + } + if (this._initialDataLimitBytes !== undefined) { + // The user must have unchecked the checkbox. + return Change.REMOVED; + } + return Change.UNCHANGED; + } + + /** + * The current data limit as input by the user, but not necessarily as saved. + */ + public inputDataLimit(): DisplayDataAmount { + return this._showDataLimit ? {unit: this._dataLimitUnit(), value: this._dataLimitValue()} : null; + } + + /** + * Opens the dialog to display data limit information about the given key. + * + * @param keyName - The displayed name of the access key. + * @param keyDataLimit - The display data limit of the access key, or undefined. + * @param serverDefaultLimit - The default data limit for the server, or undefined if there is + * none. + * @param language - The app's current language + * @param onDataLimitSet - Callback for when a data limit is imposed. Must return whether or not + * the data limit was set successfully. Must not throw or change the dialog's state. + * @param onDataLimitRemoved - Callback for when a data limit is removed. Must return whether or + * not the data limit was removed successfully. Must not throw or change the dialog's state. + */ + public open( + keyName: string, + keyLimitBytes: number, + onDataLimitSet: OnSetDataLimitHandler, + onDataLimitRemoved: OnRemoveDataLimitHandler + ) { + this._keyName = keyName; + this._initialDataLimitBytes = keyLimitBytes; + this._showDataLimit = this._initialDataLimitBytes !== undefined; + this._onDataLimitSet = onDataLimitSet; + this._onDataLimitRemoved = onDataLimitRemoved; + + this._queryAs('#unitsListbox')?.select(this._initialUnit()); + this._setSaveButtonDisabledState(); + this._queryAs('#container').open(); + } + + private _onDialogOpenedChanged(openedChanged: CustomEvent<{value: boolean}>) { + const dialogWasClosed = !openedChanged.detail.value; + if (dialogWasClosed) { + delete this._onDataLimitSet; + delete this._onDataLimitRemoved; + } + } + + /** + * Closes the dialog. + */ + public close() { + this._queryAs('#container').close(); + } +} + +enum Change { + SET, // A data limit was added or the existing data limit changed + REMOVED, // The data limit for the key was removed + UNCHANGED, // No functional change happened. +} + +type OnSetDataLimitHandler = (dataLimitBytes: number) => Promise; +type OnRemoveDataLimitHandler = () => Promise; diff --git a/server_manager/web_app/ui_components/outline-progress-spinner.ts b/server_manager/web_app/ui_components/outline-progress-spinner.ts new file mode 100644 index 0000000000..804c25543f --- /dev/null +++ b/server_manager/web_app/ui_components/outline-progress-spinner.ts @@ -0,0 +1,82 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +// This is similar to the client's, except this spins endlessly and does not +// support different connection states. +Polymer({ + _template: html` + +
+ + + +
+ `, + + is: 'outline-progress-spinner', +}); diff --git a/server_manager/web_app/ui_components/outline-region-picker-step.ts b/server_manager/web_app/ui_components/outline-region-picker-step.ts new file mode 100644 index 0000000000..1d349efe66 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-region-picker-step.ts @@ -0,0 +1,221 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/paper-button/paper-button'; +import '@polymer/paper-progress/paper-progress'; +import './outline-step-view'; + +import {css, customElement, html, LitElement, property} from 'lit-element'; + +import {COMMON_STYLES} from './cloud-install-styles'; +import {CloudLocationOption} from '../../model/location'; +import {getShortName, localizeCountry} from '../location_formatting'; + +const FLAG_IMAGE_DIR = 'images/flags'; + +// TODO: Reorganize type definitions to improve separation between +// model and view. +export interface RegionPickerOption extends CloudLocationOption { + markedBestValue?: boolean; +} + +@customElement('outline-region-picker-step') +export class OutlineRegionPicker extends LitElement { + @property({type: Array}) options: RegionPickerOption[] = []; + @property({type: Number}) selectedIndex = -1; + @property({type: Boolean}) isServerBeingCreated = false; + @property({type: Function}) localize: (msgId: string, ...params: string[]) => string; + @property({type: String}) language: string; + + static get styles() { + return [ + COMMON_STYLES, + css` + input[type='radio'] { + display: none; + } + input[type='radio']:checked + label.city-button { + background-color: rgba(255, 255, 255, 0.08); + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 1px 3px 0 rgba(0, 0, 0, 0.2); + border-radius: 4px; + border: 2px solid var(--primary-green); + } + input[type='radio'] + label.city-button:hover { + border: 2px solid var(--primary-green); + } + input[type='radio'] + label.city-button { + display: inline-block; + flex: 1; + /* Distribute space evenly, accounting for margins, so there are always 4 cards per row. */ + min-width: calc(25% - 24px); + position: relative; + margin: 4px; + text-align: center; + border: 2px solid rgba(0, 0, 0, 0); + cursor: pointer; + transition: 0.5s; + background: var(--background-contrast-color); + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 1px 3px 0 rgba(0, 0, 0, 0.2); + border-radius: 4px; + } + input[type='radio']:disabled + label.city-button { + /* TODO(alalama): make it look good and indicate disabled */ + filter: blur(2px); + } + .geo-name { + color: var(--light-gray); + font-size: 16px; + line-height: 19px; + } + .country-name { + color: var(--medium-gray); + font-size: 12px; + line-height: 19px; + text-transform: uppercase; + } + paper-button { + background: var(--primary-green); + color: #fff; + text-align: center; + font-size: 14px; + } + .flag { + width: 100%; + height: 100%; + } + .flag-overlay { + display: inline-block; + width: 100px; + height: 100px; + border: 4px solid rgba(255, 255, 255, 0.1); + border-radius: 50%; /* Make a circle */ + position: relative; /* Ensure the gradient uses the correct origin point. */ + margin-bottom: 12px; + } + .flag-overlay::after { + content: ''; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + border-radius: inherit; + background: linear-gradient(to right, rgba(20, 20, 20, 0.2) 0%, rgba(0, 0, 0, 0) 100%); + } + .best-value-label { + background-color: var(--primary-green); + color: #374248; + position: absolute; + top: 117px; + left: 50%; + transform: translate(-50%, 0); + display: flex; + align-items: center; + min-height: 20px; + border-radius: 10px; + padding: 0px 10px 0px 10px; + font-size: 12px; + line-height: 14px; + } + .card-content { + display: flex; + flex-flow: wrap; + padding-top: 24px; + } + label.city-button { + padding: 28px 8px 11px 8px; + } + `, + ]; + } + + render() { + return html` + + ${this.localize('region-title')} + ${this.localize('region-description')} + + + ${this.localize('region-setup')} + + +
+ ${this.options.map((option, index) => { + return html` + `; + })} +
+ ${this.isServerBeingCreated ? html`` : ''} +
+ `; + } + + reset(): void { + this.isServerBeingCreated = false; + this.selectedIndex = -1; + } + + _isCreateButtonEnabled(isCreatingServer: boolean, selectedIndex: number): boolean { + return !isCreatingServer && selectedIndex >= 0; + } + + _locationSelected(event: Event): void { + const inputEl = event.target as HTMLInputElement; + this.selectedIndex = Number.parseInt(inputEl.value, 10); + } + + _flagImage(item: CloudLocationOption): string { + const countryCode = item.cloudLocation.location?.countryCode?.toLowerCase(); + const fileName = countryCode ? `${countryCode}.svg` : 'unknown.png'; + return `${FLAG_IMAGE_DIR}/${fileName}`; + } + + _handleCreateServerTap(): void { + this.isServerBeingCreated = true; + const selectedOption = this.options[this.selectedIndex]; + const params = { + bubbles: true, + composed: true, + detail: {selectedLocation: selectedOption.cloudLocation}, + }; + const customEvent = new CustomEvent('RegionSelected', params); + this.dispatchEvent(customEvent); + } +} diff --git a/server_manager/web_app/ui_components/outline-server-list.ts b/server_manager/web_app/ui_components/outline-server-list.ts new file mode 100644 index 0000000000..b801835e0b --- /dev/null +++ b/server_manager/web_app/ui_components/outline-server-list.ts @@ -0,0 +1,76 @@ +// Copyright 2021 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import './outline-server-view'; + +import {customElement, html, LitElement, property} from 'lit-element'; +import {repeat} from 'lit/directives/repeat.js'; + +import type {DisplayCloudId} from './cloud-assets'; +import type {ServerView} from './outline-server-view'; + +export interface ServerViewListEntry { + id: string; + name: string; + cloudId: DisplayCloudId; +} + +@customElement('outline-server-list') +export class OutlineServerList extends LitElement { + @property({type: Array}) serverList: ServerViewListEntry[]; + @property({type: String}) selectedServerId: string; + @property({type: Function}) localize: Function; + @property({type: String}) language: string; + + render() { + if (!this.serverList) { + return; + } + return html`
+ ${repeat( + this.serverList, + e => e.id, + e => html` + + + ` + )} +
`; + } + + async getServerView(serverId: string): Promise { + if (!serverId) { + return null; + } + // We need to wait updates to be completed or the view may not yet be there. + await this.updateComplete; + const selector = `#${this.makeViewId(serverId)}`; + return this.shadowRoot.querySelector(selector); + } + + // Wrapper to encode a string in base64. This is necessary to set the server view IDs to + // the display server IDs, which are URLs, so they can be used with selector methods. The IDs + // are never decoded. + private makeViewId(serverId: string): string { + return `serverView-${btoa(serverId).replace(/=/g, '')}`; + } +} diff --git a/server_manager/web_app/ui_components/outline-server-progress-step.ts b/server_manager/web_app/ui_components/outline-server-progress-step.ts new file mode 100644 index 0000000000..20ba0cf208 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-server-progress-step.ts @@ -0,0 +1,88 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/paper-progress/paper-progress'; +import '@polymer/paper-button/paper-button'; +import './outline-progress-spinner'; +import './outline-step-view'; +import {css, customElement, html, LitElement, property} from 'lit-element'; +import {COMMON_STYLES} from './cloud-install-styles'; + +@customElement('outline-server-progress-step') +export class OutlineServerProgressStep extends LitElement { + @property({type: String}) serverName: string; + @property({type: Number}) progress = 0; + @property({type: Function}) localize: Function; + + static get styles() { + return [ + COMMON_STYLES, + css` + :host { + text-align: center; + } + .card { + margin-top: 72px; + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.14), 0 2px 2px 0 rgba(0, 0, 0, 0.12), 0 1px 3px 0 rgba(0, 0, 0, 0.2); + border-radius: 2px; + color: var(--light-gray); + background: var(--background-contrast-color); + display: flex; + flex-direction: column; + align-items: center; + } + .servername { + margin: 24px 0 72px 0; + text-align: center; + } + .card p { + font-size: 14px; + color: var(--light-gray); + } + outline-progress-spinner { + margin-top: 72px; + } + paper-button { + width: 100%; + border: 1px solid var(--light-gray); + border-radius: 2px; + color: var(--light-gray); + } + `, + ]; + } + + override render() { + return html` + ${this.localize('setup-do-title')} + ${this.localize('setup-do-description')} + + ${this.localize('cancel')} + +
+ +
+

${this.serverName}

+
+ +
+
`; + } + + private handleCancelTapped() { + // Set event options required to escape the shadow DOM. + this.dispatchEvent(new CustomEvent('CancelServerCreationRequested', {bubbles: true, composed: true})); + } +} diff --git a/server_manager/web_app/ui_components/outline-server-settings-styles.ts b/server_manager/web_app/ui_components/outline-server-settings-styles.ts new file mode 100644 index 0000000000..e0710b8fe1 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-server-settings-styles.ts @@ -0,0 +1,68 @@ +/* + Copyright 2020 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +// outline-server-settings-styles +// This file holds common styles for outline-server-settings and outline-validated-input +const styleElement = document.createElement('dom-module'); +styleElement.appendChild(html` `); + +styleElement.register('outline-server-settings-styles'); diff --git a/server_manager/web_app/ui_components/outline-server-settings.ts b/server_manager/web_app/ui_components/outline-server-settings.ts new file mode 100644 index 0000000000..0f49d64c5e --- /dev/null +++ b/server_manager/web_app/ui_components/outline-server-settings.ts @@ -0,0 +1,501 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import '@polymer/paper-button/paper-button'; +import '@polymer/paper-checkbox/paper-checkbox'; +import '@polymer/paper-dropdown-menu/paper-dropdown-menu'; +import '@polymer/paper-input/paper-input'; +import './cloud-install-styles'; +import './outline-server-settings-styles'; +import './outline-iconset'; +import './outline-validated-input'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +import {formatBytesParts} from '../data_formatting'; +import {getCloudName, getCloudIcon} from './cloud-assets'; +import {getShortName} from '../location_formatting'; + +export interface OutlineServerSettings extends Element { + setServerName(name: string): void; +} + +Polymer({ + _template: html` + + + +
+
+ +
+ +
+

[[_getCloudName(cloudId)]]

+ + + +
+
+
+ +
+

[[localize('settings-server-info')]]

+ + +

[[localize('settings-server-rename')]]

+ + + + + + [[localize('management-api-documentation')]] + + + + + + +
+
+ +
+ +
+
+
+

[[localize('data-limits')]]

+

[[localize('data-limits-description')]]

+
+ + + + [[localize('enabled')]] + [[localize('disabled')]] + + +
+
+ +

+
+
+ + + + [[_getInternationalizedUnit(1000000, language)]] + [[_getInternationalizedUnit(1000000000, language)]] + + +
+
+
+ +
+ +
+

[[localize('experiments')]]

+

[[localize('experiments-description')]]

+
+ +

+
+
+
+ +
+ +
+
+ +

[[localize('settings-metrics-header')]]

+
+

+
+
+
+
+ `, + + is: 'outline-server-settings', + + properties: { + serverName: String, + metricsEnabled: Boolean, + // Initialize to null so we can use the hidden attribute, which does not work well with + // undefined values. + metricsId: {type: String, value: null}, + serverHostname: {type: String, value: null}, + serverManagementApiUrl: {type: String, value: null}, + serverPortForNewAccessKeys: {type: Number, value: null}, + serverVersion: {type: String, value: null}, + isAccessKeyPortEditable: {type: Boolean, value: false}, + isDefaultDataLimitEnabled: {type: Boolean, notify: true}, + defaultDataLimit: {type: Object, value: null}, // type: app.DisplayDataAmount + supportsDefaultDataLimit: {type: Boolean, value: false}, // Whether the server supports default data limits. + showFeatureMetricsDisclaimer: {type: Boolean, value: false}, + isHostnameEditable: {type: Boolean, value: true}, + serverCreationDate: {type: Date, value: '1970-01-01T00:00:00.000Z'}, + cloudLocation: {type: Object, value: null}, + cloudId: {type: String, value: null}, + serverMonthlyCost: {type: String, value: null}, + serverMonthlyTransferLimit: {type: String, value: null}, + language: {type: String, value: 'en'}, + localize: {type: Function}, + shouldShowExperiments: {type: Boolean, value: false}, + }, + + setServerName(name: string) { + this.initialName = name; + this.name = name; + }, + + _handleNameInputKeyDown(event: KeyboardEvent) { + if (event.key === 'Escape') { + this.serverName = this.initialName; + this.$.serverNameInput.blur(); + } else if (event.key === 'Enter') { + this.$.serverNameInput.blur(); + } + }, + + _handleNameInputBlur(_event: FocusEvent) { + const newName = this.serverName; + if (!newName) { + this.serverName = this.initialName; + return; + } + // Fire signal if name has changed. + if (newName !== this.initialName) { + this.fire('ServerRenameRequested', {newName}); + } + }, + + _metricsEnabledChanged() { + const metricsSignal = this.metricsEnabled ? 'EnableMetricsRequested' : 'DisableMetricsRequested'; + this.fire(metricsSignal); + }, + + _defaultDataLimitEnabledChanged(e: CustomEvent) { + if (e.detail?.value === undefined) { + return; + } + const enableDataLimit = e.detail.value === 'enabled'; + if (this.isDefaultDataLimitEnabled === enableDataLimit) { + return; + } + this.isDefaultDataLimitEnabled = enableDataLimit; + if (enableDataLimit) { + this._requestSetDefaultDataLimit(); + } else { + this.fire('RemoveDefaultDataLimitRequested'); + } + }, + + _handleDefaultDataLimitInputKeyDown(event: KeyboardEvent) { + if (event.key === 'Escape') { + this.$.defaultDataLimitInput.value = this.defaultDataLimit.value; + this.$.defaultDataLimitInput.blur(); + } else if (event.key === 'Enter') { + this.$.defaultDataLimitInput.blur(); + } + }, + + _requestSetDefaultDataLimit() { + if (this.$.defaultDataLimitInput.invalid) { + return; + } + const value = Number(this.$.defaultDataLimitInput.value); + const unit = this.$.defaultDataLimitUnits.selected; + this.fire('SetDefaultDataLimitRequested', {limit: {value, unit}}); + }, + + _computeDataLimitsEnabledName(isDefaultDataLimitEnabled: boolean) { + return isDefaultDataLimitEnabled ? 'enabled' : 'disabled'; + }, + + _validatePort(value: string) { + const port = Number(value); + const valid = !Number.isNaN(port) && port >= 1 && port <= 65535 && Number.isInteger(port); + return valid ? '' : this.localize('error-keys-port-bad-input'); + }, + + _getShortName: getShortName, + _getCloudIcon: getCloudIcon, + _getCloudName: getCloudName, + + _getInternationalizedUnit(bytesAmount: number, language: string) { + return formatBytesParts(bytesAmount, language).unit; + }, + + _formatDate(language: string, date: Date) { + return date.toLocaleString(language, {year: 'numeric', month: 'long', day: 'numeric'}); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-server-view.ts b/server_manager/web_app/ui_components/outline-server-view.ts new file mode 100644 index 0000000000..ce04aebac5 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-server-view.ts @@ -0,0 +1,1102 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/paper-dialog/paper-dialog'; +import '@polymer/iron-icons/iron-icons'; +import '@polymer/iron-pages/iron-pages'; +import '@polymer/iron-icons/editor-icons'; +import '@polymer/iron-icons/social-icons'; +import '@polymer/paper-icon-button/paper-icon-button'; +import '@polymer/paper-item/paper-item'; +import '@polymer/paper-listbox/paper-listbox'; +import '@polymer/paper-menu-button/paper-menu-button'; +import '@polymer/paper-progress/paper-progress'; +import '@polymer/paper-tabs/paper-tabs'; +import '@polymer/paper-tooltip/paper-tooltip'; +import './cloud-install-styles'; +import './outline-iconset'; +import './outline-help-bubble'; +import './outline-metrics-option-dialog'; +import './outline-server-progress-step'; +import './outline-server-settings'; +import './outline-share-dialog'; +import './outline-sort-span'; +import {html, PolymerElement} from '@polymer/polymer'; +import {DirMixin} from '@polymer/polymer/lib/mixins/dir-mixin'; + +import * as formatting from '../data_formatting'; +import {getShortName} from '../location_formatting'; +import {getCloudIcon} from './cloud-assets'; + +import type {PolymerElementProperties} from '@polymer/polymer/interfaces'; +import type {DomRepeat} from '@polymer/polymer/lib/elements/dom-repeat'; +import type {CloudLocation} from '../../model/location'; +import type {AccessKeyId} from '../../model/server'; +import type {OutlineHelpBubble} from './outline-help-bubble'; +import type {OutlineServerSettings} from './outline-server-settings'; + +export const MY_CONNECTION_USER_ID = '0'; + +const progressBarMaxWidthPx = 72; + +// Makes an CustomEvent that bubbles up beyond the shadow root. +function makePublicEvent(eventName: string, detail?: object) { + const params: CustomEventInit = {bubbles: true, composed: true}; + if (detail !== undefined) { + params.detail = detail; + } + return new CustomEvent(eventName, params); +} + +function compare(a: T, b: T): -1 | 0 | 1 { + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } + return 0; +} + +interface KeyRowEvent extends Event { + model: {index: number; item: DisplayAccessKey}; +} + +/** + * Allows using an optional number as a boolean value without 0 being falsey. + * @returns True if x is neither null nor undefined + */ +function exists(x: number): boolean { + return x !== null && x !== undefined; +} + +/** An access key to be displayed */ +export type DisplayAccessKey = { + id: string; + placeholderName: string; + name: string; + accessUrl: string; + transferredBytes: number; + /** The data limit assigned to the key, if it exists. */ + dataLimitBytes?: number; + dataLimit?: formatting.DisplayDataAmount; +}; + +export class ServerView extends DirMixin(PolymerElement) { + static get template() { + return html` + + + +
+ + +
${this.unreachableViewTemplate}
+
${this.managementViewTemplate}
+
+
+ + + +

[[localize('server-help-connection-title')]]

+

[[localize('server-help-connection-description')]]

+ [[localize('server-help-connection-ok')]] +
+ + +

[[localize('server-help-access-key-title')]]

+

[[localize('server-help-access-key-description')]]

+ [[localize('server-help-access-key-next')]] +
+ +

[[localize('data-limits-dialog-title')]]

+

[[localize('data-limits-dialog-text')]]

+ [[localize('ok')]] +
+ `; + } + + static get unreachableViewTemplate() { + return html`
+
+

[[serverName]]

+
+
+
+ +

[[localize('server-unreachable')]]

+

+
[[localize('server-unreachable-description')]]
+ [[localize('server-unreachable-managed-description')]] + [[localize('server-unreachable-manual-description')]] +
+ [[localize('server-remove')]] + [[localize('server-destroy')]] + [[localize('retry')]] +
+
`; + } + + static get managementViewTemplate() { + return html`
+
+

[[serverName]]

+ + + + + [[localize('server-destroy')]] + + + [[localize('server-remove')]] + + + +
+
[[getShortName(cloudLocation, localize)]]
+
+
+
+ + [[localize('server-connections')]] + [[localize('server-settings')]] + +
+ +
+
+
+ +
+

[[_formatInboundBytesValue(totalInboundBytes, language)]]

+

[[_formatInboundBytesUnit(totalInboundBytes, language)]]

+
+

[[localize('server-data-transfer')]]

+
+
+
+ +
+
+

[[_computeManagedServerUtilizationPercentage(totalInboundBytes, monthlyOutboundTransferBytes)]]

+

/[[_formatBytesTransferred(monthlyOutboundTransferBytes, language)]]

+
+

[[localize('server-data-used')]]

+
+
+ +
+

[[accessKeyRows.length]]

+

[[localize('server-keys')]]

+
+

[[localize('server-access')]]

+
+
+ +
+ +
+ + [[localize('server-access-keys')]] + + + [[localize('server-usage')]] + + +
+
+ + +
+ +
+ + +
[[localize('server-access-key-new')]]
+
+
+
+
+
+ + +
+
`; + } + + static get is() { + return 'outline-server-view'; + } + + static get properties(): PolymerElementProperties { + return { + metricsId: String, + serverId: String, + serverName: String, + serverHostname: String, + serverVersion: String, + isHostnameEditable: Boolean, + serverManagementApiUrl: String, + serverPortForNewAccessKeys: Number, + isAccessKeyPortEditable: Boolean, + serverCreationDate: Date, + cloudLocation: Object, + cloudId: String, + defaultDataLimitBytes: Number, + isDefaultDataLimitEnabled: Boolean, + supportsDefaultDataLimit: Boolean, + showFeatureMetricsDisclaimer: Boolean, + installProgress: Number, + isServerReachable: Boolean, + retryDisplayingServer: Function, + totalInboundBytes: Number, + baselineDataTransfer: Number, + accessKeyRows: Array, + hasNonAdminAccessKeys: Boolean, + metricsEnabled: Boolean, + monthlyOutboundTransferBytes: Number, + monthlyCost: Number, + accessKeySortBy: String, + accessKeySortDirection: Number, + language: String, + localize: Function, + selectedPage: String, + selectedTab: String, + }; + } + + static get observers() { + return ['_accessKeysAddedOrRemoved(accessKeyRows.splices)']; + } + + serverId = ''; + metricsId = ''; + serverName = ''; + serverHostname = ''; + serverVersion = ''; + isHostnameEditable = false; + serverManagementApiUrl = ''; + serverPortForNewAccessKeys: number = null; + isAccessKeyPortEditable = false; + serverCreationDate = new Date(0); + cloudLocation: CloudLocation = null; + cloudId = ''; + readonly getShortName = getShortName; + readonly getCloudIcon = getCloudIcon; + defaultDataLimitBytes: number = null; + isDefaultDataLimitEnabled = false; + hasPerKeyDataLimitDialog = false; + /** Whether the server supports default data limits. */ + supportsDefaultDataLimit = false; + showFeatureMetricsDisclaimer = false; + installProgress = 0; + isServerReachable = false; + /** Callback for retrying to display an unreachable server. */ + retryDisplayingServer: () => void = null; + totalInboundBytes = 0; + /** The number to which access key transfer amounts are compared for progress bar display */ + baselineDataTransfer = Number.POSITIVE_INFINITY; + accessKeyRows: DisplayAccessKey[] = []; + hasNonAdminAccessKeys = false; + metricsEnabled = false; + // Initialize monthlyOutboundTransferBytes and monthlyCost to 0, so they can + // be bound to hidden attributes. Initializing to undefined does not + // cause hidden$=... expressions to be evaluated and so elements may be + // shown incorrectly. See: + // https://stackoverflow.com/questions/33700125/polymer-1-0-hidden-attribute-negate-operator + // https://www.polymer-project.org/1.0/docs/devguide/data-binding.html + monthlyOutboundTransferBytes = 0; + monthlyCost = 0; + accessKeySortBy = 'name'; + /** The direction to sort: 1 == ascending, -1 == descending */ + accessKeySortDirection: -1 | 1 = 1; + language = 'en'; + localize: (msgId: string, ...params: string[]) => string = null; + selectedPage: 'progressView' | 'unreachableView' | 'managementView' = 'managementView'; + selectedTab: 'connections' | 'settings' = 'connections'; + + addAccessKey(accessKey: DisplayAccessKey) { + // TODO(fortuna): Restore loading animation. + // TODO(fortuna): Restore highlighting. + this.push('accessKeyRows', accessKey); + // Force render the access key list so that the input is present in the DOM + this.$.accessKeysContainer.querySelector('dom-repeat').render(); + const input = this.shadowRoot.querySelector(`#access-key-${accessKey.id}`); + input.select(); + } + + removeAccessKey(accessKeyId: string) { + for (let ui = 0; ui < this.accessKeyRows.length; ui++) { + if (this.accessKeyRows[ui].id === accessKeyId) { + this.splice('accessKeyRows', ui, 1); + return; + } + } + } + + updateAccessKeyRow(accessKeyId: string, fields: object) { + let newAccessKeyRow; + for (const accessKeyRowIndex in this.accessKeyRows) { + if (this.accessKeyRows[accessKeyRowIndex].id === accessKeyId) { + newAccessKeyRow = Object.assign({}, this.get(['accessKeyRows', accessKeyRowIndex]), fields); + this.set(['accessKeyRows', accessKeyRowIndex], newAccessKeyRow); + return; + } + } + } + + // Help bubbles should be shown after this outline-server-view + // is on the screen (e.g. selected in iron-pages). If help bubbles + // are initialized before this point, setPosition will not work and + // they will appear in the top left of the view. + showGetConnectedHelpBubble() { + return this._showHelpBubble('getConnectedHelpBubble', 'accessKeysContainer'); + } + + showAddAccessKeyHelpBubble() { + return this._showHelpBubble('addAccessKeyHelpBubble', 'addAccessKeyRow', 'down', 'left'); + } + + showDataLimitsHelpBubble() { + return this._showHelpBubble('dataLimitsHelpBubble', 'settingsTab', 'up', 'right'); + } + + /** Returns the UI access key with the given ID. */ + findUiKey(id: AccessKeyId): DisplayAccessKey { + return this.accessKeyRows.find(key => key.id === id); + } + + _closeAddAccessKeyHelpBubble() { + (this.$.addAccessKeyHelpBubble as OutlineHelpBubble).hide(); + } + + _closeGetConnectedHelpBubble() { + (this.$.getConnectedHelpBubble as OutlineHelpBubble).hide(); + } + + _closeDataLimitsHelpBubble() { + (this.$.dataLimitsHelpBubble as OutlineHelpBubble).hide(); + } + + _handleAddAccessKeyPressed() { + this.dispatchEvent(makePublicEvent('AddAccessKeyRequested')); + (this.$.addAccessKeyHelpBubble as OutlineHelpBubble).hide(); + } + + _handleNameInputKeyDown(event: KeyRowEvent & KeyboardEvent) { + const input = event.target as HTMLInputElement; + if (event.key === 'Escape') { + const accessKey = event.model.item; + input.value = accessKey.name; + input.blur(); + } else if (event.key === 'Enter') { + input.blur(); + } + } + + _handleNameInputBlur(event: KeyRowEvent & FocusEvent) { + const input = event.target as HTMLInputElement; + const accessKey = event.model.item; + const displayName = input.value; + if (displayName === accessKey.name) { + return; + } + input.disabled = true; + this.dispatchEvent( + makePublicEvent('RenameAccessKeyRequested', { + accessKeyId: accessKey.id, + newName: displayName, + entry: { + commitName: () => { + input.disabled = false; + // Update accessKeyRows so the UI is updated. + this.accessKeyRows = this.accessKeyRows.map(row => { + if (row.id !== accessKey.id) { + return row; + } + return {...row, name: displayName}; + }); + }, + revertName: () => { + input.value = accessKey.name; + input.disabled = false; + }, + }, + }) + ); + } + + _handleShowPerKeyDataLimitDialogPressed(event: KeyRowEvent) { + const accessKey = event.model?.item; + const keyId = accessKey.id; + const keyDataLimitBytes = accessKey.dataLimitBytes; + const keyName = accessKey.name || accessKey.placeholderName; + const defaultDataLimitBytes = this.isDefaultDataLimitEnabled ? this.defaultDataLimitBytes : undefined; + const serverId = this.serverId; + this.dispatchEvent( + makePublicEvent('OpenPerKeyDataLimitDialogRequested', { + keyId, + keyDataLimitBytes, + keyName, + serverId, + defaultDataLimitBytes, + }) + ); + } + + _handleRenameAccessKeyPressed(event: KeyRowEvent) { + const input = this.$.accessKeysContainer.querySelectorAll( + '.access-key-row .access-key-container > input' + )[event.model.index]; + // This needs to be deferred because the closing menu messes up with the focus. + window.setTimeout(() => { + input.focus(); + }, 0); + } + + _handleShareCodePressed(event: KeyRowEvent) { + const accessKey = event.model.item; + this.dispatchEvent(makePublicEvent('OpenShareDialogRequested', {accessKey: accessKey.accessUrl})); + } + + _handleRemoveAccessKeyPressed(e: KeyRowEvent) { + const accessKey = e.model.item; + this.dispatchEvent(makePublicEvent('RemoveAccessKeyRequested', {accessKeyId: accessKey.id})); + } + + _formatDataLimitForKey(key: DisplayAccessKey, language: string, localize: Function) { + return this._formatDisplayDataLimit(this._activeDataLimitForKey(key), language, localize); + } + + _computeDisplayDataLimit(limit?: number) { + return formatting.bytesToDisplayDataAmount(limit); + } + + _formatDisplayDataLimit(limit: number, language: string, localize: Function) { + return exists(limit) ? formatting.formatBytes(limit, language) : localize('no-data-limit'); + } + + _formatInboundBytesUnit(totalBytes: number, language: string) { + // This happens during app startup before we set the language + if (!language) { + return ''; + } + return formatting.formatBytesParts(totalBytes, language).unit; + } + + _formatInboundBytesValue(totalBytes: number, language: string) { + // This happens during app startup before we set the language + if (!language) { + return ''; + } + return formatting.formatBytesParts(totalBytes, language).value; + } + + _formatBytesTransferred(numBytes: number, language: string, emptyValue = '') { + if (!numBytes) { + // numBytes may not be set for manual servers, or may be 0 for + // unused access keys. + return emptyValue; + } + return formatting.formatBytes(numBytes, language); + } + + _formatMonthlyCost(monthlyCost: number, language: string) { + if (!monthlyCost) { + return ''; + } + return new Intl.NumberFormat(language, { + style: 'currency', + currency: 'USD', + currencyDisplay: 'code', + }).format(monthlyCost); + } + + _computeManagedServerUtilizationPercentage(numBytes: number, monthlyLimitBytes: number) { + let utilizationPercentage = 0; + if (monthlyLimitBytes && numBytes) { + utilizationPercentage = Math.round((numBytes / monthlyLimitBytes) * 100); + } + if (document.documentElement.dir === 'rtl') { + return `%${utilizationPercentage}`; + } + return `${utilizationPercentage}%`; + } + + _accessKeysAddedOrRemoved(_changeRecord: unknown) { + // Check for user key and regular access keys. + let hasNonAdminAccessKeys = true; + for (const ui in this.accessKeyRows) { + if (this.accessKeyRows[ui].id === MY_CONNECTION_USER_ID) { + hasNonAdminAccessKeys = false; + break; + } + } + this.hasNonAdminAccessKeys = hasNonAdminAccessKeys; + } + + _selectedTabChanged() { + if (this.selectedTab === 'settings') { + this._closeAddAccessKeyHelpBubble(); + this._closeGetConnectedHelpBubble(); + this._closeDataLimitsHelpBubble(); + (this.$.serverSettings as OutlineServerSettings).setServerName(this.serverName); + } + } + + _showHelpBubble(helpBubbleId: string, positionTargetId: string, arrowDirection = 'down', arrowAlignment = 'right') { + return new Promise(resolve => { + const helpBubble = this.$[helpBubbleId] as OutlineHelpBubble; + helpBubble.show(this.$[positionTargetId], arrowDirection, arrowAlignment); + helpBubble.addEventListener('outline-help-bubble-dismissed', resolve); + }); + } + + isRegularConnection(item: DisplayAccessKey) { + return item.id !== MY_CONNECTION_USER_ID; + } + + _computeColumnDirection(columnName: string, accessKeySortBy: string, accessKeySortDirection: -1 | 1) { + if (columnName === accessKeySortBy) { + return accessKeySortDirection; + } + return 0; + } + + _setSortByOrToggleDirection(e: MouseEvent) { + const element = e.target as HTMLElement; + const sortBy = element.dataset.sortBy; + if (this.accessKeySortBy !== sortBy) { + this.accessKeySortBy = sortBy; + this.accessKeySortDirection = sortBy === 'usage' ? -1 : 1; + } else { + this.accessKeySortDirection *= -1; + } + } + + _sortAccessKeys(accessKeySortBy: string, accessKeySortDirection: -1 | 1) { + if (accessKeySortBy === 'usage') { + return (a: DisplayAccessKey, b: DisplayAccessKey) => { + return (a.transferredBytes - b.transferredBytes) * accessKeySortDirection; + }; + } + // Default to sorting by name. + return (a: DisplayAccessKey, b: DisplayAccessKey) => { + if (a.name && b.name) { + return compare(a.name.toUpperCase(), b.name.toUpperCase()) * accessKeySortDirection; + } else if (a.name) { + return -1; + } else if (b.name) { + return 1; + } else { + return 0; + } + }; + } + + destroyServer() { + this.dispatchEvent(makePublicEvent('DeleteServerRequested', {serverId: this.serverId})); + } + + removeServer() { + this.dispatchEvent(makePublicEvent('ForgetServerRequested', {serverId: this.serverId})); + } + + _isServerManaged(cloudId: string) { + return !!cloudId; + } + + _activeDataLimitForKey(accessKey?: DisplayAccessKey): number { + if (!accessKey) { + // We're in app startup + return null; + } + + if (exists(accessKey.dataLimitBytes)) { + return accessKey.dataLimitBytes; + } + + return this.isDefaultDataLimitEnabled ? this.defaultDataLimitBytes : null; + } + + _computePaperProgressClass(accessKey: DisplayAccessKey) { + return exists(this._activeDataLimitForKey(accessKey)) ? 'data-limits' : ''; + } + + _getRelevantTransferAmountForKey(accessKey: DisplayAccessKey) { + if (!accessKey) { + // We're in app startup + return null; + } + const activeLimit = this._activeDataLimitForKey(accessKey); + return exists(activeLimit) ? activeLimit : accessKey.transferredBytes; + } + + _computeProgressWidthStyling(accessKey: DisplayAccessKey, baselineDataTransfer: number) { + const relativeTransfer = this._getRelevantTransferAmountForKey(accessKey); + const width = Math.floor((progressBarMaxWidthPx * relativeTransfer) / baselineDataTransfer); + // It's important that there's no space in between width and "px" in order for Chrome to accept + // the inline style string. + return `width: ${width}px;`; + } + + _getDataLimitsUsageString(accessKey: DisplayAccessKey, language: string, localize: Function) { + if (!accessKey) { + // We're in app startup + return ''; + } + + const activeDataLimit = this._activeDataLimitForKey(accessKey); + const used = this._formatBytesTransferred(accessKey.transferredBytes, language, '0'); + const total = this._formatDisplayDataLimit(activeDataLimit, language, localize); + return localize('data-limits-usage', 'used', used, 'total', total); + } +} + +customElements.define(ServerView.is, ServerView); diff --git a/server_manager/web_app/ui_components/outline-share-dialog.ts b/server_manager/web_app/ui_components/outline-share-dialog.ts new file mode 100644 index 0000000000..57d7d897da --- /dev/null +++ b/server_manager/web_app/ui_components/outline-share-dialog.ts @@ -0,0 +1,172 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/paper-dialog/paper-dialog'; + +import '@polymer/paper-dialog-scrollable/paper-dialog-scrollable'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; +import * as clipboard from 'clipboard-polyfill'; + +export interface OutlineShareDialog extends Element { + open(accessKey: string, s3url: string): void; +} + +// TODO(alalama): add a language selector. This should be a separate instance of +// Polymer.AppLocalizeBehavior so the app language is not changed. Consider refactoring l10n into a +// separate Polymer behavior. +Polymer({ + _template: html` + + + +
+

[[localize('share-title')]]

+

+
+
+ +
+ [[localize('share-invite-copy')]] +
+ + + +
+ [[localize('share-invite-copy-access-key')]] + [[localize('done')]] +
+
+ `, + + is: 'outline-share-dialog', + + properties: { + localize: {type: Function}, + }, + + open(accessKey: string, s3Url: string) { + this.accessKey = accessKey; + this.s3Url = s3Url; + this.$.copyInvitationIndicator.setAttribute('hidden', true); + this.$.copyAccessKeyIndicator.setAttribute('hidden', true); + this.$.dialog.open(); + }, + + copyInvite() { + const dt = new clipboard.DT(); + dt.setData('text/plain', this.$.selectableInviteText.innerText); + dt.setData('text/html', this.$.selectableInviteText.innerHTML); + clipboard.write(dt); + this.$.copyInvitationIndicator.removeAttribute('hidden'); + }, + + copyAccessKey() { + const dt = new clipboard.DT(); + dt.setData('text/plain', this.$.selectableAccessKey.innerText); + dt.setData('text/html', this.$.selectableAccessKey.innerHTML); + clipboard.write(dt); + this.$.copyAccessKeyIndicator.removeAttribute('hidden'); + }, +}); diff --git a/server_manager/web_app/ui_components/outline-sort-span.ts b/server_manager/web_app/ui_components/outline-sort-span.ts new file mode 100644 index 0000000000..46ef01bcae --- /dev/null +++ b/server_manager/web_app/ui_components/outline-sort-span.ts @@ -0,0 +1,47 @@ +// Copyright 2020 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import '@polymer/iron-icon/iron-icon'; +import '@polymer/iron-icons/iron-icons'; + +import {css, html, LitElement, PropertyDeclarations} from 'lit-element'; + +export class SortSpan extends LitElement { + static get styles() { + return css` + :host { + display: inline-block; + cursor: pointer; + user-select: none; + } + `; + } + static get properties(): PropertyDeclarations { + return {direction: {type: Number}}; + } + + direction: -1 | 0 | 1 = 0; + + override render() { + let arrow = html``; + if (this.direction === -1) { + arrow = html``; + } else if (this.direction === 1) { + arrow = html``; + } + return html`${arrow}`; + } +} + +customElements.define('outline-sort-span', SortSpan); diff --git a/server_manager/web_app/ui_components/outline-step-view.ts b/server_manager/web_app/ui_components/outline-step-view.ts new file mode 100644 index 0000000000..10a56bb837 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-step-view.ts @@ -0,0 +1,80 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/polymer/polymer-legacy'; + +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; +Polymer({ + _template: html` + +
+
+
+
+
+
+
+
+ +
+ `, + + is: 'outline-step-view', + + properties: { + displayAction: { + type: Boolean, + value: false, + }, + }, +}); diff --git a/server_manager/web_app/ui_components/outline-survey-dialog.ts b/server_manager/web_app/ui_components/outline-survey-dialog.ts new file mode 100644 index 0000000000..823dbcc600 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-survey-dialog.ts @@ -0,0 +1,129 @@ +/* + Copyright 2020 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import '@polymer/neon-animation/animations/slide-down-animation'; +import '@polymer/neon-animation/animations/slide-from-bottom-animation'; +import '@polymer/paper-button/paper-button'; +import '@polymer/paper-dialog/paper-dialog'; + +import {DirMixin} from '@polymer/polymer/lib/mixins/dir-mixin'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; +import {PolymerElement} from '@polymer/polymer/polymer-element'; + +import type {PolymerElementProperties} from '@polymer/polymer/interfaces'; +import type {PaperDialogElement} from '@polymer/paper-dialog/paper-dialog'; + +class OutlineSurveyDialog extends DirMixin(PolymerElement) { + static get template() { + return html` + + + +
+ +
+

[[title]]

+
+ [[localize('survey-decline')]] + + [[localize('survey-go-to-survey')]] + +
+
+
+
+
+

[[localize('survey-disclaimer')]]

+
+
+ `; + } + + static get is() { + return 'outline-survey-dialog'; + } + + static get properties(): PolymerElementProperties { + return { + localize: Function, + surveyLink: String, + title: String, + }; + } + + surveyLink: string; + + open(title: string, surveyLink: string) { + this.title = title; + this.surveyLink = surveyLink; + const dialog = this.$.dialog as PaperDialogElement; + dialog.horizontalAlign = this.dir === 'ltr' ? 'left' : 'right'; + dialog.open(); + } +} +customElements.define(OutlineSurveyDialog.is, OutlineSurveyDialog); diff --git a/server_manager/web_app/ui_components/outline-tos-view.ts b/server_manager/web_app/ui_components/outline-tos-view.ts new file mode 100644 index 0000000000..454f39ff96 --- /dev/null +++ b/server_manager/web_app/ui_components/outline-tos-view.ts @@ -0,0 +1,80 @@ +/* + Copyright 2018 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; + +import {html} from '@polymer/polymer/lib/utils/html-tag'; +Polymer({ + _template: html` + + +
+ +
+
+ + [[localize('okay')]] +
+ `, + + is: 'outline-tos-view', + + properties: { + hasAcceptedTermsOfService: { + type: Boolean, + value: false, + notify: true, + }, + localize: { + type: Function, + }, + }, + + acceptTermsOfService() { + this.hasAcceptedTermsOfService = true; + }, +}); diff --git a/server_manager/web_app/ui_components/outline-validated-input.ts b/server_manager/web_app/ui_components/outline-validated-input.ts new file mode 100644 index 0000000000..2900ee540e --- /dev/null +++ b/server_manager/web_app/ui_components/outline-validated-input.ts @@ -0,0 +1,212 @@ +/* + Copyright 2020 The Outline Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import './cloud-install-styles'; + +import './outline-server-settings-styles'; +import {Polymer} from '@polymer/polymer/lib/legacy/polymer-fn'; +import {html} from '@polymer/polymer/lib/utils/html-tag'; + +// outline-validated-input +// This is an input, with a cancel and a save button, which performs client-side validation and has +// an event-based hook for server-side evaluation. +// +// Attributes: +// * editable: Is this input editable? Default: false +// * visible: Is this input visible? Default: false +// * label: The label for the input. Default: null +// * value: The initial value entered in the input. SHOULD be a valid value. Default: null +// * allowed-pattern: Regex describing what inputs are allowed. Users will be prevented from +// entering inputs which don't follow the pattern. Default: ".*" +// * max-length: The number of characters allowed in the input. Default: Number.POSITIVE_INFINITY +// * client-side-validator: A function which takes a string and returns either an empty string on +// success or an error message on failure. This function will be called on every keystroke. +// Default: () => "" +// * event: The name of the event fired when the save button is tapped. Passes the current input +// value as "value" and the Polymer object as "ui". The handler for this event MUST call +// ui.setSavedState() or ui.setErrorState(message) depending on its result. Default: null +Polymer({ + _template: html` + + + +
+ + + + + [[localize('cancel')]] + + + [[localize('save')]] + +
+ `, + + is: 'outline-validated-input', + + properties: { + // Properties affecting the whole element + editable: {type: Boolean, value: false}, + visible: {type: Boolean, value: false}, + // Properties affecting the input + label: {type: String, value: null}, + allowedPattern: {type: String, value: '.*'}, + maxLength: {type: Number, value: Number.POSITIVE_INFINITY}, + value: {type: String, value: null}, + // `value` here is evaluated. If it were simply `() => "`, then clientSideValidator + // would default to just "", not a function returning "". + // Note also that we can't use paper-input's validator attribute because it will fight + // with any server-side validation and cause unpredictable results. + clientSideValidator: { + type: Function, + value: () => { + return () => ''; + }, + }, + // Properties affecting the buttons + _showButtons: {type: Boolean, value: false}, + _enableButtons: {type: Boolean, value: false}, + // Other properties + event: {type: String, value: null}, + localize: {type: Function}, + }, + + _onKeyUp(e: KeyboardEvent) { + const input = this.$.input; + if (e.key === 'Escape') { + this._cancel(); + input.blur(); + return; + } else if (e.key === 'Enter') { + if (!input.invalid) { + this._save(); + input.blur(); + } + return; + } + const validationError = this.clientSideValidator(input.value); + if (validationError) { + input.invalid = true; + this.$.saveButton.disabled = true; + input.errorMessage = validationError; + } else { + input.invalid = false; + this.$.saveButton.disabled = false; + } + }, + + _cancel() { + const input = this.$.input; + input.value = this.value; + input.invalid = false; + this._showButtons = false; + }, + + _save() { + const input = this.$.input; + const value = input.value; + if (value === this.value) { + this._cancel(); + return; + } + this.$.cancelButton.disabled = true; + this.$.saveButton.disabled = true; + input.readonly = true; + input.invalid = false; + + // We use this heuristic to avoid having to pass a constructor as an attribute + const numberValue = Number(value); + const typedValue = Number.isNaN(numberValue) ? value : numberValue; + + this.fire(this.event, { + validatedInput: typedValue, + ui: this, + }); + }, + + _enterEditingState() { + if (!this.editable) { + return; + } + this._showButtons = true; + this.$.cancelButton.disabled = false; + this.$.saveButton.disabled = this.$.input.invalid; + }, + + enterSavedState() { + const input = this.$.input; + this.value = input.value; + this._showButtons = false; + input.readonly = false; + }, + + enterErrorState(message: string) { + const input = this.$.input; + this._enableButtons = true; + input.errorMessage = message; + input.invalid = true; + input.readonly = false; + input.focus(); + }, +}); diff --git a/server_manager/web_app/ui_components/style.css b/server_manager/web_app/ui_components/style.css new file mode 100644 index 0000000000..3b6a2381fc --- /dev/null +++ b/server_manager/web_app/ui_components/style.css @@ -0,0 +1,144 @@ +/* + * Copyright 2018 The Outline Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Copy of style.css with changes for new Cloud Installation Page */ + +/* If Polymer fails to load, this prevents the styles in elements + from being erroneously displayed to the user. */ +core-style { + display: none; +} + +paper-dropdown { + box-shadow: 0px 0px 20px #999999; +} + +/* Show gray background when a dialog is opened */ +core-overlay-layer.core-opened { + background-color: rgba(0, 0, 0, 0.5); + width: 100%; + height: 100%; +} + +html, +body { + height: 100%; + margin: 0; + padding: 0; + background-color: #263238; +} + +body { + font-family: "Roboto", sans-serif; + font-size: 14px; + font-weight: 400; + color: rgba(0, 0, 0, 0.54); + -webkit-font-smoothing: antialiased; +} + +div#wrapper { + min-height: 100%; + display: flex; + display: -webkit-flex; + flex-direction: column; + -webkit-flex-direction: column; +} + +section:not(#header):not(:last-of-type) { + border-bottom: 1px solid #eee; + padding: 100px 40px; +} + +@media screen and (max-width: 630px) { + section:not(#header):not(:last-of-type) { + padding: 70px 40px; + } +} + +section:last-of-type { + border-bottom: none; + padding: 100px 40px 0; +} + +/* headings */ + +h1, +h2, +h3, +h4 { + color: rgba(0, 0, 0, 0.87); + line-height: 1.5em; +} + +h1 { + font-size: 40px; + padding-top: 12px; + margin-bottom: 17px; +} + +h2 { + font-weight: 500; + font-size: 16px; +} + +h3 { + font-weight: 400; + line-height: 28px; + font-size: 16px; + margin: 0px 0px 14px 0px; + padding: 14px 12% 32px 12%; +} + +h3 span { + font-weight: 500; +} + +h4 { + font-size: 14px; + font-weight: 500; +} + +/* normal text and links */ +p { + color: var(--medium-gray); + font-size: 14px; + line-height: 1.5em; +} + +a { + text-decoration: none; +} + +a:hover { + color: #00ac9b; +} + +p a { + color: #808080; +} + +/* pre */ +pre { + font-family: monospace; +} + +paper-menu { + white-space: nowrap; +} + +paper-progress { + border-radius: 2px; +} diff --git a/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj b/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj index d2e873ee72..cdea364310 100755 --- a/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj +++ b/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj @@ -940,7 +940,7 @@ GCC_THUMB_SUPPORT = NO; GCC_VERSION = ""; INFOPLIST_FILE = "Outline/Outline-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.outline.ios.client; @@ -987,7 +987,7 @@ GCC_THUMB_SUPPORT = NO; GCC_VERSION = ""; INFOPLIST_FILE = "Outline/Outline-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = org.outline.ios.client; @@ -1391,7 +1391,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1435,7 +1435,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; SDKROOT = iphoneos; SKIP_INSTALL = NO; diff --git a/src/cordova/apple/xcode/ios/Outline/Outline.entitlements b/src/cordova/apple/xcode/ios/Outline/Outline.entitlements index 27ff72cb3a..9d88e9d506 100644 --- a/src/cordova/apple/xcode/ios/Outline/Outline.entitlements +++ b/src/cordova/apple/xcode/ios/Outline/Outline.entitlements @@ -11,7 +11,6 @@ com.apple.security.application-groups group.org.outline.ios.client - $(TeamIdentifierPrefix)org.outline.macos.client com.apple.security.network.client diff --git a/src/cordova/apple/xcode/ios/Outline/VpnExtension.entitlements b/src/cordova/apple/xcode/ios/Outline/VpnExtension.entitlements index a11fc88663..fb4bf1a906 100644 --- a/src/cordova/apple/xcode/ios/Outline/VpnExtension.entitlements +++ b/src/cordova/apple/xcode/ios/Outline/VpnExtension.entitlements @@ -11,7 +11,6 @@ com.apple.security.application-groups group.org.outline.ios.client - $(TeamIdentifierPrefix)org.outline.macos.client com.apple.security.network.client diff --git a/src/cordova/apple/xcode/ios/OutlineLauncher/OutlineLauncher.entitlements b/src/cordova/apple/xcode/ios/OutlineLauncher/OutlineLauncher.entitlements index bd0f317586..90b496c7de 100644 --- a/src/cordova/apple/xcode/ios/OutlineLauncher/OutlineLauncher.entitlements +++ b/src/cordova/apple/xcode/ios/OutlineLauncher/OutlineLauncher.entitlements @@ -8,10 +8,6 @@ com.apple.security.app-sandbox - com.apple.security.application-groups - - $(TeamIdentifierPrefix)org.outline.macos.client - com.apple.security.files.user-selected.read-only diff --git a/src/cordova/apple/xcode/macos/Outline/Classes/AppDelegate.m b/src/cordova/apple/xcode/macos/Outline/Classes/AppDelegate.m index 2769ab4012..e8665261d9 100644 --- a/src/cordova/apple/xcode/macos/Outline/Classes/AppDelegate.m +++ b/src/cordova/apple/xcode/macos/Outline/Classes/AppDelegate.m @@ -85,16 +85,10 @@ - (void)applicationDidFinishLaunching:(NSNotification*)aNotification { self.statusItem.button.action = @selector(togglePopover); [self setAppIcon:@"StatusBarButtonImage"]; self.popover = [[NSPopover alloc] init]; + self.popover.behavior = NSPopoverBehaviorTransient; self.popover.contentViewController = [[NSViewController alloc] initWithNibName:@"MainViewController" bundle:[NSBundle mainBundle]]; self.popover.contentViewController.view = self.window.contentView; - // Monitor clicks outside the popover in order to close it. - NSEventMask eventMask = NSEventMaskLeftMouseDown|NSEventMaskRightMouseDown; - self.eventMonitor = [[EventMonitor alloc] initWithMask:eventMask handler:^(NSEvent* event) { - if (self.popover.isShown) { - [self closePopover]; - } - }]; if ([self wasStartedByLauncherApp]) { [OutlineVpn.shared startLastSuccessfulTunnel:^(enum ErrorCode errorCode) { @@ -103,7 +97,16 @@ - (void)applicationDidFinishLaunching:(NSNotification*)aNotification { } }]; } else { - [self showPopover]; + // The rendering of the popover is relative to the app's status item in the status bar. + // Even though we've already created the status bar above, the popover is being created + // before the status item has been rendered in the UI. This causes the initial popover + // load to be "floating" and ends up aligned at the bottom of the screen. For this initial + // load we add a small artificial delay to prevent that from happening. + double delayInSeconds = 0.5; + dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); + dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ + [self showPopover]; + }); } [self setAppLauncherEnabled:true]; // Enable app launcher to start on boot. } diff --git a/src/electron/custom_install_steps.nsh b/src/electron/custom_install_steps.nsh index 4ca378065d..3f106efcd6 100755 --- a/src/electron/custom_install_steps.nsh +++ b/src/electron/custom_install_steps.nsh @@ -1,170 +1,170 @@ -; Copyright 2018 The Outline Authors -; -; Licensed under the Apache License, Version 2.0 (the "License"); -; you may not use this file except in compliance with the License. -; You may obtain a copy of the License at -; -; http://www.apache.org/licenses/LICENSE-2.0 -; -; Unless required by applicable law or agreed to in writing, software -; distributed under the License is distributed on an "AS IS" BASIS, -; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -; See the License for the specific language governing permissions and -; limitations under the License. - -!include StrFunc.nsh -!include WinVer.nsh -!include x64.nsh - -!include env.nsh - -; StrFunc weirdness; this fix suggested here: -; https://github.com/electron-userland/electron-builder/issues/888 -!ifndef BUILD_UNINSTALLER -${StrLoc} -${StrNSISToIO} -${StrRep} -!endif - -!macro customInstall - ; Normally, because we mark the installer binary as requiring administrator permissions, the - ; installer will be running with administrator permissions at this point. The exception is when - ; the system is running with the *lowest* (least safe) UAC setting in which case the installer - ; can progress to this point without administrator permissions. - ; - ; If that's the case, exit now so we don't waste time to trying to install the TAP device, etc. - ; Additionally, the client can detect their absence and prompt the user to reinstall. - ; - ; The returned value does *not* seem to be based on the user's current diaplay language. - UserInfo::GetAccountType - Pop $0 - StrCmp $0 "Admin" isadmin - MessageBox MB_OK "Sorry, Outline requires administrator permissions." - Quit - - isadmin: - - ; TAP device files. - SetOutPath "$INSTDIR\tap-windows6" - ${If} ${RunningX64} - File /r "${PROJECT_DIR}\third_party\tap-windows6\bin\amd64\*" - ${Else} - File /r "${PROJECT_DIR}\third_party\tap-windows6\bin\i386\*" - ${EndIf} - SetOutPath - - File "${PROJECT_DIR}\src\electron\add_tap_device.bat" - File "${PROJECT_DIR}\src\electron\find_tap_device_name.bat" - - ; OutlineService files, stopping the service first in case it's still running. - nsExec::Exec "$SYSDIR\net stop OutlineService" - File "${PROJECT_DIR}\tools\OutlineService\OutlineService\bin\OutlineService.exe" - File "${PROJECT_DIR}\tools\smartdnsblock\bin\smartdnsblock.exe" - File "${PROJECT_DIR}\third_party\newtonsoft\Newtonsoft.Json.dll" - File "${PROJECT_DIR}\src\electron\install_windows_service.bat" - - ; ExecToStack captures both stdout and stderr from the script, in the order output. - ; Set a (long) timeout in case the device never becomes visible to netsh. - ReadEnvStr $0 COMSPEC - nsExec::ExecToStack /timeout=180000 '$0 /c add_tap_device.bat' - - Pop $0 - Pop $1 - StrCmp $0 0 installservice - - ; The TAP device may have failed to install because the user did not want to - ; install the device driver. If so: - ; - tell the user that they need to install the driver - ; - skip the Sentry report - ; - quit - ; - ; When this happens, tapinstall.exe prints an error message like this: - ; UpdateDriverForPlugAndPlayDevices failed, GetLastError=-536870333 - ; - ; We can use the presence of that magic number to detect this case. - Var /GLOBAL DRIVER_FAILURE_MAGIC_NUMBER_INDEX - ${StrLoc} $DRIVER_FAILURE_MAGIC_NUMBER_INDEX $1 "536870333" ">" - - StrCmp $DRIVER_FAILURE_MAGIC_NUMBER_INDEX "" submitsentryreport - ; The term "device software" is the same as that used by the prompt, at least on Windows 7. - MessageBox MB_OK "Sorry, you must install the device software in order to use Outline. Please try \ - running the installer again." - Quit - - submitsentryreport: - MessageBox MB_OK "Sorry, we could not configure your system to connect to Outline. Please try \ - running the installer again. If you still cannot install Outline, please get in \ - touch with us and let us know that the TAP device failed to install with error code $0." - - ; Submit a Sentry error event. - ; - ; This will get bundled into an issue named "could not install TAP device" with the following - ; attributes: - ; - a single breadcrumb containing the output of add_tap_device.bat - ; - Windows version, as a tag named "os" with a value identical in most cases to what the - ; JavaScript Sentry client produces, e.g. "Windows 10.0.17134" - ; - client version - ; - ; Note: - ; - Sentry won't accept a breadcrumbs without a timestamp; fortunately, it accepts obviously - ; bogus values so we don't have to fetch the real time. - ; - Because nsExec::ExecToStack yields "NSIS strings" strings suitable for inclusion in, for - ; example, a MessageBox, e.g. "device not found$\ncommand failed", we must convert it to a - ; string that Sentry will like *and* can fit on one line, e.g. - ; "device not found\ncommand failed"; fortunately, StrFunc.nsh's StrNSISToIO does precisely - ; this. - ; - RELEASE and SENTRY_URL are defined in env.nsh which is generated at build time by - ; {package,release}_action.sh. - - ; TODO: Remove this once we figure out why/if breadcrumbs are being truncated. - Var /GLOBAL FAILURE_MESSAGE_LENGTH - StrLen $FAILURE_MESSAGE_LENGTH $1 - - ; http://nsis.sourceforge.net/Docs/StrFunc/StrFunc.txt - Var /GLOBAL FAILURE_MESSAGE - ${StrNSISToIO} $FAILURE_MESSAGE $1 - ${StrRep} $FAILURE_MESSAGE $FAILURE_MESSAGE '"' '\"' - - ${WinVerGetMajor} $R0 - ${WinVerGetMinor} $R1 - ${WinVerGetBuild} $R2 - - ; http://nsis.sourceforge.net/Inetc_plug-in#post - inetc::post '{\ - "message":"could not install TAP device ($0)",\ - "release":"${RELEASE}",\ - "tags":[\ - ["os", "Windows $R0.$R1.$R2"],\ - ["error_message_length", "$FAILURE_MESSAGE_LENGTH"]\ - ],\ - "breadcrumbs":[\ - {"timestamp":1, "message":"$FAILURE_MESSAGE"}\ - ]\ - }' /TOSTACK ${SENTRY_URL} /END - - Quit - - installservice: - - nsExec::Exec install_windows_service.bat - - nsExec::Exec "$SYSDIR\sc query OutlineService" - Pop $0 - StrCmp $0 0 success - ; TODO: Trigger a Sentry report for service installation failure, too, and revisit - ; the restart stuff in the TypeScript code. - MessageBox MB_OK "Sorry, we could not configure your system to connect to Outline. Please try \ - running the installer again. If you still cannot install Outline, please get in touch with us \ - and let us know that OutlineService failed to install." - Quit - - success: - -!macroend - -; TODO: Remove the TAP device on uninstall. This is impossible to implement safely -; with the bundled tapinstall.exe because it can only remove *all* devices -; having hwid tap0901 and these may include non-Outline devices. -!macro customUnInstall - nsExec::Exec "$SYSDIR\net stop OutlineService" - nsExec::Exec "$SYSDIR\sc delete OutlineService" -!macroend +; Copyright 2018 The Outline Authors +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. + +!include StrFunc.nsh +!include WinVer.nsh +!include x64.nsh + +!include env.nsh + +; StrFunc weirdness; this fix suggested here: +; https://github.com/electron-userland/electron-builder/issues/888 +!ifndef BUILD_UNINSTALLER +${StrLoc} +${StrNSISToIO} +${StrRep} +!endif + +!macro customInstall + ; Normally, because we mark the installer binary as requiring administrator permissions, the + ; installer will be running with administrator permissions at this point. The exception is when + ; the system is running with the *lowest* (least safe) UAC setting in which case the installer + ; can progress to this point without administrator permissions. + ; + ; If that's the case, exit now so we don't waste time to trying to install the TAP device, etc. + ; Additionally, the client can detect their absence and prompt the user to reinstall. + ; + ; The returned value does *not* seem to be based on the user's current diaplay language. + UserInfo::GetAccountType + Pop $0 + StrCmp $0 "Admin" isadmin + MessageBox MB_OK "Sorry, Outline requires administrator permissions." + Quit + + isadmin: + + ; TAP device files. + SetOutPath "$INSTDIR\tap-windows6" + ${If} ${RunningX64} + File /r "${PROJECT_DIR}\third_party\tap-windows6\bin\amd64\*" + ${Else} + File /r "${PROJECT_DIR}\third_party\tap-windows6\bin\i386\*" + ${EndIf} + SetOutPath - + File "${PROJECT_DIR}\src\electron\add_tap_device.bat" + File "${PROJECT_DIR}\src\electron\find_tap_device_name.bat" + + ; OutlineService files, stopping the service first in case it's still running. + nsExec::Exec "$SYSDIR\net stop OutlineService" + File "${PROJECT_DIR}\tools\OutlineService\OutlineService\bin\OutlineService.exe" + File "${PROJECT_DIR}\tools\smartdnsblock\bin\smartdnsblock.exe" + File "${PROJECT_DIR}\third_party\newtonsoft\Newtonsoft.Json.dll" + File "${PROJECT_DIR}\src\electron\install_windows_service.bat" + + ; ExecToStack captures both stdout and stderr from the script, in the order output. + ; Set a (long) timeout in case the device never becomes visible to netsh. + ReadEnvStr $0 COMSPEC + nsExec::ExecToStack /timeout=180000 '$0 /c add_tap_device.bat' + + Pop $0 + Pop $1 + StrCmp $0 0 installservice + + ; The TAP device may have failed to install because the user did not want to + ; install the device driver. If so: + ; - tell the user that they need to install the driver + ; - skip the Sentry report + ; - quit + ; + ; When this happens, tapinstall.exe prints an error message like this: + ; UpdateDriverForPlugAndPlayDevices failed, GetLastError=-536870333 + ; + ; We can use the presence of that magic number to detect this case. + Var /GLOBAL DRIVER_FAILURE_MAGIC_NUMBER_INDEX + ${StrLoc} $DRIVER_FAILURE_MAGIC_NUMBER_INDEX $1 "536870333" ">" + + StrCmp $DRIVER_FAILURE_MAGIC_NUMBER_INDEX "" submitsentryreport + ; The term "device software" is the same as that used by the prompt, at least on Windows 7. + MessageBox MB_OK "Sorry, you must install the device software in order to use Outline. Please try \ + running the installer again." + Quit + + submitsentryreport: + MessageBox MB_OK "Sorry, we could not configure your system to connect to Outline. Please try \ + running the installer again. If you still cannot install Outline, please get in \ + touch with us and let us know that the TAP device failed to install with error code $0." + + ; Submit a Sentry error event. + ; + ; This will get bundled into an issue named "could not install TAP device" with the following + ; attributes: + ; - a single breadcrumb containing the output of add_tap_device.bat + ; - Windows version, as a tag named "os" with a value identical in most cases to what the + ; JavaScript Sentry client produces, e.g. "Windows 10.0.17134" + ; - client version + ; + ; Note: + ; - Sentry won't accept a breadcrumbs without a timestamp; fortunately, it accepts obviously + ; bogus values so we don't have to fetch the real time. + ; - Because nsExec::ExecToStack yields "NSIS strings" strings suitable for inclusion in, for + ; example, a MessageBox, e.g. "device not found$\ncommand failed", we must convert it to a + ; string that Sentry will like *and* can fit on one line, e.g. + ; "device not found\ncommand failed"; fortunately, StrFunc.nsh's StrNSISToIO does precisely + ; this. + ; - RELEASE and SENTRY_URL are defined in env.nsh which is generated at build time by + ; {package,release}_action.sh. + + ; TODO: Remove this once we figure out why/if breadcrumbs are being truncated. + Var /GLOBAL FAILURE_MESSAGE_LENGTH + StrLen $FAILURE_MESSAGE_LENGTH $1 + + ; http://nsis.sourceforge.net/Docs/StrFunc/StrFunc.txt + Var /GLOBAL FAILURE_MESSAGE + ${StrNSISToIO} $FAILURE_MESSAGE $1 + ${StrRep} $FAILURE_MESSAGE $FAILURE_MESSAGE '"' '\"' + + ${WinVerGetMajor} $R0 + ${WinVerGetMinor} $R1 + ${WinVerGetBuild} $R2 + + ; http://nsis.sourceforge.net/Inetc_plug-in#post + inetc::post '{\ + "message":"could not install TAP device ($0)",\ + "release":"${RELEASE}",\ + "tags":[\ + ["os", "Windows $R0.$R1.$R2"],\ + ["error_message_length", "$FAILURE_MESSAGE_LENGTH"]\ + ],\ + "breadcrumbs":[\ + {"timestamp":1, "message":"$FAILURE_MESSAGE"}\ + ]\ + }' /TOSTACK ${SENTRY_URL} /END + + Quit + + installservice: + + nsExec::Exec install_windows_service.bat + + nsExec::Exec "$SYSDIR\sc query OutlineService" + Pop $0 + StrCmp $0 0 success + ; TODO: Trigger a Sentry report for service installation failure, too, and revisit + ; the restart stuff in the TypeScript code. + MessageBox MB_OK "Sorry, we could not configure your system to connect to Outline. Please try \ + running the installer again. If you still cannot install Outline, please get in touch with us \ + and let us know that OutlineService failed to install." + Quit + + success: + +!macroend + +; TODO: Remove the TAP device on uninstall. This is impossible to implement safely +; with the bundled tapinstall.exe because it can only remove *all* devices +; having hwid tap0901 and these may include non-Outline devices. +!macro customUnInstall + nsExec::Exec "$SYSDIR\net stop OutlineService" + nsExec::Exec "$SYSDIR\sc delete OutlineService" +!macroend diff --git a/src/www/ui_components/app-root.js b/src/www/ui_components/app-root.js index f836ef8b41..17c43a4762 100644 --- a/src/www/ui_components/app-root.js +++ b/src/www/ui_components/app-root.js @@ -616,7 +616,7 @@ export class AppRoot extends mixinBehaviors([AppLocalizeBehavior], PolymerElemen contactViewFeatureFlag: { type: Boolean, readonly: true, - value: false, + value: true, }, }; } diff --git a/src/www/views/servers_view/server_list/index.ts b/src/www/views/servers_view/server_list/index.ts index 763fcde7e2..c15a2020bd 100644 --- a/src/www/views/servers_view/server_list/index.ts +++ b/src/www/views/servers_view/server_list/index.ts @@ -11,64 +11,54 @@ limitations under the License. */ -import {computed, customElement, property} from '@polymer/decorators'; -import {html, PolymerElement} from '@polymer/polymer'; +import {css, html, LitElement} from 'lit'; +import {customElement, property} from 'lit/decorators.js'; import '../server_list_item/server_card'; import {ServerListItem} from '../server_list_item'; import {Localizer} from 'src/infrastructure/i18n'; @customElement('server-list') -export class ServerList extends PolymerElement { - static get template() { - return html` - + server-hero-card { + height: 500px; + } + `, + ]; - - - `; - } - - // Need to declare localize function passed in from parent, or else - // localize() calls within the template won't be updated. - - // @polymer/decorators doesn't support Function constructors... - @property({type: Object}) localize: Localizer; + @property({type: Function}) localize: Localizer = msg => msg; @property({type: Array}) servers: ServerListItem[] = []; - @computed('servers') - get hasSingleServer() { - return this.servers.length === 1; + render() { + if (this.hasSingleServer) { + return html``; + } else { + return html` + ${this.servers.map( + server => html`` + )} + `; + } } - getErrorMessage(errorMessageId: string) { - if (typeof errorMessageId === 'string') { - return this.localize(errorMessageId); - } + private get hasSingleServer() { + return this.servers.length === 1; } } diff --git a/third_party/newtonsoft/LICENSE b/third_party/newtonsoft/LICENSE index 05bc493e4d..ed11c37a1a 100755 --- a/third_party/newtonsoft/LICENSE +++ b/third_party/newtonsoft/LICENSE @@ -1,9 +1,9 @@ -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/third_party/newtonsoft/METADATA b/third_party/newtonsoft/METADATA index cd5e964139..f43a7d6df0 100755 --- a/third_party/newtonsoft/METADATA +++ b/third_party/newtonsoft/METADATA @@ -1,16 +1,16 @@ -name: "Newtonsoft.Json" -description: - "Json.NET is a high-performance JSON framework for .NET." - -third_party { - url { - type: HOMEPAGE - value: "https://www.newtonsoft.com/json" - } - url { - type: GIT - value: "https://github.com/JamesNK/Newtonsoft.Json" - } - version: "11.0.0" - last_upgrade_date { year: 2018 month: 6 day: 26 } -} +name: "Newtonsoft.Json" +description: + "Json.NET is a high-performance JSON framework for .NET." + +third_party { + url { + type: HOMEPAGE + value: "https://www.newtonsoft.com/json" + } + url { + type: GIT + value: "https://github.com/JamesNK/Newtonsoft.Json" + } + version: "11.0.0" + last_upgrade_date { year: 2018 month: 6 day: 26 } +} diff --git a/third_party/tap-windows6/.gitignore b/third_party/tap-windows6/.gitignore index feb9211635..c84d745040 100644 --- a/third_party/tap-windows6/.gitignore +++ b/third_party/tap-windows6/.gitignore @@ -1,10 +1,10 @@ -dist/** -*.pyc -*.tar.gz -src/config.h -src/SOURCES -src/build*.log -src/obj* -src/i386 -src/amd64 -tap-windows-*.exe +dist/** +*.pyc +*.tar.gz +src/config.h +src/SOURCES +src/build*.log +src/obj* +src/i386 +src/amd64 +tap-windows-*.exe diff --git a/third_party/tap-windows6/bin/amd64/OemVista.inf b/third_party/tap-windows6/bin/amd64/OemVista.inf index 628a2158be..d92e2558b3 100644 --- a/third_party/tap-windows6/bin/amd64/OemVista.inf +++ b/third_party/tap-windows6/bin/amd64/OemVista.inf @@ -1,191 +1,191 @@ -; **************************************************************************** -; * Copyright (C) 2002-2014 OpenVPN Technologies, Inc. * -; * This program is free software; you can redistribute it and/or modify * -; * it under the terms of the GNU General Public License version 2 * -; * as published by the Free Software Foundation. * -; **************************************************************************** - -; SYNTAX CHECKER -; cd \WINDDK\3790\tools\chkinf -; chkinf c:\src\openvpn\tap-win32\i386\oemvista.inf -; OUTPUT -> file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm - -; INSTALL/REMOVE DRIVER -; tapinstall install OemVista.inf tapoas -; tapinstall update OemVista.inf tapoas -; tapinstall remove tapoas - -;********************************************************* -; Note to Developers: -; -; If you are bundling the TAP-Windows driver with your app, -; you should try to rename it in such a way that it will -; not collide with other instances of TAP-Windows defined -; by other apps. Multiple versions of the TAP-Windows -; driver, each installed by different apps, can coexist -; on the same machine if you follow these guidelines. -; NOTE: these instructions assume you are editing the -; generated OemWin2k.inf file, not the source -; OemWin2k.inf.in file which is preprocessed by winconfig -; and uses macro definitions from settings.in. -; -; (1) Rename all tapXXXX instances in this file to -; something different (use at least 5 characters -; for this name!) -; (2) Change the "!define TAP" definition in openvpn.nsi -; to match what you changed tapXXXX to. -; (3) Change TARGETNAME in SOURCES to match what you -; changed tapXXXX to. -; (4) Change TAP_COMPONENT_ID in common.h to match what -; you changed tapXXXX to. -; (5) Change SZDEPENDENCIES in service.h to match what -; you changed tapXXXX to. -; (6) Change DeviceDescription and Provider strings. -; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you -; set DeviceDescription to. -; -;********************************************************* - -[Version] - Signature = "$Windows NT$" - CatalogFile = tap0901.cat - ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} - Provider = %Provider% - Class = Net - -; This version number should match the version -; number given in SOURCES. - DriverVer=04/21/2016,9.00.00.21 - -[Strings] - DeviceDescription = "TAP-Windows Adapter V9" - Provider = "TAP-Windows Provider V9" - -;---------------------------------------------------------------- -; Manufacturer + Product Section (Done) -;---------------------------------------------------------------- -[Manufacturer] - %Provider% = tap0901, NTamd64 - -[tap0901.NTamd64] - %DeviceDescription% = tap0901.ndi, root\tap0901 ; Root enumerated - %DeviceDescription% = tap0901.ndi, tap0901 ; Legacy - -;--------------------------------------------------------------- -; Driver Section (Done) -;--------------------------------------------------------------- - -;----------------- Characteristics ------------ -; NCF_PHYSICAL = 0x04 -; NCF_VIRTUAL = 0x01 -; NCF_SOFTWARE_ENUMERATED = 0x02 -; NCF_HIDDEN = 0x08 -; NCF_NO_SERVICE = 0x10 -; NCF_HAS_UI = 0x80 -;----------------- Characteristics ------------ - -[tap0901.ndi] - CopyFiles = tap0901.driver, tap0901.files - AddReg = tap0901.reg - AddReg = tap0901.params.reg - Characteristics = - *IfType = 0x6 ; IF_TYPE_ETHERNET_CSMACD - *MediaType = 0x0 ; NdisMedium802_3 - *PhysicalMediaType = 14 ; NdisPhysicalMedium802_3 - -[tap0901.ndi.Services] - AddService = tap0901, 2, tap0901.service - -[tap0901.reg] - HKR, Ndi, Service, 0, "tap0901" - HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" - HKR, Ndi\Interfaces, LowerRange, 0, "ethernet" - HKR, , Manufacturer, 0, "%Provider%" - HKR, , ProductName, 0, "%DeviceDescription%" - -[tap0901.params.reg] - HKR, Ndi\params\MTU, ParamDesc, 0, "MTU" - HKR, Ndi\params\MTU, Type, 0, "int" - HKR, Ndi\params\MTU, Default, 0, "1500" - HKR, Ndi\params\MTU, Optional, 0, "0" - HKR, Ndi\params\MTU, Min, 0, "100" - HKR, Ndi\params\MTU, Max, 0, "1500" - HKR, Ndi\params\MTU, Step, 0, "1" - HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status" - HKR, Ndi\params\MediaStatus, Type, 0, "enum" - HKR, Ndi\params\MediaStatus, Default, 0, "0" - HKR, Ndi\params\MediaStatus, Optional, 0, "0" - HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled" - HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected" - HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address" - HKR, Ndi\params\MAC, Type, 0, "edit" - HKR, Ndi\params\MAC, Optional, 0, "1" - HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access" - HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum" - HKR, Ndi\params\AllowNonAdmin, Default, 0, "1" - HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0" - HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed" - HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed" - -;---------------------------------------------------------------- -; Service Section -;---------------------------------------------------------------- - -;---------- Service Type ------------- -; SERVICE_KERNEL_DRIVER = 0x01 -; SERVICE_WIN32_OWN_PROCESS = 0x10 -;---------- Service Type ------------- - -;---------- Start Mode --------------- -; SERVICE_BOOT_START = 0x0 -; SERVICE_SYSTEM_START = 0x1 -; SERVICE_AUTO_START = 0x2 -; SERVICE_DEMAND_START = 0x3 -; SERVICE_DISABLED = 0x4 -;---------- Start Mode --------------- - -[tap0901.service] - DisplayName = %DeviceDescription% - ServiceType = 1 - StartType = 3 - ErrorControl = 1 - LoadOrderGroup = NDIS - ServiceBinary = %12%\tap0901.sys - -;----------------------------------------------------------------- -; File Installation -;----------------------------------------------------------------- - -;----------------- Copy Flags ------------ -; COPYFLG_NOSKIP = 0x02 -; COPYFLG_NOVERSIONCHECK = 0x04 -;----------------- Copy Flags ------------ - -; SourceDisksNames -; diskid = description[, [tagfile] [, , subdir]] -; 1 = "Intel Driver Disk 1",e100bex.sys,, - -[SourceDisksNames] - 1 = %DeviceDescription%, tap0901.sys - -; SourceDisksFiles -; filename_on_source = diskID[, [subdir][, size]] -; e100bex.sys = 1,, ; on distribution disk 1 - -[SourceDisksFiles] -tap0901.sys = 1 - -[DestinationDirs] - tap0901.files = 11 - tap0901.driver = 12 - -[tap0901.files] -; TapPanel.cpl,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK -; cipsrvr.exe,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK - -[tap0901.driver] - tap0901.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK - -;--------------------------------------------------------------- -; End -;--------------------------------------------------------------- +; **************************************************************************** +; * Copyright (C) 2002-2014 OpenVPN Technologies, Inc. * +; * This program is free software; you can redistribute it and/or modify * +; * it under the terms of the GNU General Public License version 2 * +; * as published by the Free Software Foundation. * +; **************************************************************************** + +; SYNTAX CHECKER +; cd \WINDDK\3790\tools\chkinf +; chkinf c:\src\openvpn\tap-win32\i386\oemvista.inf +; OUTPUT -> file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm + +; INSTALL/REMOVE DRIVER +; tapinstall install OemVista.inf tapoas +; tapinstall update OemVista.inf tapoas +; tapinstall remove tapoas + +;********************************************************* +; Note to Developers: +; +; If you are bundling the TAP-Windows driver with your app, +; you should try to rename it in such a way that it will +; not collide with other instances of TAP-Windows defined +; by other apps. Multiple versions of the TAP-Windows +; driver, each installed by different apps, can coexist +; on the same machine if you follow these guidelines. +; NOTE: these instructions assume you are editing the +; generated OemWin2k.inf file, not the source +; OemWin2k.inf.in file which is preprocessed by winconfig +; and uses macro definitions from settings.in. +; +; (1) Rename all tapXXXX instances in this file to +; something different (use at least 5 characters +; for this name!) +; (2) Change the "!define TAP" definition in openvpn.nsi +; to match what you changed tapXXXX to. +; (3) Change TARGETNAME in SOURCES to match what you +; changed tapXXXX to. +; (4) Change TAP_COMPONENT_ID in common.h to match what +; you changed tapXXXX to. +; (5) Change SZDEPENDENCIES in service.h to match what +; you changed tapXXXX to. +; (6) Change DeviceDescription and Provider strings. +; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you +; set DeviceDescription to. +; +;********************************************************* + +[Version] + Signature = "$Windows NT$" + CatalogFile = tap0901.cat + ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} + Provider = %Provider% + Class = Net + +; This version number should match the version +; number given in SOURCES. + DriverVer=04/21/2016,9.00.00.21 + +[Strings] + DeviceDescription = "TAP-Windows Adapter V9" + Provider = "TAP-Windows Provider V9" + +;---------------------------------------------------------------- +; Manufacturer + Product Section (Done) +;---------------------------------------------------------------- +[Manufacturer] + %Provider% = tap0901, NTamd64 + +[tap0901.NTamd64] + %DeviceDescription% = tap0901.ndi, root\tap0901 ; Root enumerated + %DeviceDescription% = tap0901.ndi, tap0901 ; Legacy + +;--------------------------------------------------------------- +; Driver Section (Done) +;--------------------------------------------------------------- + +;----------------- Characteristics ------------ +; NCF_PHYSICAL = 0x04 +; NCF_VIRTUAL = 0x01 +; NCF_SOFTWARE_ENUMERATED = 0x02 +; NCF_HIDDEN = 0x08 +; NCF_NO_SERVICE = 0x10 +; NCF_HAS_UI = 0x80 +;----------------- Characteristics ------------ + +[tap0901.ndi] + CopyFiles = tap0901.driver, tap0901.files + AddReg = tap0901.reg + AddReg = tap0901.params.reg + Characteristics = + *IfType = 0x6 ; IF_TYPE_ETHERNET_CSMACD + *MediaType = 0x0 ; NdisMedium802_3 + *PhysicalMediaType = 14 ; NdisPhysicalMedium802_3 + +[tap0901.ndi.Services] + AddService = tap0901, 2, tap0901.service + +[tap0901.reg] + HKR, Ndi, Service, 0, "tap0901" + HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" + HKR, Ndi\Interfaces, LowerRange, 0, "ethernet" + HKR, , Manufacturer, 0, "%Provider%" + HKR, , ProductName, 0, "%DeviceDescription%" + +[tap0901.params.reg] + HKR, Ndi\params\MTU, ParamDesc, 0, "MTU" + HKR, Ndi\params\MTU, Type, 0, "int" + HKR, Ndi\params\MTU, Default, 0, "1500" + HKR, Ndi\params\MTU, Optional, 0, "0" + HKR, Ndi\params\MTU, Min, 0, "100" + HKR, Ndi\params\MTU, Max, 0, "1500" + HKR, Ndi\params\MTU, Step, 0, "1" + HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status" + HKR, Ndi\params\MediaStatus, Type, 0, "enum" + HKR, Ndi\params\MediaStatus, Default, 0, "0" + HKR, Ndi\params\MediaStatus, Optional, 0, "0" + HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled" + HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected" + HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address" + HKR, Ndi\params\MAC, Type, 0, "edit" + HKR, Ndi\params\MAC, Optional, 0, "1" + HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access" + HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum" + HKR, Ndi\params\AllowNonAdmin, Default, 0, "1" + HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0" + HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed" + HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed" + +;---------------------------------------------------------------- +; Service Section +;---------------------------------------------------------------- + +;---------- Service Type ------------- +; SERVICE_KERNEL_DRIVER = 0x01 +; SERVICE_WIN32_OWN_PROCESS = 0x10 +;---------- Service Type ------------- + +;---------- Start Mode --------------- +; SERVICE_BOOT_START = 0x0 +; SERVICE_SYSTEM_START = 0x1 +; SERVICE_AUTO_START = 0x2 +; SERVICE_DEMAND_START = 0x3 +; SERVICE_DISABLED = 0x4 +;---------- Start Mode --------------- + +[tap0901.service] + DisplayName = %DeviceDescription% + ServiceType = 1 + StartType = 3 + ErrorControl = 1 + LoadOrderGroup = NDIS + ServiceBinary = %12%\tap0901.sys + +;----------------------------------------------------------------- +; File Installation +;----------------------------------------------------------------- + +;----------------- Copy Flags ------------ +; COPYFLG_NOSKIP = 0x02 +; COPYFLG_NOVERSIONCHECK = 0x04 +;----------------- Copy Flags ------------ + +; SourceDisksNames +; diskid = description[, [tagfile] [, , subdir]] +; 1 = "Intel Driver Disk 1",e100bex.sys,, + +[SourceDisksNames] + 1 = %DeviceDescription%, tap0901.sys + +; SourceDisksFiles +; filename_on_source = diskID[, [subdir][, size]] +; e100bex.sys = 1,, ; on distribution disk 1 + +[SourceDisksFiles] +tap0901.sys = 1 + +[DestinationDirs] + tap0901.files = 11 + tap0901.driver = 12 + +[tap0901.files] +; TapPanel.cpl,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK +; cipsrvr.exe,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK + +[tap0901.driver] + tap0901.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK + +;--------------------------------------------------------------- +; End +;--------------------------------------------------------------- diff --git a/third_party/tap-windows6/bin/i386/OemVista.inf b/third_party/tap-windows6/bin/i386/OemVista.inf index f71c2d3e94..6cd6791311 100644 --- a/third_party/tap-windows6/bin/i386/OemVista.inf +++ b/third_party/tap-windows6/bin/i386/OemVista.inf @@ -1,191 +1,191 @@ -; **************************************************************************** -; * Copyright (C) 2002-2014 OpenVPN Technologies, Inc. * -; * This program is free software; you can redistribute it and/or modify * -; * it under the terms of the GNU General Public License version 2 * -; * as published by the Free Software Foundation. * -; **************************************************************************** - -; SYNTAX CHECKER -; cd \WINDDK\3790\tools\chkinf -; chkinf c:\src\openvpn\tap-win32\i386\oemvista.inf -; OUTPUT -> file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm - -; INSTALL/REMOVE DRIVER -; tapinstall install OemVista.inf tapoas -; tapinstall update OemVista.inf tapoas -; tapinstall remove tapoas - -;********************************************************* -; Note to Developers: -; -; If you are bundling the TAP-Windows driver with your app, -; you should try to rename it in such a way that it will -; not collide with other instances of TAP-Windows defined -; by other apps. Multiple versions of the TAP-Windows -; driver, each installed by different apps, can coexist -; on the same machine if you follow these guidelines. -; NOTE: these instructions assume you are editing the -; generated OemWin2k.inf file, not the source -; OemWin2k.inf.in file which is preprocessed by winconfig -; and uses macro definitions from settings.in. -; -; (1) Rename all tapXXXX instances in this file to -; something different (use at least 5 characters -; for this name!) -; (2) Change the "!define TAP" definition in openvpn.nsi -; to match what you changed tapXXXX to. -; (3) Change TARGETNAME in SOURCES to match what you -; changed tapXXXX to. -; (4) Change TAP_COMPONENT_ID in common.h to match what -; you changed tapXXXX to. -; (5) Change SZDEPENDENCIES in service.h to match what -; you changed tapXXXX to. -; (6) Change DeviceDescription and Provider strings. -; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you -; set DeviceDescription to. -; -;********************************************************* - -[Version] - Signature = "$Windows NT$" - CatalogFile = tap0901.cat - ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} - Provider = %Provider% - Class = Net - -; This version number should match the version -; number given in SOURCES. - DriverVer=04/21/2016,9.00.00.21 - -[Strings] - DeviceDescription = "TAP-Windows Adapter V9" - Provider = "TAP-Windows Provider V9" - -;---------------------------------------------------------------- -; Manufacturer + Product Section (Done) -;---------------------------------------------------------------- -[Manufacturer] - %Provider% = tap0901 - -[tap0901] - %DeviceDescription% = tap0901.ndi, root\tap0901 ; Root enumerated - %DeviceDescription% = tap0901.ndi, tap0901 ; Legacy - -;--------------------------------------------------------------- -; Driver Section (Done) -;--------------------------------------------------------------- - -;----------------- Characteristics ------------ -; NCF_PHYSICAL = 0x04 -; NCF_VIRTUAL = 0x01 -; NCF_SOFTWARE_ENUMERATED = 0x02 -; NCF_HIDDEN = 0x08 -; NCF_NO_SERVICE = 0x10 -; NCF_HAS_UI = 0x80 -;----------------- Characteristics ------------ - -[tap0901.ndi] - CopyFiles = tap0901.driver, tap0901.files - AddReg = tap0901.reg - AddReg = tap0901.params.reg - Characteristics = - *IfType = 0x6 ; IF_TYPE_ETHERNET_CSMACD - *MediaType = 0x0 ; NdisMedium802_3 - *PhysicalMediaType = 14 ; NdisPhysicalMedium802_3 - -[tap0901.ndi.Services] - AddService = tap0901, 2, tap0901.service - -[tap0901.reg] - HKR, Ndi, Service, 0, "tap0901" - HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" - HKR, Ndi\Interfaces, LowerRange, 0, "ethernet" - HKR, , Manufacturer, 0, "%Provider%" - HKR, , ProductName, 0, "%DeviceDescription%" - -[tap0901.params.reg] - HKR, Ndi\params\MTU, ParamDesc, 0, "MTU" - HKR, Ndi\params\MTU, Type, 0, "int" - HKR, Ndi\params\MTU, Default, 0, "1500" - HKR, Ndi\params\MTU, Optional, 0, "0" - HKR, Ndi\params\MTU, Min, 0, "100" - HKR, Ndi\params\MTU, Max, 0, "1500" - HKR, Ndi\params\MTU, Step, 0, "1" - HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status" - HKR, Ndi\params\MediaStatus, Type, 0, "enum" - HKR, Ndi\params\MediaStatus, Default, 0, "0" - HKR, Ndi\params\MediaStatus, Optional, 0, "0" - HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled" - HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected" - HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address" - HKR, Ndi\params\MAC, Type, 0, "edit" - HKR, Ndi\params\MAC, Optional, 0, "1" - HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access" - HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum" - HKR, Ndi\params\AllowNonAdmin, Default, 0, "1" - HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0" - HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed" - HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed" - -;---------------------------------------------------------------- -; Service Section -;---------------------------------------------------------------- - -;---------- Service Type ------------- -; SERVICE_KERNEL_DRIVER = 0x01 -; SERVICE_WIN32_OWN_PROCESS = 0x10 -;---------- Service Type ------------- - -;---------- Start Mode --------------- -; SERVICE_BOOT_START = 0x0 -; SERVICE_SYSTEM_START = 0x1 -; SERVICE_AUTO_START = 0x2 -; SERVICE_DEMAND_START = 0x3 -; SERVICE_DISABLED = 0x4 -;---------- Start Mode --------------- - -[tap0901.service] - DisplayName = %DeviceDescription% - ServiceType = 1 - StartType = 3 - ErrorControl = 1 - LoadOrderGroup = NDIS - ServiceBinary = %12%\tap0901.sys - -;----------------------------------------------------------------- -; File Installation -;----------------------------------------------------------------- - -;----------------- Copy Flags ------------ -; COPYFLG_NOSKIP = 0x02 -; COPYFLG_NOVERSIONCHECK = 0x04 -;----------------- Copy Flags ------------ - -; SourceDisksNames -; diskid = description[, [tagfile] [, , subdir]] -; 1 = "Intel Driver Disk 1",e100bex.sys,, - -[SourceDisksNames] - 1 = %DeviceDescription%, tap0901.sys - -; SourceDisksFiles -; filename_on_source = diskID[, [subdir][, size]] -; e100bex.sys = 1,, ; on distribution disk 1 - -[SourceDisksFiles] -tap0901.sys = 1 - -[DestinationDirs] - tap0901.files = 11 - tap0901.driver = 12 - -[tap0901.files] -; TapPanel.cpl,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK -; cipsrvr.exe,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK - -[tap0901.driver] - tap0901.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK - -;--------------------------------------------------------------- -; End -;--------------------------------------------------------------- +; **************************************************************************** +; * Copyright (C) 2002-2014 OpenVPN Technologies, Inc. * +; * This program is free software; you can redistribute it and/or modify * +; * it under the terms of the GNU General Public License version 2 * +; * as published by the Free Software Foundation. * +; **************************************************************************** + +; SYNTAX CHECKER +; cd \WINDDK\3790\tools\chkinf +; chkinf c:\src\openvpn\tap-win32\i386\oemvista.inf +; OUTPUT -> file:///c:/WINDDK/3790/tools/chkinf/htm/c%23+src+openvpn+tap-win32+i386+__OemWin2k.htm + +; INSTALL/REMOVE DRIVER +; tapinstall install OemVista.inf tapoas +; tapinstall update OemVista.inf tapoas +; tapinstall remove tapoas + +;********************************************************* +; Note to Developers: +; +; If you are bundling the TAP-Windows driver with your app, +; you should try to rename it in such a way that it will +; not collide with other instances of TAP-Windows defined +; by other apps. Multiple versions of the TAP-Windows +; driver, each installed by different apps, can coexist +; on the same machine if you follow these guidelines. +; NOTE: these instructions assume you are editing the +; generated OemWin2k.inf file, not the source +; OemWin2k.inf.in file which is preprocessed by winconfig +; and uses macro definitions from settings.in. +; +; (1) Rename all tapXXXX instances in this file to +; something different (use at least 5 characters +; for this name!) +; (2) Change the "!define TAP" definition in openvpn.nsi +; to match what you changed tapXXXX to. +; (3) Change TARGETNAME in SOURCES to match what you +; changed tapXXXX to. +; (4) Change TAP_COMPONENT_ID in common.h to match what +; you changed tapXXXX to. +; (5) Change SZDEPENDENCIES in service.h to match what +; you changed tapXXXX to. +; (6) Change DeviceDescription and Provider strings. +; (7) Change PRODUCT_TAP_WIN_DEVICE_DESCRIPTION in constants.h to what you +; set DeviceDescription to. +; +;********************************************************* + +[Version] + Signature = "$Windows NT$" + CatalogFile = tap0901.cat + ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} + Provider = %Provider% + Class = Net + +; This version number should match the version +; number given in SOURCES. + DriverVer=04/21/2016,9.00.00.21 + +[Strings] + DeviceDescription = "TAP-Windows Adapter V9" + Provider = "TAP-Windows Provider V9" + +;---------------------------------------------------------------- +; Manufacturer + Product Section (Done) +;---------------------------------------------------------------- +[Manufacturer] + %Provider% = tap0901 + +[tap0901] + %DeviceDescription% = tap0901.ndi, root\tap0901 ; Root enumerated + %DeviceDescription% = tap0901.ndi, tap0901 ; Legacy + +;--------------------------------------------------------------- +; Driver Section (Done) +;--------------------------------------------------------------- + +;----------------- Characteristics ------------ +; NCF_PHYSICAL = 0x04 +; NCF_VIRTUAL = 0x01 +; NCF_SOFTWARE_ENUMERATED = 0x02 +; NCF_HIDDEN = 0x08 +; NCF_NO_SERVICE = 0x10 +; NCF_HAS_UI = 0x80 +;----------------- Characteristics ------------ + +[tap0901.ndi] + CopyFiles = tap0901.driver, tap0901.files + AddReg = tap0901.reg + AddReg = tap0901.params.reg + Characteristics = + *IfType = 0x6 ; IF_TYPE_ETHERNET_CSMACD + *MediaType = 0x0 ; NdisMedium802_3 + *PhysicalMediaType = 14 ; NdisPhysicalMedium802_3 + +[tap0901.ndi.Services] + AddService = tap0901, 2, tap0901.service + +[tap0901.reg] + HKR, Ndi, Service, 0, "tap0901" + HKR, Ndi\Interfaces, UpperRange, 0, "ndis5" + HKR, Ndi\Interfaces, LowerRange, 0, "ethernet" + HKR, , Manufacturer, 0, "%Provider%" + HKR, , ProductName, 0, "%DeviceDescription%" + +[tap0901.params.reg] + HKR, Ndi\params\MTU, ParamDesc, 0, "MTU" + HKR, Ndi\params\MTU, Type, 0, "int" + HKR, Ndi\params\MTU, Default, 0, "1500" + HKR, Ndi\params\MTU, Optional, 0, "0" + HKR, Ndi\params\MTU, Min, 0, "100" + HKR, Ndi\params\MTU, Max, 0, "1500" + HKR, Ndi\params\MTU, Step, 0, "1" + HKR, Ndi\params\MediaStatus, ParamDesc, 0, "Media Status" + HKR, Ndi\params\MediaStatus, Type, 0, "enum" + HKR, Ndi\params\MediaStatus, Default, 0, "0" + HKR, Ndi\params\MediaStatus, Optional, 0, "0" + HKR, Ndi\params\MediaStatus\enum, "0", 0, "Application Controlled" + HKR, Ndi\params\MediaStatus\enum, "1", 0, "Always Connected" + HKR, Ndi\params\MAC, ParamDesc, 0, "MAC Address" + HKR, Ndi\params\MAC, Type, 0, "edit" + HKR, Ndi\params\MAC, Optional, 0, "1" + HKR, Ndi\params\AllowNonAdmin, ParamDesc, 0, "Non-Admin Access" + HKR, Ndi\params\AllowNonAdmin, Type, 0, "enum" + HKR, Ndi\params\AllowNonAdmin, Default, 0, "1" + HKR, Ndi\params\AllowNonAdmin, Optional, 0, "0" + HKR, Ndi\params\AllowNonAdmin\enum, "0", 0, "Not Allowed" + HKR, Ndi\params\AllowNonAdmin\enum, "1", 0, "Allowed" + +;---------------------------------------------------------------- +; Service Section +;---------------------------------------------------------------- + +;---------- Service Type ------------- +; SERVICE_KERNEL_DRIVER = 0x01 +; SERVICE_WIN32_OWN_PROCESS = 0x10 +;---------- Service Type ------------- + +;---------- Start Mode --------------- +; SERVICE_BOOT_START = 0x0 +; SERVICE_SYSTEM_START = 0x1 +; SERVICE_AUTO_START = 0x2 +; SERVICE_DEMAND_START = 0x3 +; SERVICE_DISABLED = 0x4 +;---------- Start Mode --------------- + +[tap0901.service] + DisplayName = %DeviceDescription% + ServiceType = 1 + StartType = 3 + ErrorControl = 1 + LoadOrderGroup = NDIS + ServiceBinary = %12%\tap0901.sys + +;----------------------------------------------------------------- +; File Installation +;----------------------------------------------------------------- + +;----------------- Copy Flags ------------ +; COPYFLG_NOSKIP = 0x02 +; COPYFLG_NOVERSIONCHECK = 0x04 +;----------------- Copy Flags ------------ + +; SourceDisksNames +; diskid = description[, [tagfile] [, , subdir]] +; 1 = "Intel Driver Disk 1",e100bex.sys,, + +[SourceDisksNames] + 1 = %DeviceDescription%, tap0901.sys + +; SourceDisksFiles +; filename_on_source = diskID[, [subdir][, size]] +; e100bex.sys = 1,, ; on distribution disk 1 + +[SourceDisksFiles] +tap0901.sys = 1 + +[DestinationDirs] + tap0901.files = 11 + tap0901.driver = 12 + +[tap0901.files] +; TapPanel.cpl,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK +; cipsrvr.exe,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK + +[tap0901.driver] + tap0901.sys,,,6 ; COPYFLG_NOSKIP | COPYFLG_NOVERSIONCHECK + +;--------------------------------------------------------------- +; End +;--------------------------------------------------------------- diff --git a/third_party/tap-windows6/bin/include/tap-windows.h b/third_party/tap-windows6/bin/include/tap-windows.h index 25bdd82b41..d546a5b1cb 100644 --- a/third_party/tap-windows6/bin/include/tap-windows.h +++ b/third_party/tap-windows6/bin/include/tap-windows.h @@ -1,74 +1,74 @@ -/* - * TAP-Windows -- A kernel driver to provide virtual tap - * device functionality on Windows. - * - * This code was inspired by the CIPE-Win32 driver by Damion K. Wilson. - * - * This source code is Copyright (C) 2002-2014 OpenVPN Technologies, Inc., - * and is released under the GPL version 2 (see below). - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program (see the file COPYING included with this - * distribution); if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef __TAP_WIN_H -#define __TAP_WIN_H - -/* - * ============= - * TAP IOCTLs - * ============= - */ - -#define TAP_WIN_CONTROL_CODE(request,method) \ - CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS) - -/* Present in 8.1 */ - -#define TAP_WIN_IOCTL_GET_MAC TAP_WIN_CONTROL_CODE (1, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_GET_VERSION TAP_WIN_CONTROL_CODE (2, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_GET_MTU TAP_WIN_CONTROL_CODE (3, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_GET_INFO TAP_WIN_CONTROL_CODE (4, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT TAP_WIN_CONTROL_CODE (5, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_SET_MEDIA_STATUS TAP_WIN_CONTROL_CODE (6, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_CONFIG_DHCP_MASQ TAP_WIN_CONTROL_CODE (7, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_GET_LOG_LINE TAP_WIN_CONTROL_CODE (8, METHOD_BUFFERED) -#define TAP_WIN_IOCTL_CONFIG_DHCP_SET_OPT TAP_WIN_CONTROL_CODE (9, METHOD_BUFFERED) - -/* Added in 8.2 */ - -/* obsoletes TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT */ -#define TAP_WIN_IOCTL_CONFIG_TUN TAP_WIN_CONTROL_CODE (10, METHOD_BUFFERED) - -/* - * ================= - * Registry keys - * ================= - */ - -#define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}" - -#define NETWORK_CONNECTIONS_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}" - -/* - * ====================== - * Filesystem prefixes - * ====================== - */ - -#define USERMODEDEVICEDIR "\\\\.\\Global\\" -#define SYSDEVICEDIR "\\Device\\" -#define USERDEVICEDIR "\\DosDevices\\Global\\" -#define TAP_WIN_SUFFIX ".tap" - -#endif // __TAP_WIN_H +/* + * TAP-Windows -- A kernel driver to provide virtual tap + * device functionality on Windows. + * + * This code was inspired by the CIPE-Win32 driver by Damion K. Wilson. + * + * This source code is Copyright (C) 2002-2014 OpenVPN Technologies, Inc., + * and is released under the GPL version 2 (see below). + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __TAP_WIN_H +#define __TAP_WIN_H + +/* + * ============= + * TAP IOCTLs + * ============= + */ + +#define TAP_WIN_CONTROL_CODE(request,method) \ + CTL_CODE (FILE_DEVICE_UNKNOWN, request, method, FILE_ANY_ACCESS) + +/* Present in 8.1 */ + +#define TAP_WIN_IOCTL_GET_MAC TAP_WIN_CONTROL_CODE (1, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_VERSION TAP_WIN_CONTROL_CODE (2, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_MTU TAP_WIN_CONTROL_CODE (3, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_INFO TAP_WIN_CONTROL_CODE (4, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT TAP_WIN_CONTROL_CODE (5, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_SET_MEDIA_STATUS TAP_WIN_CONTROL_CODE (6, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_CONFIG_DHCP_MASQ TAP_WIN_CONTROL_CODE (7, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_LOG_LINE TAP_WIN_CONTROL_CODE (8, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_CONFIG_DHCP_SET_OPT TAP_WIN_CONTROL_CODE (9, METHOD_BUFFERED) + +/* Added in 8.2 */ + +/* obsoletes TAP_WIN_IOCTL_CONFIG_POINT_TO_POINT */ +#define TAP_WIN_IOCTL_CONFIG_TUN TAP_WIN_CONTROL_CODE (10, METHOD_BUFFERED) + +/* + * ================= + * Registry keys + * ================= + */ + +#define ADAPTER_KEY "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}" + +#define NETWORK_CONNECTIONS_KEY "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}" + +/* + * ====================== + * Filesystem prefixes + * ====================== + */ + +#define USERMODEDEVICEDIR "\\\\.\\Global\\" +#define SYSDEVICEDIR "\\Device\\" +#define USERDEVICEDIR "\\DosDevices\\Global\\" +#define TAP_WIN_SUFFIX ".tap" + +#endif // __TAP_WIN_H diff --git a/tools/OutlineService/OutlineService.sln b/tools/OutlineService/OutlineService.sln index 9a40a06fab..0183a70546 100755 --- a/tools/OutlineService/OutlineService.sln +++ b/tools/OutlineService/OutlineService.sln @@ -1,31 +1,31 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2018 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OutlineService", "OutlineService\OutlineService.csproj", "{F39A4491-9868-4A71-9BE1-980FADE10AC9}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|Any CPU.ActiveCfg = Release|x86 - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|Any CPU.Build.0 = Release|x86 - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|x86.ActiveCfg = Release|x86 - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|x86.Build.0 = Release|x86 - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|Any CPU.Build.0 = Release|Any CPU - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|x86.ActiveCfg = Release|x86 - {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {55663288-4604-4D50-8D4A-7222B9A2B6BF} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27703.2018 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OutlineService", "OutlineService\OutlineService.csproj", "{F39A4491-9868-4A71-9BE1-980FADE10AC9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|Any CPU.ActiveCfg = Release|x86 + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|Any CPU.Build.0 = Release|x86 + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|x86.ActiveCfg = Release|x86 + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Debug|x86.Build.0 = Release|x86 + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|Any CPU.Build.0 = Release|Any CPU + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|x86.ActiveCfg = Release|x86 + {F39A4491-9868-4A71-9BE1-980FADE10AC9}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {55663288-4604-4D50-8D4A-7222B9A2B6BF} + EndGlobalSection +EndGlobal diff --git a/tools/OutlineService/OutlineService/App.config b/tools/OutlineService/OutlineService/App.config index 321649d338..5534e28762 100755 --- a/tools/OutlineService/OutlineService/App.config +++ b/tools/OutlineService/OutlineService/App.config @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/tools/OutlineService/OutlineService/OutlineService.Designer.cs b/tools/OutlineService/OutlineService/OutlineService.Designer.cs index 1be3f894c8..2c933d862d 100755 --- a/tools/OutlineService/OutlineService/OutlineService.Designer.cs +++ b/tools/OutlineService/OutlineService/OutlineService.Designer.cs @@ -1,54 +1,54 @@ -// Copyright 2018 The Outline Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -namespace OutlineService -{ - partial class OutlineService - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - // - // OutlineService - // - this.ServiceName = "OutlineService"; - - } - - #endregion - } -} +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +namespace OutlineService +{ + partial class OutlineService + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + // + // OutlineService + // + this.ServiceName = "OutlineService"; + + } + + #endregion + } +} diff --git a/tools/OutlineService/OutlineService/OutlineService.cs b/tools/OutlineService/OutlineService/OutlineService.cs index 3f2ad5f571..71da846c61 100755 --- a/tools/OutlineService/OutlineService/OutlineService.cs +++ b/tools/OutlineService/OutlineService/OutlineService.cs @@ -1,1093 +1,1093 @@ -// Copyright 2018 The Outline Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.IO.Pipes; -using System.Linq; -using System.Net; -using System.Net.NetworkInformation; -using System.Net.Sockets; -using System.Runtime.InteropServices; -using System.Runtime.Serialization; -using System.Security.AccessControl; -using System.Security.Principal; -using System.ServiceProcess; -using System.Text; -using Newtonsoft.Json; - -/* - * Windows Service, part of the Outline Windows client, to configure routing. - * Modifying the system routes requires admin permissions, so this service must be installed - * and started as admin. - * - * The service listens on a named pipe and supports the following JSON API: - * - * Requests - * - * configureRouting: Modifies the system's routing table to route all traffic through the TAP device - * except that destined for proxyIp. Disables IPv6 traffic. - * { action: "configureRouting", parameters: {"proxyIp": , "isAutoConnect": "false" }} - * - * resetRouting: Restores the system's default routing. - * { action: "resetRouting"} - * - * Response - * - * { statusCode: , action: errorMessage?: } - * - * The service will send connection status updates if the pipe connection is kept - * open by the client. Such responses have the form: - * - * { statusCode: , action: "statusChanged", connectionStatus: } - * - * View logs with this PowerShell query: - * get-eventlog -logname Application -source OutlineService -newest 20 | format-table -property timegenerated,entrytype,message -autosize - */ -namespace OutlineService -{ - public partial class OutlineService : ServiceBase - { - private const string EVENT_LOG_SOURCE = "OutlineService"; - private const string EVENT_LOG_NAME = "Application"; - // Must be kept in sync with the Electron code. - private const string PIPE_NAME = "OutlineServicePipe"; - private const string TAP_DEVICE_NAME = "outline-tap0"; - private const string TAP_DEVICE_IP = "10.0.85.1"; - - private const string ACTION_CONFIGURE_ROUTING = "configureRouting"; - private const string ACTION_RESET_ROUTING = "resetRouting"; - private const string ACTION_STATUS_CHANGED = "statusChanged"; - private const string PARAM_PROXY_IP = "proxyIp"; - private const string PARAM_AUTO_CONNECT = "isAutoConnect"; - - private static string[] IPV4_SUBNETS = { "0.0.0.0/1", "128.0.0.0/1" }; - private static string[] IPV6_SUBNETS = { "fc00::/7", "2000::/4", "3000::/4" }; - private static string[] IPV4_RESERVED_SUBNETS = { - "0.0.0.0/8", - "10.0.0.0/8", - "100.64.0.0/10", - "169.254.0.0/16", - "172.16.0.0/12", - "192.0.0.0/24", - "192.0.2.0/24", - "192.31.196.0/24", - "192.52.193.0/24", - "192.88.99.0/24", - "192.168.0.0/16", - "192.175.48.0/24", - "198.18.0.0/15", - "198.51.100.0/24", - "203.0.113.0/24", - "240.0.0.0/4" - }; - private const string CMD_NETSH = "netsh"; - private const string CMD_ROUTE = "route"; - - private const uint BUFFER_SIZE_BYTES = 1024; - - private EventLog eventLog; - private NamedPipeServerStream pipe; - private string proxyIp; - private string gatewayIp; - private int gatewayInterfaceIndex; - - // Time, in ms, to wait until considering smartdnsblock.exe to have successfully launched. - private const int SMART_DNS_BLOCK_TIMEOUT_MS = 1000; - - // https://docs.microsoft.com/en-us/windows/desktop/api/ipmib/ns-ipmib-_mib_ipforwardrow - [StructLayout(LayoutKind.Sequential)] - internal class MIB_IPFORWARDROW - { - internal uint dwForwardDest; - internal uint dwForwardMask; - internal uint dwForwardPolicy; - internal uint dwForwardNextHop; - internal int dwForwardIfIndex; - internal uint dwForwardType; - internal uint dwForwardProto; - internal uint dwForwardAge; - internal uint dwForwardNextHopAS; - internal uint dwForwardMetric1; - internal uint dwForwardMetric2; - internal uint dwForwardMetric3; - internal uint dwForwardMetric4; - internal uint dwForwardMetric5; - } - - // https://docs.microsoft.com/en-us/windows/desktop/api/ipmib/ns-ipmib-_mib_ipforwardtable - // - // NOTE: Because of the variable-length array, Marshal.PtrToStructure - // will *not* populate the table field. Additionally, we have seen - // crashes following suspend/resume while trying to marshal this - // structure. See #GetSystemIpv4Gateway for more on this, as well - // as for how to traverse the table. - [StructLayout(LayoutKind.Sequential)] - internal class MIB_IPFORWARDTABLE - { - internal uint dwNumEntries; - internal MIB_IPFORWARDROW[] table; - }; - - // https://docs.microsoft.com/en-us/windows/desktop/api/iphlpapi/nf-iphlpapi-getipforwardtable - [DllImport("iphlpapi", CharSet = CharSet.Auto)] - private extern static int GetIpForwardTable(IntPtr pIpForwardTable, ref int pdwSize, bool bOrder); - - // https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--0-499- - private static int ERROR_INSUFFICIENT_BUFFER = 122; - - // Do as little as possible here because any error thrown will cause "net start" to fail - // without anything being added to the application log. - public OutlineService() - { - InitializeComponent(); - - eventLog = new EventLog(); - if (!EventLog.SourceExists(EVENT_LOG_SOURCE)) - { - EventLog.CreateEventSource(EVENT_LOG_SOURCE, EVENT_LOG_NAME); - } - eventLog.Source = EVENT_LOG_SOURCE; - eventLog.Log = EVENT_LOG_NAME; - } - - protected override void OnStart(string[] args) - { - eventLog.WriteEntry("OutlineService starting"); - NetworkChange.NetworkAddressChanged += - new NetworkAddressChangedEventHandler(NetworkAddressChanged); - CreatePipe(); - } - - protected override void OnStop() - { - eventLog.WriteEntry("OutlineService stopping"); - DestroyPipe(); - NetworkChange.NetworkAddressChanged -= NetworkAddressChanged; - } - - private void CreatePipe() - { - var pipeSecurity = new PipeSecurity(); - pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier( - WellKnownSidType.CreatorOwnerSid, null), - PipeAccessRights.FullControl, AccessControlType.Allow)); - pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier( - WellKnownSidType.AuthenticatedUserSid, null), - PipeAccessRights.ReadWrite, AccessControlType.Allow)); - - pipe = new NamedPipeServerStream(PIPE_NAME, PipeDirection.InOut, -1, PipeTransmissionMode.Message, - PipeOptions.Asynchronous, (int)BUFFER_SIZE_BYTES, (int)BUFFER_SIZE_BYTES, pipeSecurity); - pipe.BeginWaitForConnection(HandleConnection, null); - } - - private void DestroyPipe() - { - if (pipe == null) - { - return; - } - try - { - if (pipe.IsConnected) - { - pipe.Disconnect(); - } - pipe.Close(); - pipe = null; - } - catch (Exception e) - { - eventLog.WriteEntry($"Got an exception while destroying the pipe: {e.ToString()}", - EventLogEntryType.Warning); - } - } - - private void HandleConnection(IAsyncResult result) - { - eventLog.WriteEntry("Got incoming connection"); - - // Save the network config before we do anything. If the request fails - // it will be sent to the client for inclusion in Sentry reports. - var beforeNetworkInfo = GetNetworkInfo(); - - try - { - pipe.EndWaitForConnection(result); - // Keep the pipe connected to send connection status updates. - while (pipe.IsConnected) - { - ServiceResponse response = new ServiceResponse(); - var request = ReadRequest(); - if (request == null) - { - response.statusCode = (int)ErrorCode.GenericFailure; - } - else - { - response.action = request.action; - try - { - HandleRequest(request); - } - catch (Exception e) - { - response.statusCode = (int)ErrorCode.GenericFailure; - response.errorMessage = $"{e.Message} (network config: {beforeNetworkInfo})"; - eventLog.WriteEntry($"request failed: {e.Message}", EventLogEntryType.Error); - } - } - WriteResponse(response); - } - } - catch (Exception e) - { - eventLog.WriteEntry($"Failed to handle connection: {e.ToString()}", EventLogEntryType.Error); - } - finally - { - // Pipe streams are one-to-one connections. Recreate the pipe to handle subsequent requests. - DestroyPipe(); - CreatePipe(); - } - } - - private ServiceRequest ReadRequest() - { - var stringBuilder = new StringBuilder(); - var buffer = new byte[BUFFER_SIZE_BYTES]; - var memoryStream = new MemoryStream(); - do - { - var readBytes = pipe.Read(buffer, 0, buffer.Length); - memoryStream.Write(buffer, 0, readBytes); - } while (!pipe.IsMessageComplete); - var msg = Encoding.UTF8.GetString(buffer); - if (String.IsNullOrWhiteSpace(msg)) - { - eventLog.WriteEntry("Failed to read request", EventLogEntryType.Error); - return null; - } - eventLog.WriteEntry($"incoming message: {msg}"); - return ParseRequest(msg); - } - - private ServiceRequest ParseRequest(string jsonRequest) - { - try - { - return JsonConvert.DeserializeObject(jsonRequest); - } - catch (Exception e) - { - eventLog.WriteEntry($"Failed to parse request: {e.ToString()}"); - } - return null; - } - - private void WriteResponse(ServiceResponse response) - { - var jsonResponse = SerializeResponse(response); - if (jsonResponse == null) - { - eventLog.WriteEntry("Failed to serialize response.", EventLogEntryType.Error); - return; - } - eventLog.WriteEntry($"outgoing message: {jsonResponse}"); - var jsonResponseBytes = Encoding.UTF8.GetBytes(jsonResponse); - pipe.Write(jsonResponseBytes, 0, jsonResponseBytes.Length); - pipe.Flush(); - pipe.WaitForPipeDrain(); - } - - private string SerializeResponse(ServiceResponse response) - { - try - { - return JsonConvert.SerializeObject(response); - } - catch (Exception e) - { - eventLog.WriteEntry($"Failed to serialize response: {e.ToString()}"); - } - return null; - } - - private void HandleRequest(ServiceRequest request) - { - switch (request.action) - { - case ACTION_CONFIGURE_ROUTING: - ConfigureRouting(request.parameters[PARAM_PROXY_IP], Boolean.Parse(request.parameters[PARAM_AUTO_CONNECT])); - break; - case ACTION_RESET_ROUTING: - ResetRouting(proxyIp, gatewayInterfaceIndex); - break; - default: - eventLog.WriteEntry($"Received invalid request: {request.action}", EventLogEntryType.Error); - break; - } - } - - // Routes all traffic *except that destined for the proxy server* - // through the TAP device, creating the illusion of a system-wide VPN. - // - // The two key steps are: - // - Route all IPv4 traffic through the TAP device. - // - Find a gateway and route traffic *to the proxy server only* (a /32 - // mask) through it. - // - // Finding a gateway, in particular, is complex: for more on how it - // works, see #GetSystemIpv4Gateway. - // - // On top of this foundation, we take some steps to help prevent - // "leaking" traffic: - // - IPv6 traffic is "blocked", as Outline does not currently support - // servers on IPv6 addresses. - // - "Smart Multi-Homed Name Resolution" is disabled, as it can cause - // the system's "regular" - and potentially filtered - DNS servers to - // be used (particularly on Windows 10). - // - // Preventing leaks significantly complicates things. In particular, *if - // autostart is true and a gateway cannot be found then the IPv4 - // redirect and IPv6 block remain in place and no exception is thrown*. - // When a gateway re-appears following a network change (see - // #NetworkAddressChanged), we will reconnect. - // - // Lastly, a set of routes is added through the gateway *to non-routable - // ("LAN") addresses*. This allows common hardware such as Chromecast to - // function while Outline is active. - // - // Note: - // - Currently, this function does not "clean up" in the event of - // failure. Instead, we rely on the client to call ResetRouting - // following a connection failure. - // - There's limited protection against "nested connections", i.e. - // connecting to Outline while another VPN, e.g. OpenVPN, is already - // active. There's no simple API we can use to tell whether a VPN is - // already active and *given the difficulty in identifying this - // reliably* (multiple active network interfaces, for example, are - // very common, e.g. it happens - briefly - every time a user - // switches between a wired and wireless network) we err on the side - // of working. Since the user presumably knows whether another VPN is - // already active and *we make no persistent changes to the routing - // table* this seems reasonable. - // - // TODO: The client needs to handle certain autoconnect failures better, - // e.g. if IPv4 redirect fails then the client is not really in - // the reconnecting state; the system is leaking traffic. - public void ConfigureRouting(string proxyIp, bool isAutoConnect) - { - try - { - StartSmartDnsBlock(); - eventLog.WriteEntry($"started smartdnsblock"); - } - catch (Exception e) - { - throw new Exception($"could not start smartdnsblock: {e.Message}"); - } - - try - { - GetSystemIpv4Gateway(proxyIp); - - eventLog.WriteEntry($"connecting via gateway at {gatewayIp} on interface {gatewayInterfaceIndex}"); - - // Set the proxy escape route first to prevent a routing loop when capturing all IPv4 traffic. - try - { - AddOrUpdateProxyRoute(proxyIp, gatewayIp, gatewayInterfaceIndex); - eventLog.WriteEntry($"created route to proxy"); - } - catch (Exception e) - { - throw new Exception($"could not create route to proxy: {e.Message}"); - } - this.proxyIp = proxyIp; - - try - { - AddOrUpdateReservedSubnetBypass(gatewayIp, gatewayInterfaceIndex); - eventLog.WriteEntry($"created LAN bypass routes"); - } - catch (Exception e) - { - throw new Exception($"could not create LAN bypass routes: {e.Message}"); - } - } - catch (Exception e) when (isAutoConnect) - { - eventLog.WriteEntry($"could not reconnect during auto-connect: {e.Message}", EventLogEntryType.Warning); - } - - try - { - StopRoutingIpv6(); - eventLog.WriteEntry($"blocked IPv6 traffic"); - } - catch (Exception e) - { - throw new Exception($"could not block IPv6 traffic: {e.Message}"); - } - - try - { - AddIpv4TapRedirect(); - eventLog.WriteEntry($"redirected IPv4 traffic"); - } - catch (Exception e) - { - throw new Exception($"could not redirect IPv4 traffic: {e.Message}"); - } - } - - // Undoes and removes as many as possible of the routes and other - // changes to the system previously made by #ConfigureRouting. - // - // As per #ConfigureRouting, this function is largely idempodent: - // calling it multiple times in succession should be safe and result in - // the same system configuration. - // - // Notes: - // - *This function does not set any error code when any step fails*. - // It probably should, as the system may in some rare cases still be - // connected (or, worse but less likely, bricked). - // - If the service does not know the IP address of the proxy server - // then it *cannot remove that route*. This can happen if the service - // is restarted while Outline is connected *or* (more likely) if this - // function is called while Outline is not connected. This route is - // mostly harmless because it only affects traffic to the proxy and - // if/when the user reconnects to it the route will be updated. - public void ResetRouting(string proxyIp, int gatewayInterfaceIndex) - { - try - { - RemoveIpv4TapRedirect(); - eventLog.WriteEntry($"removed IPv4 redirect"); - } - catch (Exception e) - { - eventLog.WriteEntry($"failed to remove IPv4 redirect: {e.Message}", EventLogEntryType.Error); - } - - try - { - // This is only necessary when disconecting without network connectivity. - StartRoutingIpv4(); - } - catch (Exception) {} - - try - { - StartRoutingIpv6(); - eventLog.WriteEntry($"unblocked IPv6"); - } - catch (Exception e) - { - eventLog.WriteEntry($"failed to unblock IPv6: {e.Message}", EventLogEntryType.Error); - } - - if (proxyIp != null) - { - try - { - DeleteProxyRoute(proxyIp); - eventLog.WriteEntry($"deleted route to proxy"); - } - catch (Exception e) - { - eventLog.WriteEntry($"failed to delete route to proxy: {e.Message}", EventLogEntryType.Error); - } - this.proxyIp = null; - } - - try - { - RemoveReservedSubnetBypass(); - eventLog.WriteEntry($"deleted LAN bypass routes"); - } - catch (Exception e) - { - eventLog.WriteEntry($"failed to delete LAN bypass routes: {e.Message}", EventLogEntryType.Error); - } - this.gatewayIp = null; - - try - { - StopSmartDnsBlock(); - eventLog.WriteEntry($"stopped smartdnsblock"); - } - catch (Exception e) - { - eventLog.WriteEntry($"failed to stop smartdnsblock: {e.Message}", - EventLogEntryType.Warning); - } - } - - // Disable "Smart Multi-Homed Name Resolution", to ensure the system uses only the - // (non-filtered) DNS server(s) associated with the TAP device. - // - // Notes: - // - To show the current firewall rules: - // netsh wfp show filters - // - This website is an easy way to quickly verify there are no DNS leaks: - // https://ipleak.net/ - // - Because .Net provides *no way* to associate the new process with this one, the - // new process will continue to run even if this service is interrupted or crashes. - // Fortunately, since the changes it makes are *not* persistent, the system can, in - // the worst case, be fixed by rebooting. - private void StartSmartDnsBlock() - { - // smartdnsblock.exe must be a sibling of OutlineService.exe. - Process smartDnsBlock = new Process(); - smartDnsBlock.StartInfo.FileName = new DirectoryInfo(Process.GetCurrentProcess().MainModule.FileName).Parent.FullName + - Path.DirectorySeparatorChar + "smartdnsblock.exe"; - smartDnsBlock.StartInfo.UseShellExecute = false; - - smartDnsBlock.StartInfo.RedirectStandardError = true; - smartDnsBlock.StartInfo.RedirectStandardOutput = true; - - // This is for Windows 7: without it, the process exits immediately, presumably - // because stdin isn't connected to anything: - // https://github.com/Jigsaw-Code/outline-client/issues/415 - // - // This seems to make no difference on Windows 8 and 10. - smartDnsBlock.StartInfo.RedirectStandardInput = true; - - ArrayList stdout = new ArrayList(); - ArrayList stderr = new ArrayList(); - smartDnsBlock.OutputDataReceived += (object sender, DataReceivedEventArgs e) => - { - if (!String.IsNullOrEmpty(e.Data)) - { - stdout.Add(e.Data); - } - }; - smartDnsBlock.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => - { - if (!String.IsNullOrEmpty(e.Data)) - { - stderr.Add(e.Data); - } - }; - - try - { - smartDnsBlock.Start(); - smartDnsBlock.BeginOutputReadLine(); - smartDnsBlock.BeginErrorReadLine(); - } - catch (Exception e) - { - throw new Exception($"could not launch smartdnsblock at {smartDnsBlock.StartInfo.FileName}: { e.Message}"); - } - - // This does *not* throw if the process is still running after Nms. - smartDnsBlock.WaitForExit(SMART_DNS_BLOCK_TIMEOUT_MS); - if (smartDnsBlock.HasExited) - { - throw new Exception($"smartdnsblock failed " + $"(stdout: {String.Join(Environment.NewLine, stdout.ToArray())}, " + - $"(stderr: {String.Join(Environment.NewLine, stderr.ToArray())})"); - } - } - - private void StopSmartDnsBlock() - { - try - { - RunCommand("powershell", "stop-process -name smartdnsblock"); - } - catch (Exception e) - { - throw new Exception($"could not stop smartdnsblock: {e.Message}"); - } - } - - private void AddOrUpdateProxyRoute(string proxyIp, string gatewayIp, int gatewayInterfaceIndex) - { - // "netsh interface ipv4 set route" does *not* work for us here - // because it can only be used to change a route's *metric*. - try - { - RunCommand(CMD_ROUTE, $"change {proxyIp} {gatewayIp} if {gatewayInterfaceIndex}"); - } - catch (Exception) - { - RunCommand(CMD_NETSH, $"interface ipv4 add route {proxyIp}/32 nexthop={gatewayIp} interface=\"{gatewayInterfaceIndex}\" metric=0 store=active"); - } - } - - private void DeleteProxyRoute(string proxyIp) - { - // "route" doesn't need to know on which interface or through which - // gateway the route was created. - RunCommand(CMD_ROUTE, $"delete {proxyIp}"); - } - - // Route IPv4 traffic through the TAP device. Instead of deleting the - // default IPv4 gateway (0.0.0.0/0), we resort to creating two more - // specific routes (see IPV4_SUBNETS) that take precedence over the - // default gateway. This way, we need not worry about the default - // gateway being recreated with a lower metric upon device sleep. - // - // This 'hack' was inspired by OpenVPN; see: - // https://github.com/OpenVPN/openvpn3/commit/d08cc059e7132a3d3aee3dcd946fce4c35b1ced3#diff-1d76f0fd7ec04c6d1398288214a879c5R358 - // - // TODO: If these routes exist on a gateway that's not our TAP device, - // it might be a good signal that OpenVPN is active? - private void AddIpv4TapRedirect() - { - foreach (string subnet in IPV4_SUBNETS) - { - try - { - RunCommand(CMD_NETSH, $"interface ipv4 add route {subnet} nexthop={TAP_DEVICE_IP} interface={TAP_DEVICE_NAME} metric=0 store=active"); - } - catch (Exception) - { - RunCommand(CMD_NETSH, $"interface ipv4 set route {subnet} nexthop={TAP_DEVICE_IP} interface={TAP_DEVICE_NAME} metric=0 store=active"); - } - } - } - - private void RemoveIpv4TapRedirect() - { - foreach (string subnet in IPV4_SUBNETS) - { - RunCommand(CMD_NETSH, $"interface ipv4 delete route {subnet} interface={TAP_DEVICE_NAME}"); - } - } - - private void StartRoutingIpv4() - { - foreach (string subnet in IPV4_SUBNETS) - { - RunCommand(CMD_NETSH, $"interface ipv4 delete route {subnet} interface={NetworkInterface.LoopbackInterfaceIndex}"); - } - } - - private void StopRoutingIpv4() - { - foreach (string subnet in IPV4_SUBNETS) - { - try - { - RunCommand(CMD_NETSH, $"interface ipv4 add route {subnet} interface={NetworkInterface.LoopbackInterfaceIndex} metric=0 store=active"); - } - catch (Exception) - { - RunCommand(CMD_NETSH, $"interface ipv4 set route {subnet} interface={NetworkInterface.LoopbackInterfaceIndex} metric=0 store=active"); - } - } - } - - private void StartRoutingIpv6() - { - foreach (string subnet in IPV6_SUBNETS) - { - RunCommand(CMD_NETSH, $"interface ipv6 delete route {subnet} interface={NetworkInterface.IPv6LoopbackInterfaceIndex}"); - } - } - - // Outline does not currently support IPv6, so we resort to disabling it while the VPN is active to - // prevent leakage. Removing the default IPv6 gateway is not enough since it gets re-created - // through router advertisements and DHCP (disabling these or IPv6 routing altogether requires a - // system reboot). Thus, we resort to creating three IPv6 routes (see IPV6_SUBNETS) to the loopback - // interface that are more specific than the default route, causing IPv6 traffic to get dropped. - private void StopRoutingIpv6() - { - foreach (string subnet in IPV6_SUBNETS) - { - try - { - RunCommand(CMD_NETSH, $"interface ipv6 add route {subnet} interface={NetworkInterface.IPv6LoopbackInterfaceIndex} metric=0 store=active"); - } - catch (Exception) - { - RunCommand(CMD_NETSH, $"interface ipv6 set route {subnet} interface={NetworkInterface.IPv6LoopbackInterfaceIndex} metric=0 store=active"); - } - } - } - - // Routes reserved and private subnets through the default gateway so they bypass the VPN. - private void AddOrUpdateReservedSubnetBypass(string gatewayIp, int gatewayInterfaceIndex) - { - foreach (string subnet in IPV4_RESERVED_SUBNETS) - { - try - { - RunCommand(CMD_ROUTE, $"change {subnet} {gatewayIp} if {gatewayInterfaceIndex}"); - } - catch (Exception) - { - RunCommand(CMD_NETSH, $"interface ipv4 add route {subnet} nexthop={gatewayIp} interface=\"{gatewayInterfaceIndex}\" metric=0 store=active"); - } - } - } - - // Removes reserved subnet routes created to bypass the VPN. - private void RemoveReservedSubnetBypass() - { - foreach (string subnet in IPV4_RESERVED_SUBNETS) - { - RunCommand(CMD_ROUTE, $"delete {subnet}"); - } - } - - // Runs a shell command synchronously. - private void RunCommand(string cmd, string args) - { - Console.WriteLine($"running command: {cmd} {args}"); - - var startInfo = new ProcessStartInfo(cmd); - startInfo.Arguments = args; - startInfo.UseShellExecute = false; - startInfo.RedirectStandardError = true; - startInfo.RedirectStandardOutput = true; - startInfo.CreateNoWindow = true; - - Process p = new Process(); - var stdout = new StringBuilder(); - var stderr = new StringBuilder(); - p.OutputDataReceived += (object sender, DataReceivedEventArgs e) => - { - if (e == null || String.IsNullOrWhiteSpace(e.Data)) - { - return; - } - stdout.Append(e.Data); - }; - p.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => - { - if (e == null || String.IsNullOrWhiteSpace(e.Data)) - { - return; - } - stderr.Append(e.Data); - }; - p.StartInfo = startInfo; - p.Start(); - p.BeginOutputReadLine(); - p.BeginErrorReadLine(); - p.WaitForExit(); - - // "route" is weird and always exits with zero: we have to examine - // stderr to detect its errors. - if (p.ExitCode != 0 || stderr.ToString().Length > 0) - { - // NOTE: Do *not* add args to this error message because it's piped - // back to the client for inclusion in Sentry reports and - // effectively contain access keys. - throw new Exception($"command exited with {p.ExitCode} " + - $"(stdout: {stdout.ToString()}, stderr: {stderr.ToString()})"); - } - } - - // Searches the system's routing table for the best route to the - // specified IP address *that does not route through the TAP device*. - // - // That last requirement - ignoring the TAP device - is what prevents us - // from simply calling GetBestRoute: other than that, it does all the - // work of finding the lowest-weighted gateway to the destination IP. - // - // NOTE: This function does not *always* find the best gateway: it - // currently only considers "default" gateways (0.0.0.0) which may not - // work in some rare cases. Several re-implementations of the Windows - // API illustrate how we could more closely match GetBestRoute: - // - https://github.com/wine-mirror/wine/blob/master/dlls/iphlpapi/iphlpapi_main.c - // - https://github.com/reactos/reactos/blob/master/dll/win32/iphlpapi/iphlpapi_main.c - private void GetSystemIpv4Gateway(string proxyIp) - { - gatewayIp = null; - gatewayInterfaceIndex = -1; - - int tapInterfaceIndex; - try - { - tapInterfaceIndex = NetworkInterface.GetAllNetworkInterfaces() - .Where(i => i.Name == TAP_DEVICE_NAME) - .FirstOrDefault() - .GetIPProperties() - .GetIPv4Properties().Index; - } - catch (Exception) - { - throw new Exception("TAP device not found"); - } - - // Some marshalling craziness follows: we have to first ask - // GetIpForwardTable how much memory is required to hold the routing - // table before calling it again to actually return us the table; - // once we have the table, we have to iterate over the rows - // (thankfully, MIB_IPFORWARDROW marshalls easily). - int bufferSize = 0; - if (GetIpForwardTable(IntPtr.Zero, ref bufferSize, true) != ERROR_INSUFFICIENT_BUFFER) - { - throw new Exception("could not fetch routing table"); - } - var buffer = Marshal.AllocHGlobal(bufferSize); - if (GetIpForwardTable(buffer, ref bufferSize, true) != 0) - { - Marshal.FreeHGlobal(buffer); - throw new Exception("could not fetch routing table"); - } - - // NOTE: We deliberately *do not marshal the entire - // MIB_IPFORWARDTABLE* owing to unexplained crashes following - // suspend/resume. Fortunately, since that structure is - // logically just a DWORD followed by an array, this entails - // little extra work. - var numEntries = Marshal.ReadInt32(buffer); - MIB_IPFORWARDROW bestRow = null; - var rowPtr = buffer + Marshal.SizeOf(numEntries); - for (int i = 0; i < numEntries; i++) - { - MIB_IPFORWARDROW row = (MIB_IPFORWARDROW)Marshal.PtrToStructure(rowPtr, typeof(MIB_IPFORWARDROW)); - - // Must be a gateway (see note above on how we can improve this). - if (row.dwForwardDest != 0) - { - continue; - } - - // Must not be the TAP device. - if (row.dwForwardIfIndex == tapInterfaceIndex) - { - continue; - } - - if (bestRow == null || row.dwForwardMetric1 < bestRow.dwForwardMetric1) - { - bestRow = row; - } - - rowPtr += Marshal.SizeOf(typeof(MIB_IPFORWARDROW)); - } - - Marshal.FreeHGlobal(buffer); - - if (bestRow == null) - { - throw new Exception("no gateway found"); - } - - gatewayIp = new IPAddress(BitConverter.GetBytes(bestRow.dwForwardNextHop)).ToString(); - gatewayInterfaceIndex = bestRow.dwForwardIfIndex; - } - - // Updates, if Outline is connected, the routing table to reflect a new - // gateway. - // - // There's really just one thing to do when the gateway changes: update - // the (direct) route to the proxy server to route through the new - // gateway. If there is no gateway, e.g. because the system has lost - // network connectivity, notify the client and keep the IPv4 redirect - // and IPv6 block in place: this helps prevent leaking traffic. - // - // Notes: - // - *This function must not throw*. If it does, the handler is unset. - // - This function also updates two further sets of routes: the LAN - // bypass routes (which must route through the gateway) and the IPv4 - // redirect routes (which "fall back" to the system gateway once the - // TAP device temporarily disappears due to tun2socks' exit). - // - The NetworkChange.NetworkAddressChanged callback is *extremely - // noisy*. In particular, it seems to be called twice for every - // change to the routing table. There does not seem to be any useful - // information in the supplied EventArgs. This is partly why we don't - // touch the routing table unless the gateway has actually changed. - // - This function may be called while #ConfigureRouting is still - // running. This is partly why we exit early (at the top) if we don't - // think Outline is connected. - private void NetworkAddressChanged(object sender, EventArgs evt) - { - if (proxyIp == null) - { - eventLog.WriteEntry("network changed but Outline is not connected - doing nothing"); - return; - } - - var previousGatewayIp = gatewayIp; - var previousGatewayInterfaceIndex = gatewayInterfaceIndex; - - try - { - GetSystemIpv4Gateway(proxyIp); - } - catch (Exception e) - { - eventLog.WriteEntry($"network changed but no gateway found: {e.Message}"); - } - - if (previousGatewayIp == gatewayIp && previousGatewayInterfaceIndex == gatewayInterfaceIndex) - { - // Only send on actual change, to prevent duplicate notifications (mostly - // harmless but can make debugging harder). - eventLog.WriteEntry($"network changed but gateway and interface stayed the same"); - return; - } - else if (gatewayIp == null) - { - SendConnectionStatusChange(ConnectionStatus.Reconnecting); - - // Stop capturing IPv4 traffic in order to prevent a routing loop in the TAP device. - // Redirect IPv4 traffic to the loopback interface instead to avoid leaking traffic when - // the network becomes available. - try - { - StopRoutingIpv4(); - RemoveIpv4TapRedirect(); - eventLog.WriteEntry($"stopped routing IPv4 traffic"); - } - catch (Exception e) - { - eventLog.WriteEntry($"failed to stop routing IPv4: {e.Message}", EventLogEntryType.Error); - } - return; - } - - eventLog.WriteEntry($"network changed - gateway is now {gatewayIp} on interface {gatewayInterfaceIndex}"); - - // Add the proxy escape route before capturing IPv4 traffic to prevent a routing loop in the TAP device. - try - { - AddOrUpdateProxyRoute(proxyIp, gatewayIp, gatewayInterfaceIndex); - eventLog.WriteEntry($"updated route to proxy"); - } - catch (Exception e) - { - eventLog.WriteEntry($"could not update route to proxy: {e.Message}"); - return; - } - - try - { - AddIpv4TapRedirect(); - StartRoutingIpv4(); - eventLog.WriteEntry($"refreshed IPv4 redirect"); - } - catch (Exception e) - { - eventLog.WriteEntry($"could not refresh IPv4 redirect: {e.Message}"); - return; - } - - // Send the status update now that the full-system VPN is connected. - SendConnectionStatusChange(ConnectionStatus.Connected); - - try - { - AddOrUpdateReservedSubnetBypass(gatewayIp, gatewayInterfaceIndex); - eventLog.WriteEntry($"updated LAN bypass routes"); - } - catch (Exception e) - { - // TODO: This isn't quite right: because we successfully updated - // the route to the proxy, the client *is* connected; it's - // just not "fully" connected, in the way we like. We - // should distinguish between "cannot reconnect right now, - // because no internet" and "cannot reconnect because - // netsh commands are failing". - eventLog.WriteEntry($"could not update LAN bypass routes: {e.Message}"); - return; - } - } - - // Writes the connection status to the pipe, if it is connected. - private void SendConnectionStatusChange(ConnectionStatus status) - { - if (pipe == null || !pipe.IsConnected) - { - eventLog.WriteEntry("Cannot send connection status change, pipe not connected.", EventLogEntryType.Error); - return; - } - ServiceResponse response = new ServiceResponse(); - response.action = ACTION_STATUS_CHANGED; - response.statusCode = (int)ErrorCode.Success; - response.connectionStatus = (int)status; - try - { - WriteResponse(response); - } - catch (Exception e) - { - eventLog.WriteEntry($"Failed to send connection status change: {e.Message}"); - } - } - - public string GetNetworkInfo() - { - return String.Join(", ", NetworkInterface.GetAllNetworkInterfaces() - .Select(a => this.GetAdapterInfo(a))); - } - - private string GetAdapterInfo(NetworkInterface adapter) - { - var numIpv4Gateways = adapter.GetIPProperties().GatewayAddresses - .Select(g => g.Address) - .Where(a => a.AddressFamily == AddressFamily.InterNetwork) - .Count(); - var numIpv6Gateways = adapter.GetIPProperties().GatewayAddresses - .Select(g => g.Address) - .Where(a => a.AddressFamily == AddressFamily.InterNetworkV6) - .Count(); - - return $"{adapter.Name} ({adapter.OperationalStatus}): " + ( - adapter.Supports(NetworkInterfaceComponent.IPv4) ? - $"{numIpv4Gateways} x ipv4 gateways" : - "ipv4 disabled") + ", " + ( - adapter.Supports(NetworkInterfaceComponent.IPv6) ? - $"{numIpv6Gateways} x ipv6 gateways" : - "ipv6 disabled"); - } - } - - [DataContract] - internal class ServiceRequest - { - [DataMember] - internal string action; - [DataMember] - internal Dictionary parameters; - } - - [DataContract] - internal class ServiceResponse - { - [DataMember] - internal string action; - [DataMember] - internal int statusCode; - [DataMember] - internal string errorMessage; - [DataMember] - internal int connectionStatus; - } - - public enum ErrorCode - { - Success = 0, - GenericFailure = 1 - } - - public enum ConnectionStatus - { - Connected = 0, - Disconnected = 1, - Reconnecting = 2 - } -} +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.IO.Pipes; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Security.AccessControl; +using System.Security.Principal; +using System.ServiceProcess; +using System.Text; +using Newtonsoft.Json; + +/* + * Windows Service, part of the Outline Windows client, to configure routing. + * Modifying the system routes requires admin permissions, so this service must be installed + * and started as admin. + * + * The service listens on a named pipe and supports the following JSON API: + * + * Requests + * + * configureRouting: Modifies the system's routing table to route all traffic through the TAP device + * except that destined for proxyIp. Disables IPv6 traffic. + * { action: "configureRouting", parameters: {"proxyIp": , "isAutoConnect": "false" }} + * + * resetRouting: Restores the system's default routing. + * { action: "resetRouting"} + * + * Response + * + * { statusCode: , action: errorMessage?: } + * + * The service will send connection status updates if the pipe connection is kept + * open by the client. Such responses have the form: + * + * { statusCode: , action: "statusChanged", connectionStatus: } + * + * View logs with this PowerShell query: + * get-eventlog -logname Application -source OutlineService -newest 20 | format-table -property timegenerated,entrytype,message -autosize + */ +namespace OutlineService +{ + public partial class OutlineService : ServiceBase + { + private const string EVENT_LOG_SOURCE = "OutlineService"; + private const string EVENT_LOG_NAME = "Application"; + // Must be kept in sync with the Electron code. + private const string PIPE_NAME = "OutlineServicePipe"; + private const string TAP_DEVICE_NAME = "outline-tap0"; + private const string TAP_DEVICE_IP = "10.0.85.1"; + + private const string ACTION_CONFIGURE_ROUTING = "configureRouting"; + private const string ACTION_RESET_ROUTING = "resetRouting"; + private const string ACTION_STATUS_CHANGED = "statusChanged"; + private const string PARAM_PROXY_IP = "proxyIp"; + private const string PARAM_AUTO_CONNECT = "isAutoConnect"; + + private static string[] IPV4_SUBNETS = { "0.0.0.0/1", "128.0.0.0/1" }; + private static string[] IPV6_SUBNETS = { "fc00::/7", "2000::/4", "3000::/4" }; + private static string[] IPV4_RESERVED_SUBNETS = { + "0.0.0.0/8", + "10.0.0.0/8", + "100.64.0.0/10", + "169.254.0.0/16", + "172.16.0.0/12", + "192.0.0.0/24", + "192.0.2.0/24", + "192.31.196.0/24", + "192.52.193.0/24", + "192.88.99.0/24", + "192.168.0.0/16", + "192.175.48.0/24", + "198.18.0.0/15", + "198.51.100.0/24", + "203.0.113.0/24", + "240.0.0.0/4" + }; + private const string CMD_NETSH = "netsh"; + private const string CMD_ROUTE = "route"; + + private const uint BUFFER_SIZE_BYTES = 1024; + + private EventLog eventLog; + private NamedPipeServerStream pipe; + private string proxyIp; + private string gatewayIp; + private int gatewayInterfaceIndex; + + // Time, in ms, to wait until considering smartdnsblock.exe to have successfully launched. + private const int SMART_DNS_BLOCK_TIMEOUT_MS = 1000; + + // https://docs.microsoft.com/en-us/windows/desktop/api/ipmib/ns-ipmib-_mib_ipforwardrow + [StructLayout(LayoutKind.Sequential)] + internal class MIB_IPFORWARDROW + { + internal uint dwForwardDest; + internal uint dwForwardMask; + internal uint dwForwardPolicy; + internal uint dwForwardNextHop; + internal int dwForwardIfIndex; + internal uint dwForwardType; + internal uint dwForwardProto; + internal uint dwForwardAge; + internal uint dwForwardNextHopAS; + internal uint dwForwardMetric1; + internal uint dwForwardMetric2; + internal uint dwForwardMetric3; + internal uint dwForwardMetric4; + internal uint dwForwardMetric5; + } + + // https://docs.microsoft.com/en-us/windows/desktop/api/ipmib/ns-ipmib-_mib_ipforwardtable + // + // NOTE: Because of the variable-length array, Marshal.PtrToStructure + // will *not* populate the table field. Additionally, we have seen + // crashes following suspend/resume while trying to marshal this + // structure. See #GetSystemIpv4Gateway for more on this, as well + // as for how to traverse the table. + [StructLayout(LayoutKind.Sequential)] + internal class MIB_IPFORWARDTABLE + { + internal uint dwNumEntries; + internal MIB_IPFORWARDROW[] table; + }; + + // https://docs.microsoft.com/en-us/windows/desktop/api/iphlpapi/nf-iphlpapi-getipforwardtable + [DllImport("iphlpapi", CharSet = CharSet.Auto)] + private extern static int GetIpForwardTable(IntPtr pIpForwardTable, ref int pdwSize, bool bOrder); + + // https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--0-499- + private static int ERROR_INSUFFICIENT_BUFFER = 122; + + // Do as little as possible here because any error thrown will cause "net start" to fail + // without anything being added to the application log. + public OutlineService() + { + InitializeComponent(); + + eventLog = new EventLog(); + if (!EventLog.SourceExists(EVENT_LOG_SOURCE)) + { + EventLog.CreateEventSource(EVENT_LOG_SOURCE, EVENT_LOG_NAME); + } + eventLog.Source = EVENT_LOG_SOURCE; + eventLog.Log = EVENT_LOG_NAME; + } + + protected override void OnStart(string[] args) + { + eventLog.WriteEntry("OutlineService starting"); + NetworkChange.NetworkAddressChanged += + new NetworkAddressChangedEventHandler(NetworkAddressChanged); + CreatePipe(); + } + + protected override void OnStop() + { + eventLog.WriteEntry("OutlineService stopping"); + DestroyPipe(); + NetworkChange.NetworkAddressChanged -= NetworkAddressChanged; + } + + private void CreatePipe() + { + var pipeSecurity = new PipeSecurity(); + pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier( + WellKnownSidType.CreatorOwnerSid, null), + PipeAccessRights.FullControl, AccessControlType.Allow)); + pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier( + WellKnownSidType.AuthenticatedUserSid, null), + PipeAccessRights.ReadWrite, AccessControlType.Allow)); + + pipe = new NamedPipeServerStream(PIPE_NAME, PipeDirection.InOut, -1, PipeTransmissionMode.Message, + PipeOptions.Asynchronous, (int)BUFFER_SIZE_BYTES, (int)BUFFER_SIZE_BYTES, pipeSecurity); + pipe.BeginWaitForConnection(HandleConnection, null); + } + + private void DestroyPipe() + { + if (pipe == null) + { + return; + } + try + { + if (pipe.IsConnected) + { + pipe.Disconnect(); + } + pipe.Close(); + pipe = null; + } + catch (Exception e) + { + eventLog.WriteEntry($"Got an exception while destroying the pipe: {e.ToString()}", + EventLogEntryType.Warning); + } + } + + private void HandleConnection(IAsyncResult result) + { + eventLog.WriteEntry("Got incoming connection"); + + // Save the network config before we do anything. If the request fails + // it will be sent to the client for inclusion in Sentry reports. + var beforeNetworkInfo = GetNetworkInfo(); + + try + { + pipe.EndWaitForConnection(result); + // Keep the pipe connected to send connection status updates. + while (pipe.IsConnected) + { + ServiceResponse response = new ServiceResponse(); + var request = ReadRequest(); + if (request == null) + { + response.statusCode = (int)ErrorCode.GenericFailure; + } + else + { + response.action = request.action; + try + { + HandleRequest(request); + } + catch (Exception e) + { + response.statusCode = (int)ErrorCode.GenericFailure; + response.errorMessage = $"{e.Message} (network config: {beforeNetworkInfo})"; + eventLog.WriteEntry($"request failed: {e.Message}", EventLogEntryType.Error); + } + } + WriteResponse(response); + } + } + catch (Exception e) + { + eventLog.WriteEntry($"Failed to handle connection: {e.ToString()}", EventLogEntryType.Error); + } + finally + { + // Pipe streams are one-to-one connections. Recreate the pipe to handle subsequent requests. + DestroyPipe(); + CreatePipe(); + } + } + + private ServiceRequest ReadRequest() + { + var stringBuilder = new StringBuilder(); + var buffer = new byte[BUFFER_SIZE_BYTES]; + var memoryStream = new MemoryStream(); + do + { + var readBytes = pipe.Read(buffer, 0, buffer.Length); + memoryStream.Write(buffer, 0, readBytes); + } while (!pipe.IsMessageComplete); + var msg = Encoding.UTF8.GetString(buffer); + if (String.IsNullOrWhiteSpace(msg)) + { + eventLog.WriteEntry("Failed to read request", EventLogEntryType.Error); + return null; + } + eventLog.WriteEntry($"incoming message: {msg}"); + return ParseRequest(msg); + } + + private ServiceRequest ParseRequest(string jsonRequest) + { + try + { + return JsonConvert.DeserializeObject(jsonRequest); + } + catch (Exception e) + { + eventLog.WriteEntry($"Failed to parse request: {e.ToString()}"); + } + return null; + } + + private void WriteResponse(ServiceResponse response) + { + var jsonResponse = SerializeResponse(response); + if (jsonResponse == null) + { + eventLog.WriteEntry("Failed to serialize response.", EventLogEntryType.Error); + return; + } + eventLog.WriteEntry($"outgoing message: {jsonResponse}"); + var jsonResponseBytes = Encoding.UTF8.GetBytes(jsonResponse); + pipe.Write(jsonResponseBytes, 0, jsonResponseBytes.Length); + pipe.Flush(); + pipe.WaitForPipeDrain(); + } + + private string SerializeResponse(ServiceResponse response) + { + try + { + return JsonConvert.SerializeObject(response); + } + catch (Exception e) + { + eventLog.WriteEntry($"Failed to serialize response: {e.ToString()}"); + } + return null; + } + + private void HandleRequest(ServiceRequest request) + { + switch (request.action) + { + case ACTION_CONFIGURE_ROUTING: + ConfigureRouting(request.parameters[PARAM_PROXY_IP], Boolean.Parse(request.parameters[PARAM_AUTO_CONNECT])); + break; + case ACTION_RESET_ROUTING: + ResetRouting(proxyIp, gatewayInterfaceIndex); + break; + default: + eventLog.WriteEntry($"Received invalid request: {request.action}", EventLogEntryType.Error); + break; + } + } + + // Routes all traffic *except that destined for the proxy server* + // through the TAP device, creating the illusion of a system-wide VPN. + // + // The two key steps are: + // - Route all IPv4 traffic through the TAP device. + // - Find a gateway and route traffic *to the proxy server only* (a /32 + // mask) through it. + // + // Finding a gateway, in particular, is complex: for more on how it + // works, see #GetSystemIpv4Gateway. + // + // On top of this foundation, we take some steps to help prevent + // "leaking" traffic: + // - IPv6 traffic is "blocked", as Outline does not currently support + // servers on IPv6 addresses. + // - "Smart Multi-Homed Name Resolution" is disabled, as it can cause + // the system's "regular" - and potentially filtered - DNS servers to + // be used (particularly on Windows 10). + // + // Preventing leaks significantly complicates things. In particular, *if + // autostart is true and a gateway cannot be found then the IPv4 + // redirect and IPv6 block remain in place and no exception is thrown*. + // When a gateway re-appears following a network change (see + // #NetworkAddressChanged), we will reconnect. + // + // Lastly, a set of routes is added through the gateway *to non-routable + // ("LAN") addresses*. This allows common hardware such as Chromecast to + // function while Outline is active. + // + // Note: + // - Currently, this function does not "clean up" in the event of + // failure. Instead, we rely on the client to call ResetRouting + // following a connection failure. + // - There's limited protection against "nested connections", i.e. + // connecting to Outline while another VPN, e.g. OpenVPN, is already + // active. There's no simple API we can use to tell whether a VPN is + // already active and *given the difficulty in identifying this + // reliably* (multiple active network interfaces, for example, are + // very common, e.g. it happens - briefly - every time a user + // switches between a wired and wireless network) we err on the side + // of working. Since the user presumably knows whether another VPN is + // already active and *we make no persistent changes to the routing + // table* this seems reasonable. + // + // TODO: The client needs to handle certain autoconnect failures better, + // e.g. if IPv4 redirect fails then the client is not really in + // the reconnecting state; the system is leaking traffic. + public void ConfigureRouting(string proxyIp, bool isAutoConnect) + { + try + { + StartSmartDnsBlock(); + eventLog.WriteEntry($"started smartdnsblock"); + } + catch (Exception e) + { + throw new Exception($"could not start smartdnsblock: {e.Message}"); + } + + try + { + GetSystemIpv4Gateway(proxyIp); + + eventLog.WriteEntry($"connecting via gateway at {gatewayIp} on interface {gatewayInterfaceIndex}"); + + // Set the proxy escape route first to prevent a routing loop when capturing all IPv4 traffic. + try + { + AddOrUpdateProxyRoute(proxyIp, gatewayIp, gatewayInterfaceIndex); + eventLog.WriteEntry($"created route to proxy"); + } + catch (Exception e) + { + throw new Exception($"could not create route to proxy: {e.Message}"); + } + this.proxyIp = proxyIp; + + try + { + AddOrUpdateReservedSubnetBypass(gatewayIp, gatewayInterfaceIndex); + eventLog.WriteEntry($"created LAN bypass routes"); + } + catch (Exception e) + { + throw new Exception($"could not create LAN bypass routes: {e.Message}"); + } + } + catch (Exception e) when (isAutoConnect) + { + eventLog.WriteEntry($"could not reconnect during auto-connect: {e.Message}", EventLogEntryType.Warning); + } + + try + { + StopRoutingIpv6(); + eventLog.WriteEntry($"blocked IPv6 traffic"); + } + catch (Exception e) + { + throw new Exception($"could not block IPv6 traffic: {e.Message}"); + } + + try + { + AddIpv4TapRedirect(); + eventLog.WriteEntry($"redirected IPv4 traffic"); + } + catch (Exception e) + { + throw new Exception($"could not redirect IPv4 traffic: {e.Message}"); + } + } + + // Undoes and removes as many as possible of the routes and other + // changes to the system previously made by #ConfigureRouting. + // + // As per #ConfigureRouting, this function is largely idempodent: + // calling it multiple times in succession should be safe and result in + // the same system configuration. + // + // Notes: + // - *This function does not set any error code when any step fails*. + // It probably should, as the system may in some rare cases still be + // connected (or, worse but less likely, bricked). + // - If the service does not know the IP address of the proxy server + // then it *cannot remove that route*. This can happen if the service + // is restarted while Outline is connected *or* (more likely) if this + // function is called while Outline is not connected. This route is + // mostly harmless because it only affects traffic to the proxy and + // if/when the user reconnects to it the route will be updated. + public void ResetRouting(string proxyIp, int gatewayInterfaceIndex) + { + try + { + RemoveIpv4TapRedirect(); + eventLog.WriteEntry($"removed IPv4 redirect"); + } + catch (Exception e) + { + eventLog.WriteEntry($"failed to remove IPv4 redirect: {e.Message}", EventLogEntryType.Error); + } + + try + { + // This is only necessary when disconecting without network connectivity. + StartRoutingIpv4(); + } + catch (Exception) {} + + try + { + StartRoutingIpv6(); + eventLog.WriteEntry($"unblocked IPv6"); + } + catch (Exception e) + { + eventLog.WriteEntry($"failed to unblock IPv6: {e.Message}", EventLogEntryType.Error); + } + + if (proxyIp != null) + { + try + { + DeleteProxyRoute(proxyIp); + eventLog.WriteEntry($"deleted route to proxy"); + } + catch (Exception e) + { + eventLog.WriteEntry($"failed to delete route to proxy: {e.Message}", EventLogEntryType.Error); + } + this.proxyIp = null; + } + + try + { + RemoveReservedSubnetBypass(); + eventLog.WriteEntry($"deleted LAN bypass routes"); + } + catch (Exception e) + { + eventLog.WriteEntry($"failed to delete LAN bypass routes: {e.Message}", EventLogEntryType.Error); + } + this.gatewayIp = null; + + try + { + StopSmartDnsBlock(); + eventLog.WriteEntry($"stopped smartdnsblock"); + } + catch (Exception e) + { + eventLog.WriteEntry($"failed to stop smartdnsblock: {e.Message}", + EventLogEntryType.Warning); + } + } + + // Disable "Smart Multi-Homed Name Resolution", to ensure the system uses only the + // (non-filtered) DNS server(s) associated with the TAP device. + // + // Notes: + // - To show the current firewall rules: + // netsh wfp show filters + // - This website is an easy way to quickly verify there are no DNS leaks: + // https://ipleak.net/ + // - Because .Net provides *no way* to associate the new process with this one, the + // new process will continue to run even if this service is interrupted or crashes. + // Fortunately, since the changes it makes are *not* persistent, the system can, in + // the worst case, be fixed by rebooting. + private void StartSmartDnsBlock() + { + // smartdnsblock.exe must be a sibling of OutlineService.exe. + Process smartDnsBlock = new Process(); + smartDnsBlock.StartInfo.FileName = new DirectoryInfo(Process.GetCurrentProcess().MainModule.FileName).Parent.FullName + + Path.DirectorySeparatorChar + "smartdnsblock.exe"; + smartDnsBlock.StartInfo.UseShellExecute = false; + + smartDnsBlock.StartInfo.RedirectStandardError = true; + smartDnsBlock.StartInfo.RedirectStandardOutput = true; + + // This is for Windows 7: without it, the process exits immediately, presumably + // because stdin isn't connected to anything: + // https://github.com/Jigsaw-Code/outline-client/issues/415 + // + // This seems to make no difference on Windows 8 and 10. + smartDnsBlock.StartInfo.RedirectStandardInput = true; + + ArrayList stdout = new ArrayList(); + ArrayList stderr = new ArrayList(); + smartDnsBlock.OutputDataReceived += (object sender, DataReceivedEventArgs e) => + { + if (!String.IsNullOrEmpty(e.Data)) + { + stdout.Add(e.Data); + } + }; + smartDnsBlock.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => + { + if (!String.IsNullOrEmpty(e.Data)) + { + stderr.Add(e.Data); + } + }; + + try + { + smartDnsBlock.Start(); + smartDnsBlock.BeginOutputReadLine(); + smartDnsBlock.BeginErrorReadLine(); + } + catch (Exception e) + { + throw new Exception($"could not launch smartdnsblock at {smartDnsBlock.StartInfo.FileName}: { e.Message}"); + } + + // This does *not* throw if the process is still running after Nms. + smartDnsBlock.WaitForExit(SMART_DNS_BLOCK_TIMEOUT_MS); + if (smartDnsBlock.HasExited) + { + throw new Exception($"smartdnsblock failed " + $"(stdout: {String.Join(Environment.NewLine, stdout.ToArray())}, " + + $"(stderr: {String.Join(Environment.NewLine, stderr.ToArray())})"); + } + } + + private void StopSmartDnsBlock() + { + try + { + RunCommand("powershell", "stop-process -name smartdnsblock"); + } + catch (Exception e) + { + throw new Exception($"could not stop smartdnsblock: {e.Message}"); + } + } + + private void AddOrUpdateProxyRoute(string proxyIp, string gatewayIp, int gatewayInterfaceIndex) + { + // "netsh interface ipv4 set route" does *not* work for us here + // because it can only be used to change a route's *metric*. + try + { + RunCommand(CMD_ROUTE, $"change {proxyIp} {gatewayIp} if {gatewayInterfaceIndex}"); + } + catch (Exception) + { + RunCommand(CMD_NETSH, $"interface ipv4 add route {proxyIp}/32 nexthop={gatewayIp} interface=\"{gatewayInterfaceIndex}\" metric=0 store=active"); + } + } + + private void DeleteProxyRoute(string proxyIp) + { + // "route" doesn't need to know on which interface or through which + // gateway the route was created. + RunCommand(CMD_ROUTE, $"delete {proxyIp}"); + } + + // Route IPv4 traffic through the TAP device. Instead of deleting the + // default IPv4 gateway (0.0.0.0/0), we resort to creating two more + // specific routes (see IPV4_SUBNETS) that take precedence over the + // default gateway. This way, we need not worry about the default + // gateway being recreated with a lower metric upon device sleep. + // + // This 'hack' was inspired by OpenVPN; see: + // https://github.com/OpenVPN/openvpn3/commit/d08cc059e7132a3d3aee3dcd946fce4c35b1ced3#diff-1d76f0fd7ec04c6d1398288214a879c5R358 + // + // TODO: If these routes exist on a gateway that's not our TAP device, + // it might be a good signal that OpenVPN is active? + private void AddIpv4TapRedirect() + { + foreach (string subnet in IPV4_SUBNETS) + { + try + { + RunCommand(CMD_NETSH, $"interface ipv4 add route {subnet} nexthop={TAP_DEVICE_IP} interface={TAP_DEVICE_NAME} metric=0 store=active"); + } + catch (Exception) + { + RunCommand(CMD_NETSH, $"interface ipv4 set route {subnet} nexthop={TAP_DEVICE_IP} interface={TAP_DEVICE_NAME} metric=0 store=active"); + } + } + } + + private void RemoveIpv4TapRedirect() + { + foreach (string subnet in IPV4_SUBNETS) + { + RunCommand(CMD_NETSH, $"interface ipv4 delete route {subnet} interface={TAP_DEVICE_NAME}"); + } + } + + private void StartRoutingIpv4() + { + foreach (string subnet in IPV4_SUBNETS) + { + RunCommand(CMD_NETSH, $"interface ipv4 delete route {subnet} interface={NetworkInterface.LoopbackInterfaceIndex}"); + } + } + + private void StopRoutingIpv4() + { + foreach (string subnet in IPV4_SUBNETS) + { + try + { + RunCommand(CMD_NETSH, $"interface ipv4 add route {subnet} interface={NetworkInterface.LoopbackInterfaceIndex} metric=0 store=active"); + } + catch (Exception) + { + RunCommand(CMD_NETSH, $"interface ipv4 set route {subnet} interface={NetworkInterface.LoopbackInterfaceIndex} metric=0 store=active"); + } + } + } + + private void StartRoutingIpv6() + { + foreach (string subnet in IPV6_SUBNETS) + { + RunCommand(CMD_NETSH, $"interface ipv6 delete route {subnet} interface={NetworkInterface.IPv6LoopbackInterfaceIndex}"); + } + } + + // Outline does not currently support IPv6, so we resort to disabling it while the VPN is active to + // prevent leakage. Removing the default IPv6 gateway is not enough since it gets re-created + // through router advertisements and DHCP (disabling these or IPv6 routing altogether requires a + // system reboot). Thus, we resort to creating three IPv6 routes (see IPV6_SUBNETS) to the loopback + // interface that are more specific than the default route, causing IPv6 traffic to get dropped. + private void StopRoutingIpv6() + { + foreach (string subnet in IPV6_SUBNETS) + { + try + { + RunCommand(CMD_NETSH, $"interface ipv6 add route {subnet} interface={NetworkInterface.IPv6LoopbackInterfaceIndex} metric=0 store=active"); + } + catch (Exception) + { + RunCommand(CMD_NETSH, $"interface ipv6 set route {subnet} interface={NetworkInterface.IPv6LoopbackInterfaceIndex} metric=0 store=active"); + } + } + } + + // Routes reserved and private subnets through the default gateway so they bypass the VPN. + private void AddOrUpdateReservedSubnetBypass(string gatewayIp, int gatewayInterfaceIndex) + { + foreach (string subnet in IPV4_RESERVED_SUBNETS) + { + try + { + RunCommand(CMD_ROUTE, $"change {subnet} {gatewayIp} if {gatewayInterfaceIndex}"); + } + catch (Exception) + { + RunCommand(CMD_NETSH, $"interface ipv4 add route {subnet} nexthop={gatewayIp} interface=\"{gatewayInterfaceIndex}\" metric=0 store=active"); + } + } + } + + // Removes reserved subnet routes created to bypass the VPN. + private void RemoveReservedSubnetBypass() + { + foreach (string subnet in IPV4_RESERVED_SUBNETS) + { + RunCommand(CMD_ROUTE, $"delete {subnet}"); + } + } + + // Runs a shell command synchronously. + private void RunCommand(string cmd, string args) + { + Console.WriteLine($"running command: {cmd} {args}"); + + var startInfo = new ProcessStartInfo(cmd); + startInfo.Arguments = args; + startInfo.UseShellExecute = false; + startInfo.RedirectStandardError = true; + startInfo.RedirectStandardOutput = true; + startInfo.CreateNoWindow = true; + + Process p = new Process(); + var stdout = new StringBuilder(); + var stderr = new StringBuilder(); + p.OutputDataReceived += (object sender, DataReceivedEventArgs e) => + { + if (e == null || String.IsNullOrWhiteSpace(e.Data)) + { + return; + } + stdout.Append(e.Data); + }; + p.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => + { + if (e == null || String.IsNullOrWhiteSpace(e.Data)) + { + return; + } + stderr.Append(e.Data); + }; + p.StartInfo = startInfo; + p.Start(); + p.BeginOutputReadLine(); + p.BeginErrorReadLine(); + p.WaitForExit(); + + // "route" is weird and always exits with zero: we have to examine + // stderr to detect its errors. + if (p.ExitCode != 0 || stderr.ToString().Length > 0) + { + // NOTE: Do *not* add args to this error message because it's piped + // back to the client for inclusion in Sentry reports and + // effectively contain access keys. + throw new Exception($"command exited with {p.ExitCode} " + + $"(stdout: {stdout.ToString()}, stderr: {stderr.ToString()})"); + } + } + + // Searches the system's routing table for the best route to the + // specified IP address *that does not route through the TAP device*. + // + // That last requirement - ignoring the TAP device - is what prevents us + // from simply calling GetBestRoute: other than that, it does all the + // work of finding the lowest-weighted gateway to the destination IP. + // + // NOTE: This function does not *always* find the best gateway: it + // currently only considers "default" gateways (0.0.0.0) which may not + // work in some rare cases. Several re-implementations of the Windows + // API illustrate how we could more closely match GetBestRoute: + // - https://github.com/wine-mirror/wine/blob/master/dlls/iphlpapi/iphlpapi_main.c + // - https://github.com/reactos/reactos/blob/master/dll/win32/iphlpapi/iphlpapi_main.c + private void GetSystemIpv4Gateway(string proxyIp) + { + gatewayIp = null; + gatewayInterfaceIndex = -1; + + int tapInterfaceIndex; + try + { + tapInterfaceIndex = NetworkInterface.GetAllNetworkInterfaces() + .Where(i => i.Name == TAP_DEVICE_NAME) + .FirstOrDefault() + .GetIPProperties() + .GetIPv4Properties().Index; + } + catch (Exception) + { + throw new Exception("TAP device not found"); + } + + // Some marshalling craziness follows: we have to first ask + // GetIpForwardTable how much memory is required to hold the routing + // table before calling it again to actually return us the table; + // once we have the table, we have to iterate over the rows + // (thankfully, MIB_IPFORWARDROW marshalls easily). + int bufferSize = 0; + if (GetIpForwardTable(IntPtr.Zero, ref bufferSize, true) != ERROR_INSUFFICIENT_BUFFER) + { + throw new Exception("could not fetch routing table"); + } + var buffer = Marshal.AllocHGlobal(bufferSize); + if (GetIpForwardTable(buffer, ref bufferSize, true) != 0) + { + Marshal.FreeHGlobal(buffer); + throw new Exception("could not fetch routing table"); + } + + // NOTE: We deliberately *do not marshal the entire + // MIB_IPFORWARDTABLE* owing to unexplained crashes following + // suspend/resume. Fortunately, since that structure is + // logically just a DWORD followed by an array, this entails + // little extra work. + var numEntries = Marshal.ReadInt32(buffer); + MIB_IPFORWARDROW bestRow = null; + var rowPtr = buffer + Marshal.SizeOf(numEntries); + for (int i = 0; i < numEntries; i++) + { + MIB_IPFORWARDROW row = (MIB_IPFORWARDROW)Marshal.PtrToStructure(rowPtr, typeof(MIB_IPFORWARDROW)); + + // Must be a gateway (see note above on how we can improve this). + if (row.dwForwardDest != 0) + { + continue; + } + + // Must not be the TAP device. + if (row.dwForwardIfIndex == tapInterfaceIndex) + { + continue; + } + + if (bestRow == null || row.dwForwardMetric1 < bestRow.dwForwardMetric1) + { + bestRow = row; + } + + rowPtr += Marshal.SizeOf(typeof(MIB_IPFORWARDROW)); + } + + Marshal.FreeHGlobal(buffer); + + if (bestRow == null) + { + throw new Exception("no gateway found"); + } + + gatewayIp = new IPAddress(BitConverter.GetBytes(bestRow.dwForwardNextHop)).ToString(); + gatewayInterfaceIndex = bestRow.dwForwardIfIndex; + } + + // Updates, if Outline is connected, the routing table to reflect a new + // gateway. + // + // There's really just one thing to do when the gateway changes: update + // the (direct) route to the proxy server to route through the new + // gateway. If there is no gateway, e.g. because the system has lost + // network connectivity, notify the client and keep the IPv4 redirect + // and IPv6 block in place: this helps prevent leaking traffic. + // + // Notes: + // - *This function must not throw*. If it does, the handler is unset. + // - This function also updates two further sets of routes: the LAN + // bypass routes (which must route through the gateway) and the IPv4 + // redirect routes (which "fall back" to the system gateway once the + // TAP device temporarily disappears due to tun2socks' exit). + // - The NetworkChange.NetworkAddressChanged callback is *extremely + // noisy*. In particular, it seems to be called twice for every + // change to the routing table. There does not seem to be any useful + // information in the supplied EventArgs. This is partly why we don't + // touch the routing table unless the gateway has actually changed. + // - This function may be called while #ConfigureRouting is still + // running. This is partly why we exit early (at the top) if we don't + // think Outline is connected. + private void NetworkAddressChanged(object sender, EventArgs evt) + { + if (proxyIp == null) + { + eventLog.WriteEntry("network changed but Outline is not connected - doing nothing"); + return; + } + + var previousGatewayIp = gatewayIp; + var previousGatewayInterfaceIndex = gatewayInterfaceIndex; + + try + { + GetSystemIpv4Gateway(proxyIp); + } + catch (Exception e) + { + eventLog.WriteEntry($"network changed but no gateway found: {e.Message}"); + } + + if (previousGatewayIp == gatewayIp && previousGatewayInterfaceIndex == gatewayInterfaceIndex) + { + // Only send on actual change, to prevent duplicate notifications (mostly + // harmless but can make debugging harder). + eventLog.WriteEntry($"network changed but gateway and interface stayed the same"); + return; + } + else if (gatewayIp == null) + { + SendConnectionStatusChange(ConnectionStatus.Reconnecting); + + // Stop capturing IPv4 traffic in order to prevent a routing loop in the TAP device. + // Redirect IPv4 traffic to the loopback interface instead to avoid leaking traffic when + // the network becomes available. + try + { + StopRoutingIpv4(); + RemoveIpv4TapRedirect(); + eventLog.WriteEntry($"stopped routing IPv4 traffic"); + } + catch (Exception e) + { + eventLog.WriteEntry($"failed to stop routing IPv4: {e.Message}", EventLogEntryType.Error); + } + return; + } + + eventLog.WriteEntry($"network changed - gateway is now {gatewayIp} on interface {gatewayInterfaceIndex}"); + + // Add the proxy escape route before capturing IPv4 traffic to prevent a routing loop in the TAP device. + try + { + AddOrUpdateProxyRoute(proxyIp, gatewayIp, gatewayInterfaceIndex); + eventLog.WriteEntry($"updated route to proxy"); + } + catch (Exception e) + { + eventLog.WriteEntry($"could not update route to proxy: {e.Message}"); + return; + } + + try + { + AddIpv4TapRedirect(); + StartRoutingIpv4(); + eventLog.WriteEntry($"refreshed IPv4 redirect"); + } + catch (Exception e) + { + eventLog.WriteEntry($"could not refresh IPv4 redirect: {e.Message}"); + return; + } + + // Send the status update now that the full-system VPN is connected. + SendConnectionStatusChange(ConnectionStatus.Connected); + + try + { + AddOrUpdateReservedSubnetBypass(gatewayIp, gatewayInterfaceIndex); + eventLog.WriteEntry($"updated LAN bypass routes"); + } + catch (Exception e) + { + // TODO: This isn't quite right: because we successfully updated + // the route to the proxy, the client *is* connected; it's + // just not "fully" connected, in the way we like. We + // should distinguish between "cannot reconnect right now, + // because no internet" and "cannot reconnect because + // netsh commands are failing". + eventLog.WriteEntry($"could not update LAN bypass routes: {e.Message}"); + return; + } + } + + // Writes the connection status to the pipe, if it is connected. + private void SendConnectionStatusChange(ConnectionStatus status) + { + if (pipe == null || !pipe.IsConnected) + { + eventLog.WriteEntry("Cannot send connection status change, pipe not connected.", EventLogEntryType.Error); + return; + } + ServiceResponse response = new ServiceResponse(); + response.action = ACTION_STATUS_CHANGED; + response.statusCode = (int)ErrorCode.Success; + response.connectionStatus = (int)status; + try + { + WriteResponse(response); + } + catch (Exception e) + { + eventLog.WriteEntry($"Failed to send connection status change: {e.Message}"); + } + } + + public string GetNetworkInfo() + { + return String.Join(", ", NetworkInterface.GetAllNetworkInterfaces() + .Select(a => this.GetAdapterInfo(a))); + } + + private string GetAdapterInfo(NetworkInterface adapter) + { + var numIpv4Gateways = adapter.GetIPProperties().GatewayAddresses + .Select(g => g.Address) + .Where(a => a.AddressFamily == AddressFamily.InterNetwork) + .Count(); + var numIpv6Gateways = adapter.GetIPProperties().GatewayAddresses + .Select(g => g.Address) + .Where(a => a.AddressFamily == AddressFamily.InterNetworkV6) + .Count(); + + return $"{adapter.Name} ({adapter.OperationalStatus}): " + ( + adapter.Supports(NetworkInterfaceComponent.IPv4) ? + $"{numIpv4Gateways} x ipv4 gateways" : + "ipv4 disabled") + ", " + ( + adapter.Supports(NetworkInterfaceComponent.IPv6) ? + $"{numIpv6Gateways} x ipv6 gateways" : + "ipv6 disabled"); + } + } + + [DataContract] + internal class ServiceRequest + { + [DataMember] + internal string action; + [DataMember] + internal Dictionary parameters; + } + + [DataContract] + internal class ServiceResponse + { + [DataMember] + internal string action; + [DataMember] + internal int statusCode; + [DataMember] + internal string errorMessage; + [DataMember] + internal int connectionStatus; + } + + public enum ErrorCode + { + Success = 0, + GenericFailure = 1 + } + + public enum ConnectionStatus + { + Connected = 0, + Disconnected = 1, + Reconnecting = 2 + } +} diff --git a/tools/OutlineService/OutlineService/OutlineService.csproj b/tools/OutlineService/OutlineService/OutlineService.csproj index 7a8947f723..4fac6eb2ea 100755 --- a/tools/OutlineService/OutlineService/OutlineService.csproj +++ b/tools/OutlineService/OutlineService/OutlineService.csproj @@ -1,92 +1,92 @@ - - - - - Debug - AnyCPU - {F39A4491-9868-4A71-9BE1-980FADE10AC9} - WinExe - OutlineService - OutlineService - v4.6.1 - 512 - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - true - - - bin\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - true - - - - ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - Component - - - OutlineService.cs - - - - - - - - - - - OutlineService.cs - - - - - - + + + + + Debug + AnyCPU + {F39A4491-9868-4A71-9BE1-980FADE10AC9} + WinExe + OutlineService + OutlineService + v4.6.1 + 512 + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + true + + + bin\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + true + + + + ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + Component + + + OutlineService.cs + + + + + + + + + + + OutlineService.cs + + + + + + \ No newline at end of file diff --git a/tools/OutlineService/OutlineService/OutlineService.resx b/tools/OutlineService/OutlineService/OutlineService.resx index 1a80cdd6e7..0129fa82a5 100755 --- a/tools/OutlineService/OutlineService/OutlineService.resx +++ b/tools/OutlineService/OutlineService/OutlineService.resx @@ -1,123 +1,123 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + \ No newline at end of file diff --git a/tools/OutlineService/OutlineService/Program.cs b/tools/OutlineService/OutlineService/Program.cs index bb9d7ee7dd..62d8c9b47d 100755 --- a/tools/OutlineService/OutlineService/Program.cs +++ b/tools/OutlineService/OutlineService/Program.cs @@ -1,70 +1,70 @@ -// Copyright 2018 The Outline Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.ServiceProcess; -using System.Text; -using System.Threading.Tasks; - -namespace OutlineService -{ - static class Program - { - static void Main(string[] args) - { - if (!Environment.UserInteractive) - { - ServiceBase[] ServicesToRun; - ServicesToRun = new ServiceBase[] { new OutlineService() }; - ServiceBase.Run(ServicesToRun); - } - else - { - var service = new OutlineService(); - // To run as a service from the command-line: - // service.OnStart(null); - // System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); - if (args.Length < 2) - { - ShowUsageAndExit(); - } - switch (args[0]) - { - case "on": - service.ConfigureRouting(args[1], false); - break; - case "off": - if (args.Length < 3) - { - ShowUsageAndExit(); - } - service.ResetRouting(args[1], Int32.Parse(args[2])); - break; - default: - ShowUsageAndExit(); - break; - } - Console.WriteLine($"network config: {service.GetNetworkInfo()}"); - } - } - - static void ShowUsageAndExit() - { - Console.WriteLine("usage: on |off "); - Environment.Exit(1); - } - } -} // namespace OutlineService +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceProcess; +using System.Text; +using System.Threading.Tasks; + +namespace OutlineService +{ + static class Program + { + static void Main(string[] args) + { + if (!Environment.UserInteractive) + { + ServiceBase[] ServicesToRun; + ServicesToRun = new ServiceBase[] { new OutlineService() }; + ServiceBase.Run(ServicesToRun); + } + else + { + var service = new OutlineService(); + // To run as a service from the command-line: + // service.OnStart(null); + // System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite); + if (args.Length < 2) + { + ShowUsageAndExit(); + } + switch (args[0]) + { + case "on": + service.ConfigureRouting(args[1], false); + break; + case "off": + if (args.Length < 3) + { + ShowUsageAndExit(); + } + service.ResetRouting(args[1], Int32.Parse(args[2])); + break; + default: + ShowUsageAndExit(); + break; + } + Console.WriteLine($"network config: {service.GetNetworkInfo()}"); + } + } + + static void ShowUsageAndExit() + { + Console.WriteLine("usage: on |off "); + Environment.Exit(1); + } + } +} // namespace OutlineService diff --git a/tools/OutlineService/OutlineService/Properties/AssemblyInfo.cs b/tools/OutlineService/OutlineService/Properties/AssemblyInfo.cs index fc957bac77..20c3e92b6c 100755 --- a/tools/OutlineService/OutlineService/Properties/AssemblyInfo.cs +++ b/tools/OutlineService/OutlineService/Properties/AssemblyInfo.cs @@ -1,50 +1,50 @@ -// Copyright 2018 The Outline Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OutlineService")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("OutlineService")] -[assembly: AssemblyCopyright("Copyright © 2018")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f39a4491-9868-4a71-9be1-980fade10ac9")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +// Copyright 2018 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OutlineService")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OutlineService")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f39a4491-9868-4a71-9be1-980fade10ac9")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tools/OutlineService/OutlineService/bin/Release/OutlineService.exe.config b/tools/OutlineService/OutlineService/bin/Release/OutlineService.exe.config index 6a19d29ee0..c37a182b77 100755 --- a/tools/OutlineService/OutlineService/bin/Release/OutlineService.exe.config +++ b/tools/OutlineService/OutlineService/bin/Release/OutlineService.exe.config @@ -1,21 +1,21 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/tools/OutlineService/OutlineService/packages.config b/tools/OutlineService/OutlineService/packages.config index 27e210f08a..5762754177 100755 --- a/tools/OutlineService/OutlineService/packages.config +++ b/tools/OutlineService/OutlineService/packages.config @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file