forked from vial-kb/vial-qmk
-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'vial-kb:vial' into chameleon
Showing
23,465 changed files
with
784,838 additions
and
1,099,201 deletions.
The diff you're trying to view is too large. We only load the first 3000 changed files.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
CompileFlags: | ||
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option] | ||
Remove: [-W*, -mcall-prologues] | ||
Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues] | ||
Compiler: clang |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
name: CI Build Major Branch | ||
|
||
permissions: | ||
contents: read | ||
actions: write | ||
|
||
on: | ||
push: | ||
branches: [master, develop] | ||
workflow_dispatch: | ||
inputs: | ||
branch: | ||
type: choice | ||
description: "Branch to build" | ||
options: [master, develop] | ||
|
||
env: | ||
# https://docs.github.com/en/actions/learn-github-actions/usage-limits-billing-and-administration#usage-limits | ||
# We've decreased it from 20 to 15 to allow for other GHA to run unimpeded | ||
CONCURRENT_JOBS: 15 | ||
|
||
# Ensure we only have one build running at a time, cancelling any active builds if a new commit is pushed to the respective branch | ||
concurrency: | ||
group: ci_build-${{ github.event.inputs.branch || github.ref_name }} | ||
cancel-in-progress: true | ||
|
||
jobs: | ||
determine_concurrency: | ||
name: "Determine concurrency" | ||
if: github.repository == 'qmk/qmk_firmware' | ||
runs-on: ubuntu-latest | ||
container: ghcr.io/qmk/qmk_cli | ||
|
||
outputs: | ||
slice_length: ${{ steps.generate_slice_length.outputs.slice_length }} | ||
|
||
steps: | ||
- name: Install prerequisites | ||
run: | | ||
apt-get update | ||
apt-get install -y jq | ||
- name: Disable safe.directory check | ||
run: | | ||
git config --global --add safe.directory '*' | ||
- name: Checkout QMK Firmware | ||
uses: actions/checkout@v4 | ||
|
||
- name: Determine concurrency | ||
id: generate_slice_length | ||
run: | | ||
target_count=$( { | ||
qmk find -km default 2>/dev/null | ||
qmk find -km via 2>/dev/null | ||
} | sort | uniq | wc -l) | ||
slice_length=$((target_count / ($CONCURRENT_JOBS - 1))) # Err on the side of caution as we're splitting default and via | ||
echo "slice_length=$slice_length" >> $GITHUB_OUTPUT | ||
build_targets: | ||
name: "Compile keymap ${{ matrix.keymap }}" | ||
needs: determine_concurrency | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
keymap: [default, via] | ||
uses: ./.github/workflows/ci_build_major_branch_keymap.yml | ||
with: | ||
branch: ${{ inputs.branch || github.ref_name }} | ||
keymap: ${{ matrix.keymap }} | ||
slice_length: ${{ needs.determine_concurrency.outputs.slice_length }} | ||
secrets: inherit | ||
|
||
rollup_tasks: | ||
name: "Consolidation" | ||
needs: build_targets | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- name: Download firmwares | ||
uses: actions/download-artifact@v4 | ||
with: | ||
pattern: firmware-* | ||
path: firmwares | ||
merge-multiple: true | ||
|
||
- name: Upload to https://ci.qmk.fm/${{ inputs.branch || github.ref_name }}/${{ github.sha }} | ||
uses: jakejarvis/s3-sync-action@master | ||
with: | ||
args: --acl public-read --follow-symlinks --delete | ||
env: | ||
AWS_S3_BUCKET: ${{ vars.CI_QMK_FM_SPACES_BUCKET }} | ||
AWS_ACCESS_KEY_ID: ${{ secrets.CI_QMK_FM_SPACES_KEY }} | ||
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_QMK_FM_SPACES_SECRET }} | ||
AWS_REGION: ${{ vars.CI_QMK_FM_SPACES_REGION }} | ||
AWS_S3_ENDPOINT: ${{ vars.CI_QMK_FM_SPACES_ENDPOINT }} | ||
SOURCE_DIR: firmwares | ||
DEST_DIR: ${{ inputs.branch || github.ref_name }}/${{ github.sha }} | ||
|
||
- name: Upload to https://ci.qmk.fm/${{ inputs.branch || github.ref_name }}/latest | ||
uses: jakejarvis/s3-sync-action@master | ||
with: | ||
args: --acl public-read --follow-symlinks --delete | ||
env: | ||
AWS_S3_BUCKET: ${{ vars.CI_QMK_FM_SPACES_BUCKET }} | ||
AWS_ACCESS_KEY_ID: ${{ secrets.CI_QMK_FM_SPACES_KEY }} | ||
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_QMK_FM_SPACES_SECRET }} | ||
AWS_REGION: ${{ vars.CI_QMK_FM_SPACES_REGION }} | ||
AWS_S3_ENDPOINT: ${{ vars.CI_QMK_FM_SPACES_ENDPOINT }} | ||
SOURCE_DIR: firmwares | ||
DEST_DIR: ${{ inputs.branch || github.ref_name }}/latest | ||
|
||
- name: Check if failure marker file exists | ||
id: check_failure_marker | ||
uses: andstor/file-existence-action@v3 | ||
with: | ||
files: firmwares/.failed | ||
|
||
- name: Fail build if needed | ||
if: steps.check_failure_marker.outputs.files_exists == 'true' | ||
run: | | ||
# Exit with failure if the compilation stage failed | ||
exit 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
name: CI Build Major Branch Keymap | ||
|
||
permissions: | ||
contents: read | ||
actions: write | ||
|
||
on: | ||
workflow_call: | ||
inputs: | ||
branch: | ||
type: string | ||
required: true | ||
keymap: | ||
type: string | ||
required: true | ||
slice_length: | ||
type: string | ||
required: true | ||
|
||
jobs: | ||
generate_targets: | ||
name: "Generate targets (${{ inputs.keymap }})" | ||
runs-on: ubuntu-latest | ||
container: ghcr.io/qmk/qmk_cli | ||
|
||
outputs: | ||
targets: ${{ steps.generate_targets.outputs.targets }} | ||
|
||
steps: | ||
- name: Install prerequisites | ||
run: | | ||
apt-get update | ||
apt-get install -y jq | ||
- name: Disable safe.directory check | ||
run: | | ||
git config --global --add safe.directory '*' | ||
- name: Checkout QMK Firmware | ||
uses: actions/checkout@v4 | ||
|
||
- name: Generate build targets | ||
id: generate_targets | ||
run: | | ||
{ # Intentionally use `shuf` here so that we share manufacturers across all build groups -- some have a lot of ARM-based boards which inherently take longer | ||
counter=0 | ||
echo -n '{' | ||
qmk find -km ${{ inputs.keymap }} 2>/dev/null | sort | uniq | shuf | xargs -L${{ inputs.slice_length }} | while IFS=$'\n' read target ; do | ||
if [ $counter -gt 0 ]; then | ||
echo -n ',' | ||
fi | ||
counter=$((counter+1)) | ||
printf "\"group %02d\":{" $counter | ||
echo -n '"targets":"' | ||
echo $target | tr ' ' '\n' | sort | uniq | xargs echo -n | ||
echo -n '"}' | ||
done | ||
echo -n '}' | ||
} | sed -e 's@\n@@g' > targets.json | ||
# Output the target keys as a variable | ||
echo "targets=$(jq -c 'keys' targets.json)" >> $GITHUB_OUTPUT | ||
- name: Upload targets json | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: targets-${{ inputs.keymap }} | ||
path: targets.json | ||
|
||
build_targets: | ||
name: "Compile ${{ matrix.target }} (${{ inputs.keymap }})" | ||
needs: generate_targets | ||
runs-on: ubuntu-latest | ||
container: ghcr.io/qmk/qmk_cli | ||
continue-on-error: true | ||
|
||
strategy: | ||
matrix: | ||
target: ${{ fromJson(needs.generate_targets.outputs.targets) }} | ||
|
||
steps: | ||
- name: Install prerequisites | ||
run: | | ||
apt-get update | ||
apt-get install -y jq | ||
- name: Disable safe.directory check | ||
run: | | ||
git config --global --add safe.directory '*' | ||
- name: Checkout QMK Firmware | ||
uses: actions/checkout@v4 | ||
|
||
- name: Get target definitions | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: targets-${{ inputs.keymap }} | ||
path: . | ||
|
||
- name: Deploy submodules | ||
run: | | ||
qmk git-submodule -f | ||
- name: Dump targets | ||
run: | | ||
jq -r '.["${{ matrix.target }}"].targets' targets.json | tr ' ' '\n' | sort | ||
- name: Build targets | ||
continue-on-error: true | ||
run: | | ||
export NCPUS=$(( $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null) -1 )) | ||
qmk mass-compile -t -j $NCPUS -e DUMP_CI_METADATA=yes $(jq -r '.["${{ matrix.target }}"].targets' targets.json) || touch .failed | ||
- name: Upload binaries | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: firmware-${{ inputs.keymap }}-${{ matrix.target }} | ||
if-no-files-found: ignore | ||
path: | | ||
*.bin | ||
*.hex | ||
*.uf2 | ||
.build/failed.* | ||
.failed | ||
- name: Fail build if any group failed | ||
run: | | ||
# Exit with failure if the compilation stage failed | ||
[ ! -f .failed ] || exit 1 | ||
repack_firmware: | ||
if: always() | ||
name: "Repack artifacts" | ||
needs: build_targets | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- name: Checkout QMK Firmware | ||
uses: actions/checkout@v4 | ||
|
||
- name: Download firmwares | ||
uses: actions/download-artifact@v4 | ||
with: | ||
pattern: firmware-${{ inputs.keymap }}-* | ||
path: . | ||
merge-multiple: true | ||
|
||
- name: Upload all firmwares | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: firmware-${{ inputs.keymap }} | ||
if-no-files-found: ignore | ||
path: | | ||
*.bin | ||
*.hex | ||
*.uf2 | ||
.build/failed.* | ||
.failed | ||
- name: Generate output logs | ||
run: | | ||
# Generate the step summary markdown | ||
./util/ci/generate_failure_markdown.sh > $GITHUB_STEP_SUMMARY || true | ||
# Truncate to a maximum of 1MB to deal with GitHub workflow limit | ||
truncate --size='<960K' $GITHUB_STEP_SUMMARY || true | ||
- name: Delete temporary build artifacts | ||
uses: geekyeggo/delete-artifact@v5 | ||
with: | ||
name: | | ||
firmware-${{ inputs.keymap }}-* | ||
targets-${{ inputs.keymap }} | ||
- name: 'CI Discord Notification' | ||
if: always() | ||
working-directory: util/ci/ | ||
env: | ||
DISCORD_WEBHOOK: ${{ secrets.CI_DISCORD_WEBHOOK }} | ||
run: | | ||
python3 -m pip install -r requirements.txt | ||
python3 ./discord-results.py --branch ${{ inputs.branch || github.ref_name }} --keymap ${{ inputs.keymap }} --url ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
node_modules | ||
.vitepress/cache | ||
.vitepress/.temp | ||
.vitepress/dist | ||
docs |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
import { defineConfig } from "vitepress"; | ||
import { tabsMarkdownPlugin } from "vitepress-plugin-tabs"; | ||
import sidebar from "../../../docs/_sidebar.json"; | ||
|
||
// https://vitepress.dev/reference/site-config | ||
export default defineConfig(({ mode }) => { | ||
const prod = mode === "production"; | ||
return { | ||
title: "QMK Firmware", | ||
description: "Documentation for QMK Firmware", | ||
|
||
srcDir: prod ? "docs" : "../../docs", | ||
outDir: "../../.build/docs", | ||
cleanUrls: true, | ||
|
||
markdown: { | ||
config(md) { | ||
md.use(tabsMarkdownPlugin); | ||
}, | ||
}, | ||
|
||
vite: { | ||
resolve: { | ||
preserveSymlinks: true, | ||
}, | ||
}, | ||
|
||
themeConfig: { | ||
// https://vitepress.dev/reference/default-theme-config | ||
logo: { | ||
light: "/qmk-logo-light.svg", | ||
dark: "/qmk-logo-dark.svg", | ||
}, | ||
title: 'QMK Firmware', | ||
|
||
nav: [{ text: "Home", link: "./" }], | ||
|
||
search: { | ||
provider: "local", | ||
}, | ||
|
||
sidebar: sidebar, | ||
|
||
socialLinks: [ | ||
{ icon: { svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 29 3 C 28.0625 3 27.164063 3.382813 26.5 4 C 25.835938 4.617188 25.363281 5.433594 25 6.40625 C 24.355469 8.140625 24.085938 10.394531 24.03125 13.03125 C 19.234375 13.179688 14.820313 14.421875 11.28125 16.46875 C 10.214844 15.46875 8.855469 14.96875 7.5 14.96875 C 6.089844 14.96875 4.675781 15.511719 3.59375 16.59375 C 1.425781 18.761719 1.425781 22.238281 3.59375 24.40625 L 3.84375 24.65625 C 3.3125 26.035156 3 27.488281 3 29 C 3 33.527344 5.566406 37.585938 9.5625 40.4375 C 13.558594 43.289063 19.007813 45 25 45 C 30.992188 45 36.441406 43.289063 40.4375 40.4375 C 44.433594 37.585938 47 33.527344 47 29 C 47 27.488281 46.6875 26.035156 46.15625 24.65625 L 46.40625 24.40625 C 48.574219 22.238281 48.574219 18.761719 46.40625 16.59375 C 45.324219 15.511719 43.910156 14.96875 42.5 14.96875 C 41.144531 14.96875 39.785156 15.46875 38.71875 16.46875 C 35.195313 14.433594 30.800781 13.191406 26.03125 13.03125 C 26.09375 10.546875 26.363281 8.46875 26.875 7.09375 C 27.164063 6.316406 27.527344 5.757813 27.875 5.4375 C 28.222656 5.117188 28.539063 5 29 5 C 29.460938 5 29.683594 5.125 30.03125 5.40625 C 30.378906 5.6875 30.785156 6.148438 31.3125 6.6875 C 32.253906 7.652344 33.695313 8.714844 36.09375 8.9375 C 36.539063 11.238281 38.574219 13 41 13 C 43.75 13 46 10.75 46 8 C 46 5.25 43.75 3 41 3 C 38.605469 3 36.574219 4.710938 36.09375 6.96875 C 34.3125 6.796875 33.527344 6.109375 32.75 5.3125 C 32.300781 4.851563 31.886719 4.3125 31.3125 3.84375 C 30.738281 3.375 29.9375 3 29 3 Z M 41 5 C 42.667969 5 44 6.332031 44 8 C 44 9.667969 42.667969 11 41 11 C 39.332031 11 38 9.667969 38 8 C 38 6.332031 39.332031 5 41 5 Z M 25 15 C 30.609375 15 35.675781 16.613281 39.28125 19.1875 C 42.886719 21.761719 45 25.226563 45 29 C 45 32.773438 42.886719 36.238281 39.28125 38.8125 C 35.675781 41.386719 30.609375 43 25 43 C 19.390625 43 14.324219 41.386719 10.71875 38.8125 C 7.113281 36.238281 5 32.773438 5 29 C 5 25.226563 7.113281 21.761719 10.71875 19.1875 C 14.324219 16.613281 19.390625 15 25 15 Z M 7.5 16.9375 C 8.203125 16.9375 8.914063 17.148438 9.53125 17.59375 C 7.527344 19.03125 5.886719 20.769531 4.75 22.71875 C 3.582031 21.296875 3.660156 19.339844 5 18 C 5.714844 17.285156 6.609375 16.9375 7.5 16.9375 Z M 42.5 16.9375 C 43.390625 16.9375 44.285156 17.285156 45 18 C 46.339844 19.339844 46.417969 21.296875 45.25 22.71875 C 44.113281 20.769531 42.472656 19.03125 40.46875 17.59375 C 41.085938 17.148438 41.796875 16.9375 42.5 16.9375 Z M 17 22 C 14.800781 22 13 23.800781 13 26 C 13 28.199219 14.800781 30 17 30 C 19.199219 30 21 28.199219 21 26 C 21 23.800781 19.199219 22 17 22 Z M 33 22 C 30.800781 22 29 23.800781 29 26 C 29 28.199219 30.800781 30 33 30 C 35.199219 30 37 28.199219 37 26 C 37 23.800781 35.199219 22 33 22 Z M 17 24 C 18.117188 24 19 24.882813 19 26 C 19 27.117188 18.117188 28 17 28 C 15.882813 28 15 27.117188 15 26 C 15 24.882813 15.882813 24 17 24 Z M 33 24 C 34.117188 24 35 24.882813 35 26 C 35 27.117188 34.117188 28 33 28 C 31.882813 28 31 27.117188 31 26 C 31 24.882813 31.882813 24 33 24 Z M 34.15625 33.84375 C 34.101563 33.851563 34.050781 33.859375 34 33.875 C 33.683594 33.9375 33.417969 34.144531 33.28125 34.4375 C 33.28125 34.4375 32.757813 35.164063 31.4375 36 C 30.117188 36.835938 28.058594 37.6875 25 37.6875 C 21.941406 37.6875 19.882813 36.835938 18.5625 36 C 17.242188 35.164063 16.71875 34.4375 16.71875 34.4375 C 16.492188 34.082031 16.066406 33.90625 15.65625 34 C 15.332031 34.082031 15.070313 34.316406 14.957031 34.632813 C 14.84375 34.945313 14.894531 35.292969 15.09375 35.5625 C 15.09375 35.5625 15.863281 36.671875 17.46875 37.6875 C 19.074219 38.703125 21.558594 39.6875 25 39.6875 C 28.441406 39.6875 30.925781 38.703125 32.53125 37.6875 C 34.136719 36.671875 34.90625 35.5625 34.90625 35.5625 C 35.207031 35.273438 35.296875 34.824219 35.128906 34.441406 C 34.960938 34.058594 34.574219 33.820313 34.15625 33.84375 Z"/></svg>' }, link: "https://reddit.com/r/olkb" }, | ||
{ icon: "discord", link: "https://discord.gg/qmk" }, | ||
{ icon: "github", link: "https://github.com/qmk/qmk_firmware" }, | ||
], | ||
} | ||
}; | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<script setup> | ||
import DefaultTheme from 'vitepress/theme' | ||
import { useRouter } from 'vitepress' | ||
import { onBeforeMount } from 'vue'; | ||
import aliases from "../../../../docs/_aliases.json"; | ||
const router = useRouter() | ||
onBeforeMount(async () => { | ||
// Convert from docsify-style to vitepress-style URLs | ||
let newUrl = window.location.href.replace(/\/#\//, '/').replace(/\?id=/, '#'); | ||
// Convert any aliases | ||
let testUrl = new URL(newUrl); | ||
while (testUrl.pathname in aliases) { | ||
testUrl.pathname = aliases[testUrl.pathname]; | ||
} | ||
newUrl = testUrl.toString(); | ||
// Redirect if required | ||
if (newUrl != window.location.href) { | ||
window.history.replaceState({}, '', newUrl); | ||
await router.go(newUrl); | ||
} | ||
}); | ||
</script> | ||
|
||
<template> | ||
<DefaultTheme.Layout/> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* Override <kbd> as vitepress doesn't put them with borders */ | ||
kbd { | ||
border: 1px solid var(--vp-c-text-1); | ||
border-radius: 5px; | ||
margin: 0.2em; | ||
padding: 0.2em; | ||
} | ||
|
||
:root { | ||
--vp-nav-logo-height: 32px; | ||
|
||
--vp-layout-max-width: calc(98% + 64px); | ||
|
||
--vp-sidebar-width: 300px; | ||
} | ||
|
||
.VPDoc.has-aside .content-container { | ||
max-width: unset !important; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import type { Theme } from 'vitepress' | ||
import DefaultTheme from 'vitepress/theme' | ||
import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client' | ||
import QMKLayout from './QMKLayout.vue' | ||
import './custom.css' | ||
|
||
export default { | ||
extends: DefaultTheme, | ||
Layout: QMKLayout, | ||
enhanceApp({ app }) { | ||
enhanceAppWithTabs(app) | ||
} | ||
} satisfies Theme |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#!/usr/bin/env bash | ||
|
||
cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")" | ||
yarn install | ||
[[ -e docs ]] || ln -sf ../../docs docs | ||
DEBUG='vitepress:*,vite:*' yarn run docs:build |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
{ | ||
"license": "GPL-2.0-or-later", | ||
"devDependencies": { | ||
"vite": "^5.2.10", | ||
"vitepress": "^1.1.0", | ||
"vitepress-plugin-tabs": "^0.5.0", | ||
"vue": "^3.4.24" | ||
}, | ||
"scripts": { | ||
"docs:dev": "vitepress dev --host 0.0.0.0", | ||
"docs:build": "vitepress build", | ||
"docs:preview": "vitepress preview --host 0.0.0.0" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
#!/usr/bin/env bash | ||
|
||
cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")" | ||
yarn install | ||
DEBUG='vitepress:*,vite:*' yarn run docs:dev |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
407 changes: 407 additions & 0 deletions
407
data/constants/keycodes/extras/keycodes_canadian_french_0.0.1.hjson
Large diffs are not rendered by default.
Oops, something went wrong.
580 changes: 580 additions & 0 deletions
580
data/constants/keycodes/extras/keycodes_czech_mac_ansi_0.0.1.hjson
Large diffs are not rendered by default.
Oops, something went wrong.
580 changes: 580 additions & 0 deletions
580
data/constants/keycodes/extras/keycodes_czech_mac_iso_0.0.1.hjson
Large diffs are not rendered by default.
Oops, something went wrong.
343 changes: 343 additions & 0 deletions
343
data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,343 @@ | ||
{ | ||
"aliases": { | ||
/* | ||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ | ||
* │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ¿ │ │ | ||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ | ||
* │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ ´ │ + │ │ | ||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ | ||
* │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ñ │ { │ } │ │ | ||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ | ||
* │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │ | ||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ | ||
* │ │ │ │ │ │ │ │ │ | ||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ | ||
*/ | ||
"KC_GRV": { | ||
"key": "ES_PIPE", | ||
"label": "|", | ||
} | ||
"KC_1": { | ||
"key": "ES_1", | ||
"label": "1", | ||
} | ||
"KC_2": { | ||
"key": "ES_2", | ||
"label": "2", | ||
} | ||
"KC_3": { | ||
"key": "ES_3", | ||
"label": "3", | ||
} | ||
"KC_4": { | ||
"key": "ES_4", | ||
"label": "4", | ||
} | ||
"KC_5": { | ||
"key": "ES_5", | ||
"label": "5", | ||
} | ||
"KC_6": { | ||
"key": "ES_6", | ||
"label": "6", | ||
} | ||
"KC_7": { | ||
"key": "ES_7", | ||
"label": "7", | ||
} | ||
"KC_8": { | ||
"key": "ES_8", | ||
"label": "8", | ||
} | ||
"KC_9": { | ||
"key": "ES_9", | ||
"label": "9", | ||
} | ||
"KC_0": { | ||
"key": "ES_0", | ||
"label": "0", | ||
} | ||
"KC_MINS": { | ||
"key": "ES_QUOT", | ||
"label": "'", | ||
} | ||
"KC_EQL": { | ||
"key": "ES_IQUE", | ||
"label": "¿", | ||
} | ||
"KC_Q": { | ||
"key": "ES_Q", | ||
"label": "Q", | ||
} | ||
"KC_W": { | ||
"key": "ES_W", | ||
"label": "W", | ||
} | ||
"KC_E": { | ||
"key": "ES_E", | ||
"label": "E", | ||
} | ||
"KC_R": { | ||
"key": "ES_R", | ||
"label": "R", | ||
} | ||
"KC_T": { | ||
"key": "ES_T", | ||
"label": "T", | ||
} | ||
"KC_Y": { | ||
"key": "ES_Y", | ||
"label": "Y", | ||
} | ||
"KC_U": { | ||
"key": "ES_U", | ||
"label": "U", | ||
} | ||
"KC_I": { | ||
"key": "ES_I", | ||
"label": "I", | ||
} | ||
"KC_O": { | ||
"key": "ES_O", | ||
"label": "O", | ||
} | ||
"KC_P": { | ||
"key": "ES_P", | ||
"label": "P", | ||
} | ||
"KC_LBRC": { | ||
"key": "ES_ACUT", | ||
"label": "´ (dead)", | ||
} | ||
"KC_RBRC": { | ||
"key": "ES_PLUS", | ||
"label": "+", | ||
} | ||
"KC_A": { | ||
"key": "ES_A", | ||
"label": "A", | ||
} | ||
"KC_S": { | ||
"key": "ES_S", | ||
"label": "S", | ||
} | ||
"KC_D": { | ||
"key": "ES_D", | ||
"label": "D", | ||
} | ||
"KC_F": { | ||
"key": "ES_F", | ||
"label": "F", | ||
} | ||
"KC_G": { | ||
"key": "ES_G", | ||
"label": "G", | ||
} | ||
"KC_H": { | ||
"key": "ES_H", | ||
"label": "H", | ||
} | ||
"KC_J": { | ||
"key": "ES_J", | ||
"label": "J", | ||
} | ||
"KC_K": { | ||
"key": "ES_K", | ||
"label": "K", | ||
} | ||
"KC_L": { | ||
"key": "ES_L", | ||
"label": "L", | ||
} | ||
"KC_SCLN": { | ||
"key": "ES_NTIL", | ||
"label": "Ñ", | ||
} | ||
"KC_QUOT": { | ||
"key": "ES_LCBR", | ||
"label": "{", | ||
} | ||
"KC_NUHS": { | ||
"key": "ES_RCBR", | ||
"label": "}", | ||
} | ||
"KC_NUBS": { | ||
"key": "ES_LABK", | ||
"label": "<", | ||
} | ||
"KC_Z": { | ||
"key": "ES_Z", | ||
"label": "Z", | ||
} | ||
"KC_X": { | ||
"key": "ES_X", | ||
"label": "X", | ||
} | ||
"KC_C": { | ||
"key": "ES_C", | ||
"label": "C", | ||
} | ||
"KC_V": { | ||
"key": "ES_V", | ||
"label": "V", | ||
} | ||
"KC_B": { | ||
"key": "ES_B", | ||
"label": "B", | ||
} | ||
"KC_N": { | ||
"key": "ES_N", | ||
"label": "N", | ||
} | ||
"KC_M": { | ||
"key": "ES_M", | ||
"label": "M", | ||
} | ||
"KC_COMM": { | ||
"key": "ES_COMM", | ||
"label": ",", | ||
} | ||
"KC_DOT": { | ||
"key": "ES_DOT", | ||
"label": ".", | ||
} | ||
"KC_SLSH": { | ||
"key": "ES_MINS", | ||
"label": "-", | ||
} | ||
/* Shifted symbols | ||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ | ||
* │ ° │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ¡ │ │ | ||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ | ||
* │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ * │ │ | ||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ | ||
* │ │ │ │ │ │ │ │ │ │ │ │ [ │ ] │ │ | ||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ | ||
* │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │ | ||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ | ||
* │ │ │ │ │ │ │ │ │ | ||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ | ||
*/ | ||
"S(ES_PIPE)": { | ||
"key": "ES_MORD", | ||
"label": "°", | ||
} | ||
"S(ES_1)": { | ||
"key": "ES_EXLM", | ||
"label": "!", | ||
} | ||
"S(ES_2)": { | ||
"key": "ES_DQUO", | ||
"label": "\"", | ||
} | ||
"S(ES_3)": { | ||
"key": "ES_NUMB", | ||
"label": "#", | ||
} | ||
"S(ES_4)": { | ||
"key": "ES_DLR", | ||
"label": "$", | ||
} | ||
"S(ES_5)": { | ||
"key": "ES_PERC", | ||
"label": "%", | ||
} | ||
"S(ES_6)": { | ||
"key": "ES_AMPR", | ||
"label": "&", | ||
} | ||
"S(ES_7)": { | ||
"key": "ES_SLSH", | ||
"label": "/", | ||
} | ||
"S(ES_8)": { | ||
"key": "ES_LPRN", | ||
"label": "(", | ||
} | ||
"S(ES_9)": { | ||
"key": "ES_RPRN", | ||
"label": ")", | ||
} | ||
"S(ES_0)": { | ||
"key": "ES_EQL", | ||
"label": "=", | ||
} | ||
"S(ES_QUOT)": { | ||
"key": "ES_QUES", | ||
"label": "?", | ||
} | ||
"S(ES_IQUE)": { | ||
"key": "ES_IEXL", | ||
"label": "¡", | ||
} | ||
"S(ES_ACUT)": { | ||
"key": "ES_DIAE", | ||
"label": "¨ (dead)", | ||
} | ||
"S(ES_PLUS)": { | ||
"key": "ES_ASTR", | ||
"label": "*", | ||
} | ||
"S(ES_LCBR)": { | ||
"key": "ES_LBRC", | ||
"label": "[", | ||
} | ||
"S(ES_RCBR)": { | ||
"key": "ES_RBRC", | ||
"label": "]", | ||
} | ||
"S(ES_LABK)": { | ||
"key": "ES_RABK", | ||
"label": ">", | ||
} | ||
"S(ES_COMM)": { | ||
"key": "ES_SCLN", | ||
"label": ";", | ||
} | ||
"S(ES_DOT)": { | ||
"key": "ES_COLN", | ||
"label": ":", | ||
} | ||
"S(ES_MINS)": { | ||
"key": "ES_UNDS", | ||
"label": "_", | ||
} | ||
/* AltGr symbols | ||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ | ||
* │ ¬ │ │ │ │ │ │ │ │ │ │ │ \ │ │ │ | ||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ | ||
* │ │ @ │ │ │ │ │ │ │ │ │ │ │ ~ │ │ | ||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │ | ||
* │ │ │ │ │ │ │ │ │ │ │ │ ^ │ ` │ │ | ||
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ | ||
* │ │ │ │ │ │ │ │ │ │ │ │ │ │ | ||
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ | ||
* │ │ │ │ │ │ │ │ │ | ||
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ | ||
*/ | ||
"ALGR(ES_PIPE)": { | ||
"key": "ES_NOT", | ||
"label": "¬", | ||
} | ||
"ALGR(ES_QUOT)": { | ||
"key": "ES_BSLS", | ||
"label": "\\", | ||
} | ||
"ALGR(ES_Q)": { | ||
"key": "ES_AT", | ||
"label": "@", | ||
} | ||
"ALGR(ES_PLUS)": { | ||
"key": "ES_TILD", | ||
"label": "~", | ||
} | ||
"ALGR(ES_LCBR)": { | ||
"key": "ES_CIRC", | ||
"label": "^", | ||
} | ||
"ALGR(KC_NUHS)": { | ||
"key": "ES_GRV", | ||
"label": "`", | ||
} | ||
} | ||
} |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
{ | ||
"keycodes": { | ||
"0x7810": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_ON", | ||
"aliases": [ | ||
"LM_ON" | ||
] | ||
}, | ||
"0x7811": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_OFF", | ||
"aliases": [ | ||
"LM_OFF" | ||
] | ||
}, | ||
"0x7812": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_TOGGLE", | ||
"aliases": [ | ||
"LM_TOGG" | ||
] | ||
}, | ||
"0x7813": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_MODE_NEXT", | ||
"aliases": [ | ||
"LM_NEXT" | ||
] | ||
}, | ||
"0x7814": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_MODE_PREVIOUS", | ||
"aliases": [ | ||
"LM_PREV" | ||
] | ||
}, | ||
"0x7815": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_BRIGHTNESS_UP", | ||
"aliases": [ | ||
"LM_BRIU" | ||
] | ||
}, | ||
"0x7816": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_BRIGHTNESS_DOWN", | ||
"aliases": [ | ||
"LM_BRID" | ||
] | ||
}, | ||
"0x7817": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_SPEED_UP", | ||
"aliases": [ | ||
"LM_SPDU" | ||
] | ||
}, | ||
"0x7818": { | ||
"group": "led_matrix", | ||
"key": "QK_LED_MATRIX_SPEED_DOWN", | ||
"aliases": [ | ||
"LM_SPDD" | ||
] | ||
}, | ||
|
||
"0x7820": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_TOGGLE", | ||
"aliases": [ | ||
"UG_TOGG" | ||
] | ||
}, | ||
"0x7821": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_MODE_NEXT", | ||
"aliases": [ | ||
"!reset!", | ||
"UG_NEXT" | ||
] | ||
}, | ||
"0x7822": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_MODE_PREVIOUS", | ||
"aliases": [ | ||
"!reset!", | ||
"UG_PREV" | ||
] | ||
}, | ||
"0x7823": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_HUE_UP", | ||
"aliases": [ | ||
"UG_HUEU" | ||
] | ||
}, | ||
"0x7824": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_HUE_DOWN", | ||
"aliases": [ | ||
"UG_HUED" | ||
] | ||
}, | ||
"0x7825": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_SATURATION_UP", | ||
"aliases": [ | ||
"UG_SATU" | ||
] | ||
}, | ||
"0x7826": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_SATURATION_DOWN", | ||
"aliases": [ | ||
"UG_SATD" | ||
] | ||
}, | ||
"0x7827": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_VALUE_UP", | ||
"aliases": [ | ||
"UG_VALU" | ||
] | ||
}, | ||
"0x7828": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_VALUE_DOWN", | ||
"aliases": [ | ||
"UG_VALD" | ||
] | ||
}, | ||
"0x7829": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_SPEED_UP", | ||
"aliases": [ | ||
"UG_SPDU" | ||
] | ||
}, | ||
"0x782A": { | ||
"group": "underglow", | ||
"key": "QK_UNDERGLOW_SPEED_DOWN", | ||
"aliases": [ | ||
"UG_SPDD" | ||
] | ||
}, | ||
|
||
"0x7840": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_ON", | ||
"aliases": [ | ||
"RM_ON" | ||
] | ||
}, | ||
"0x7841": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_OFF", | ||
"aliases": [ | ||
"RM_OFF" | ||
] | ||
}, | ||
"0x7842": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_TOGGLE", | ||
"aliases": [ | ||
"RM_TOGG" | ||
] | ||
}, | ||
"0x7843": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_MODE_NEXT", | ||
"aliases": [ | ||
"RM_NEXT" | ||
] | ||
}, | ||
"0x7844": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_MODE_PREVIOUS", | ||
"aliases": [ | ||
"RM_PREV" | ||
] | ||
}, | ||
"0x7845": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_HUE_UP", | ||
"aliases": [ | ||
"RM_HUEU" | ||
] | ||
}, | ||
"0x7846": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_HUE_DOWN", | ||
"aliases": [ | ||
"RM_HUED" | ||
] | ||
}, | ||
"0x7847": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_SATURATION_UP", | ||
"aliases": [ | ||
"RM_SATU" | ||
] | ||
}, | ||
"0x7848": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_SATURATION_DOWN", | ||
"aliases": [ | ||
"RM_SATD" | ||
] | ||
}, | ||
"0x7849": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_VALUE_UP", | ||
"aliases": [ | ||
"RM_VALU" | ||
] | ||
}, | ||
"0x784A": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_VALUE_DOWN", | ||
"aliases": [ | ||
"RM_VALD" | ||
] | ||
}, | ||
"0x784B": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_SPEED_UP", | ||
"aliases": [ | ||
"RM_SPDU" | ||
] | ||
}, | ||
"0x784C": { | ||
"group": "rgb_matrix", | ||
"key": "QK_RGB_MATRIX_SPEED_DOWN", | ||
"aliases": [ | ||
"RM_SPDD" | ||
] | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
File renamed without changes.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.