From 30edab4fecbcbb1a34c67363f7795c06431d39c9 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 18:57:18 +0100 Subject: [PATCH 01/14] Add language & framework breakdowns to repo-intel Surface what kind of work was done and what stack a repo uses: - Per-commit file types in the timeline tooltip. - Per-author language bar in the contributor popover. - A repo-wide "Technologies" section: whole-repo language bar plus frameworks grouped by language. Always shown; each column explains itself when empty (e.g. the remote path's language note). Detection data is generated, not hand-maintained: - Languages come from GitHub Linguist (extension/filename -> language, official colors, vendored-path noise filter), with fine-grained languages folded into their group (TSX -> TypeScript) and a small ambiguous-extension override (.md -> Markdown, .h -> C, ...). - Frameworks are a curated dependency -> framework map. Vercel/Netlify target deploy presets, not the libraries a repo uses, so they were a poor fit and aren't scraped. - gen_techdata.py (make repo-intel-techdata) regenerates techdata.json from Linguist; the committed JSON is embedded into the artifact by build.py, keeping the shipped tool offline and single-file. Not a build dependency, so normal builds stay offline/reproducible. Coverage: languages need a clone (numstat), so they're local/bare-clone only; frameworks read dependency manifests, which are cheap to fetch via the REST tree + GraphQL blobs, so they work on the remote path too. Also enable git rename detection (-M) in the commit walk, so renamed files are counted once instead of as a delete + add. This slightly shifts added/deleted totals on repos where diff.renames was disabled. --- Makefile | 7 +- src/repo-intel/README.md | 66 +- src/repo-intel/build.py | 33 +- src/repo-intel/gen_techdata.py | 249 +++ src/repo-intel/repo-intel.py | 437 +++++- src/repo-intel/techdata.json | 2651 ++++++++++++++++++++++++++++++++ src/repo-intel/template.html | 93 +- stow/bin/repo-intel | 439 +++++- 8 files changed, 3916 insertions(+), 59 deletions(-) create mode 100644 src/repo-intel/gen_techdata.py create mode 100644 src/repo-intel/techdata.json diff --git a/Makefile b/Makefile index a6c6f74..e2c6674 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,10 @@ docker-test-remote-local: ## Test remote install using local HTTP server repo-intel-build: ## Rebuild stow/bin/repo-intel from src/repo-intel python3 src/repo-intel/build.py stow/bin/repo-intel -repo-intel-dev: ## Run repo-intel from source (reads template.html live; pass args via ARGS=) +repo-intel-techdata: ## Regenerate src/repo-intel/techdata.json from Linguist (needs network) + python3 src/repo-intel/gen_techdata.py + +repo-intel-dev: ## Run repo-intel from source (reads template.html + techdata.json live; pass args via ARGS=) python3 src/repo-intel/repo-intel.py $(ARGS) -.PHONY: help install uninstall brew docker-build docker-test docker-shell docker-setup docker-clean docker-test-remote docker-test-remote-local repo-intel-build repo-intel-dev +.PHONY: help install uninstall brew docker-build docker-test docker-shell docker-setup docker-clean docker-test-remote docker-test-remote-local repo-intel-build repo-intel-techdata repo-intel-dev diff --git a/src/repo-intel/README.md b/src/repo-intel/README.md index 4070e86..a2e1cbf 100644 --- a/src/repo-intel/README.md +++ b/src/repo-intel/README.md @@ -8,7 +8,16 @@ single-file and depends only on Python 3 + `git`. `repo-intel` reads commit history from either the current git repo or a remote GitHub repo and writes a self-contained HTML dashboard showing top contributors, weekly/daily activity, time-of-day patterns, -and per-author commit feeds. +and per-author commit feeds. It also breaks down work by **language** +(per-commit file types in the timeline tooltip, a per-author language +bar in the contributor popover, and a repo-wide "Technologies" section) +and detects **frameworks** from dependency manifests grouped by language. + +The per-file **language** breakdown needs file-level line stats that only +the local and bare-clone paths produce — the token-authenticated GraphQL +remote path omits it, so the Technologies section's language column shows a +short placeholder there instead. **Framework** detection works on every path +(on the remote path the dependency manifests are fetched over the API). The [GitHub CLI (`gh`)](https://cli.github.com/) is optional but recommended: when authenticated (`gh auth login`), `repo-intel` uses @@ -126,11 +135,24 @@ repo-intel --no-cache tyom/dotfiles # bypass cache ## Files -| File | Purpose | -| --------------- | ----------------------------------------------------------------------- | -| `repo-intel.py` | The script. Holds `TEMPLATE = "__TEMPLATE_PLACEHOLDER__"` until bundled | -| `template.html` | Dashboard HTML, with `/*__DATA_INJECTION__*/` for runtime data | -| `build.py` | Substitutes the `TEMPLATE =` line with `template.html` as a `repr()` | +| File | Purpose | +| ----------------- | ---------------------------------------------------------------------------- | +| `repo-intel.py` | The script. Holds `TEMPLATE` + `TECHDATA` placeholders until bundled | +| `template.html` | Dashboard HTML, with `/*__DATA_INJECTION__*/` for runtime data | +| `techdata.json` | Generated language + framework detection data (committed; embedded at build) | +| `gen_techdata.py` | Regenerates `techdata.json` from GitHub Linguist + a curated framework map | +| `build.py` | Substitutes the `TEMPLATE` / `TECHDATA` lines with their data as a `repr()` | + +### Detection data (`techdata.json`) + +Language detection (extension/filename → language, colors, vendored-path noise +filter) is generated from [GitHub Linguist](https://github.com/github-linguist/linguist) +— `languages.yml` (with fine-grained languages folded into their `group`, e.g. +`TSX`→`TypeScript`) and `vendor.yml`. Frameworks are a small curated +dependency → framework map maintained in `gen_techdata.py` (Vercel/Netlify's +lists target deploy presets, not the libraries a repo uses, so they're a poor +fit). `techdata.json` is committed and embedded into the artifact, so the +shipped tool stays offline and single-file. ## Workflows @@ -142,9 +164,18 @@ make repo-intel-build Writes `stow/bin/repo-intel` (chmod 0755). Commit both source and artifact — the artifact is checked in so a fresh clone + `make install` -works without a build step. +works without a build step. `repo-intel-build` reads the committed +`techdata.json`; it is **not** regenerated on every build (that would need +network), so builds stay offline and reproducible. + +**Refresh detection data** (only when bumping Linguist or editing the +framework map — needs network): + +```bash +make repo-intel-techdata # rewrites techdata.json; then commit it + rebuild +``` -**Develop against the template live** (no rebuild needed between edits): +**Develop against the source live** (no rebuild needed between edits): ```bash make repo-intel-dev # uses cwd, top 10 @@ -152,19 +183,22 @@ make repo-intel-dev ARGS="3 facebook/react" # top 3 of a remote repo ``` The source script auto-detects that `TEMPLATE` is still the placeholder -and falls back to reading `template.html` from disk. The built artifact -never hits that branch — it carries the embedded template. +and falls back to reading `template.html` (and `techdata.json`) from disk. +The built artifact never hits that branch — it carries both embedded. ## How the embedding works -`build.py` looks for exactly one occurrence of the line: +`build.py` looks for exactly one occurrence each of: ```python TEMPLATE = "__TEMPLATE_PLACEHOLDER__" +TECHDATA = "__TECHDATA_PLACEHOLDER__" ``` -and replaces it with `TEMPLATE = `. The result is -a valid Python file — one long string literal on line 48 of the -artifact. Templating happens at build time; the runtime substitution of -`/*__DATA_INJECTION__*/` with `window.__DATA__ = {...}` still happens -inside `main()` as before. +and replaces them with `TEMPLATE = ` and +`TECHDATA = `. The result is a valid Python file +carrying both as string literals. Templating happens at build time; the +runtime substitution of `/*__DATA_INJECTION__*/` with +`window.__DATA__ = {...}` still happens inside `main()` as before. When +unbuilt, the script detects the placeholders and reads `template.html` +and `techdata.json` from disk instead. diff --git a/src/repo-intel/build.py b/src/repo-intel/build.py index a357465..466f3ee 100644 --- a/src/repo-intel/build.py +++ b/src/repo-intel/build.py @@ -1,16 +1,17 @@ #!/usr/bin/env python3 """Bundle src/repo-intel into a single-file executable. -Substitutes the TEMPLATE placeholder in repo-intel.py with the contents -of template.html as a Python string literal, then writes the result to -the given output path with mode 0755. +Substitutes two placeholders in repo-intel.py with their data as Python string +literals — TEMPLATE with template.html, TECHDATA with techdata.json — then +writes the result to the given output path with mode 0755. """ import os import sys from pathlib import Path -PLACEHOLDER = 'TEMPLATE = "__TEMPLATE_PLACEHOLDER__"' +TEMPLATE_PLACEHOLDER = 'TEMPLATE = "__TEMPLATE_PLACEHOLDER__"' +TECHDATA_PLACEHOLDER = 'TECHDATA = "__TECHDATA_PLACEHOLDER__"' def main(): @@ -22,10 +23,26 @@ def main(): script = (src_dir / "repo-intel.py").read_text() template = (src_dir / "template.html").read_text() - if script.count(PLACEHOLDER) != 1: - sys.exit(f"error: expected exactly one {PLACEHOLDER!r} line in repo-intel.py") - - bundled = script.replace(PLACEHOLDER, f"TEMPLATE = {template!r}") + techdata_path = src_dir / "techdata.json" + if not techdata_path.exists(): + sys.exit( + f"error: {techdata_path} not found — run `make repo-intel-techdata` " + "(needs network) to generate it, then commit it." + ) + techdata = techdata_path.read_text() + + for name, placeholder in ( + ("template.html", TEMPLATE_PLACEHOLDER), + ("techdata.json", TECHDATA_PLACEHOLDER), + ): + if script.count(placeholder) != 1: + sys.exit(f"error: expected exactly one {placeholder!r} line in repo-intel.py") + + bundled = ( + script + .replace(TEMPLATE_PLACEHOLDER, f"TEMPLATE = {template!r}") + .replace(TECHDATA_PLACEHOLDER, f"TECHDATA = {techdata!r}") + ) out_path.parent.mkdir(parents=True, exist_ok=True) out_path.write_text(bundled) out_path.chmod(0o755) diff --git a/src/repo-intel/gen_techdata.py b/src/repo-intel/gen_techdata.py new file mode 100644 index 0000000..e9567a7 --- /dev/null +++ b/src/repo-intel/gen_techdata.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python3 +"""Generate techdata.json — language + framework detection data for repo-intel. + +Languages are generated from GitHub Linguist (the canonical, maintained source +for extension→language mappings and the official colors); frameworks are a +small curated map. We evaluated scraping Vercel's `frameworks.ts` for the JS +side but it targets *deployment-framework CLIs* (`next`, `react-scripts`), not +the libraries a repo uses — `react`/`express`/`vue` aren't in it — so it's the +wrong shape for "what does this repo use" and the curated map stays on-target. + +Writes a single committed JSON snapshot that repo-intel.py loads (and that +build.py embeds into the artifact): + + - Languages: Linguist `languages.yml` (extension/filename → language, colors, + with fine-grained languages folded into their `group`, e.g. TSX→TypeScript) + + `vendor.yml` (vendored-path regexes for the noise filter). + - Frameworks: curated dependency → framework maps (web + backend) below. + +Run via `make repo-intel-techdata` (needs network). Stdlib-only. +""" + +import json +import re +import sys +import urllib.request +from pathlib import Path + +LANGUAGES_YML = "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml" +VENDOR_YML = "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml" + +OUT = Path(__file__).resolve().parent / "techdata.json" + +TYPE_RANK = {"programming": 0, "markup": 1, "data": 2, "prose": 3, "": 4} + +# Ambiguous extensions claimed by several languages. Linguist resolves these in +# code (a classifier + popularity), not data, so derivation alone mis-assigns +# (e.g. `.md` → "GCC Machine Description"). This tiebreaker layer pins the few +# that users actually notice; the chosen name must be a real Linguist language. +EXT_OVERRIDE = { + "md": "Markdown", "markdown": "Markdown", "h": "C", "m": "Objective-C", + "r": "R", "pl": "Perl", "t": "Perl", "l": "Common Lisp", "v": "Verilog", + "f": "Fortran", "for": "Fortran", "cls": "Apex", "pro": "Prolog", + "ts": "TypeScript", "rs": "Rust", "cs": "C#", "sql": "SQL", +} + +# Curated web/npm dependency → framework display name. Vercel/Netlify answer a +# different question (deploy presets), so this is maintained directly. +CURATED_WEB = { + "react": "React", "react-dom": "React", "next": "Next.js", + "vue": "Vue", "nuxt": "Nuxt", "@angular/core": "Angular", + "svelte": "Svelte", "@sveltejs/kit": "SvelteKit", + "solid-js": "SolidJS", "preact": "Preact", "astro": "Astro", + "gatsby": "Gatsby", "@remix-run/react": "Remix", + "express": "Express", "koa": "Koa", "fastify": "Fastify", + "@nestjs/core": "NestJS", "@hapi/hapi": "hapi", + "electron": "Electron", "react-native": "React Native", + "expo": "Expo", "@ionic/core": "Ionic", + "vite": "Vite", "webpack": "webpack", "rollup": "Rollup", + "esbuild": "esbuild", "parcel": "Parcel", + "tailwindcss": "Tailwind CSS", "bootstrap": "Bootstrap", + "@mui/material": "MUI", "@chakra-ui/react": "Chakra UI", + "styled-components": "styled-components", + "jest": "Jest", "vitest": "Vitest", "mocha": "Mocha", + "playwright": "Playwright", "@playwright/test": "Playwright", + "cypress": "Cypress", "eslint": "ESLint", "prettier": "Prettier", + "redux": "Redux", "@reduxjs/toolkit": "Redux", "zustand": "Zustand", + "@apollo/client": "Apollo", "prisma": "Prisma", + "@prisma/client": "Prisma", "typeorm": "TypeORM", + "mongoose": "Mongoose", "sequelize": "Sequelize", + "three": "three.js", "d3": "D3", "chart.js": "Chart.js", +} + +# Web/JS sentinel files: basename → framework (assigned to the JS/TS bucket). +CURATED_SENTINELS_JS = [ + ["next.config.js", "Next.js"], ["next.config.ts", "Next.js"], + ["next.config.mjs", "Next.js"], ["nuxt.config.js", "Nuxt"], + ["nuxt.config.ts", "Nuxt"], ["svelte.config.js", "Svelte"], + ["astro.config.mjs", "Astro"], ["vue.config.js", "Vue"], + ["gatsby-config.js", "Gatsby"], ["angular.json", "Angular"], +] + +# Backend frameworks Vercel/Netlify don't cover — keyed by language, then +# dependency name → display name. Matched as whole words in manifest text. +CURATED_BACKEND = { + "Python": { + "django": "Django", "djangorestframework": "Django REST", + "flask": "Flask", "fastapi": "FastAPI", "starlette": "Starlette", + "tornado": "Tornado", "aiohttp": "aiohttp", "sanic": "Sanic", + "pyramid": "Pyramid", "sqlalchemy": "SQLAlchemy", "pydantic": "Pydantic", + "celery": "Celery", "scrapy": "Scrapy", "numpy": "NumPy", + "pandas": "pandas", "scipy": "SciPy", "scikit-learn": "scikit-learn", + "tensorflow": "TensorFlow", "torch": "PyTorch", "keras": "Keras", + "transformers": "Transformers", "matplotlib": "Matplotlib", + "pytest": "pytest", "click": "Click", "typer": "Typer", + "requests": "Requests", "httpx": "HTTPX", + }, + "Ruby": { + "rails": "Rails", "sinatra": "Sinatra", "hanami": "Hanami", + "rspec": "RSpec", "sidekiq": "Sidekiq", "puma": "Puma", "devise": "Devise", + }, + "Go": { + "github.com/gin-gonic/gin": "Gin", "github.com/labstack/echo": "Echo", + "github.com/gofiber/fiber": "Fiber", "github.com/gorilla/mux": "Gorilla", + "gorm.io/gorm": "GORM", "github.com/spf13/cobra": "Cobra", + "github.com/go-chi/chi": "chi", "google.golang.org/grpc": "gRPC", + }, + "Rust": { + "actix-web": "Actix Web", "axum": "Axum", "rocket": "Rocket", + "warp": "warp", "tokio": "Tokio", "serde": "Serde", "diesel": "Diesel", + "tonic": "Tonic", "clap": "clap", "bevy": "Bevy", "tauri": "Tauri", + }, + "PHP": { + "laravel/framework": "Laravel", "symfony/symfony": "Symfony", + "symfony/framework-bundle": "Symfony", "slim/slim": "Slim", + "cakephp/cakephp": "CakePHP", "yiisoft/yii2": "Yii", + }, +} + +# Backend / non-JS sentinel files: basename (or sub-path) → (framework, language). +CURATED_SENTINELS = [ + ["manage.py", "Django", "Python"], + ["artisan", "Laravel", "PHP"], + ["config/application.rb", "Rails", "Ruby"], +] + + +def fetch(url): + req = urllib.request.Request(url, headers={"User-Agent": "repo-intel-gen"}) + with urllib.request.urlopen(req) as resp: + return resp.read().decode("utf-8") + + +def parse_languages_yml(text): + """Line-parse Linguist languages.yml (machine-generated, regular). + + Returns {name: {"type", "color", "extensions": [...], "filenames": [...]}}. + """ + langs = {} + cur = None + listkey = None + for raw in text.splitlines(): + if not raw or raw.lstrip().startswith("#"): + continue + if not raw[0].isspace(): # column-0 language header + m = re.match(r'^(?:"([^"]+)"|\'([^\']+)\'|([^:]+)):\s*$', raw) + if m: + name = m.group(1) or m.group(2) or m.group(3) + cur = {"type": "", "color": "", "group": "", + "extensions": [], "filenames": []} + langs[name] = cur + listkey = None + else: + cur = None + continue + if cur is None: + continue + item = re.match(r'^ - (.*)$', raw) + if item and listkey: + val = item.group(1).strip().strip('"').strip("'") + cur[listkey].append(val) + continue + prop = re.match(r'^ (\w+):\s*(.*)$', raw) + if prop: + key, val = prop.group(1), prop.group(2).strip() + if key in ("extensions", "filenames") and val == "": + listkey = key + else: + listkey = None + if key == "color": + cur["color"] = val.strip('"').strip("'") + elif key == "type": + cur["type"] = val + elif key == "group": + cur["group"] = val.strip('"').strip("'") + return langs + + +def build_language_tables(langs): + """ext/filename → language name and name → color, colored languages only. + + Fine-grained languages are folded into their `group` (TSX→TypeScript) so the + bar doesn't fragment; ambiguous extensions are pinned via EXT_OVERRIDE. + """ + name_color = {n: i["color"] for n, i in langs.items() if i.get("color")} + ext_lang, ext_meta, filename_lang = {}, {}, {} + for name, info in langs.items(): + if not info.get("color"): + continue + eff = info.get("group") or name # roll fine-grained langs into parent + rank = TYPE_RANK.get(info.get("type", ""), 4) + for idx, ext in enumerate(info.get("extensions", [])): + key = ext[1:].lower() if ext.startswith(".") else ext.lower() + if not key: + continue + primary = idx == 0 + if key not in ext_lang: + ext_lang[key] = eff + ext_meta[key] = (rank, primary) + else: + prank, pprimary = ext_meta[key] + # Prefer better type rank; then a primary extension over secondary. + if rank < prank or (rank == prank and primary and not pprimary): + ext_lang[key] = eff + ext_meta[key] = (rank, primary) + for fn in info.get("filenames", []): + filename_lang.setdefault(fn.lower(), eff) + for ext, lang in EXT_OVERRIDE.items(): + if lang in name_color: + ext_lang[ext] = lang + return name_color, ext_lang, filename_lang + + +def parse_vendor_yml(text): + out = [] + for line in text.splitlines(): + m = re.match(r'^- (.*)$', line) + if m: + out.append(m.group(1).strip()) + return out + + +def main(): + print("fetching Linguist languages.yml…", file=sys.stderr) + langs = parse_languages_yml(fetch(LANGUAGES_YML)) + name_color, ext_lang, filename_lang = build_language_tables(langs) + print(f" {len(name_color)} colored languages, {len(ext_lang)} extensions", + file=sys.stderr) + + print("fetching Linguist vendor.yml…", file=sys.stderr) + vendor = parse_vendor_yml(fetch(VENDOR_YML)) + print(f" {len(vendor)} vendor patterns", file=sys.stderr) + + fw_deps = {"npm": CURATED_WEB} + fw_deps.update(CURATED_BACKEND) + + data = { + "_source": {"languages": LANGUAGES_YML, "vendor": VENDOR_YML}, + "lang": {"ext": ext_lang, "filename": filename_lang, "color": name_color}, + "vendor": vendor, + "fw_deps": fw_deps, + "fw_sentinels_js": CURATED_SENTINELS_JS, + "fw_sentinels_other": CURATED_SENTINELS, + } + OUT.write_text(json.dumps(data, ensure_ascii=False, indent=1, sort_keys=True)) + print(f"wrote {OUT} ({OUT.stat().st_size:,} bytes)", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/src/repo-intel/repo-intel.py b/src/repo-intel/repo-intel.py index 5e6216a..93727ba 100755 --- a/src/repo-intel/repo-intel.py +++ b/src/repo-intel/repo-intel.py @@ -276,10 +276,280 @@ def iso_week_label(dt): return f"{y}-W{w:02d}" +# Language + framework detection data, generated from GitHub Linguist and a +# curated framework map by gen_techdata.py (see `make repo-intel-techdata`). +# build.py inlines the JSON here; when unbuilt we read the sibling file. Used +# only on the local + bare-clone paths — the GraphQL remote path lacks per-file +# data, so these maps go unused there. +TECHDATA = "__TECHDATA_PLACEHOLDER__" +OTHER_LANG = "Other" +OTHER_COLOR = "#8b949e" + + +def _load_techdata(): + raw = TECHDATA + if raw == "__TECHDATA_PLACEHOLDER__": + sibling = Path(__file__).resolve().parent / "techdata.json" + if not sibling.exists(): + return {} + try: + return json.loads(sibling.read_text()) + except (json.JSONDecodeError, OSError): + return {} + try: + return json.loads(raw) + except (json.JSONDecodeError, ValueError): + return {} + + +_TECH = _load_techdata() +_LANG = _TECH.get("lang", {}) +EXT_LANG = _LANG.get("ext", {}) # extension (no dot, lower) -> language +FILENAME_LANG = _LANG.get("filename", {}) # lowercased filename -> language +NAME_COLOR = _LANG.get("color", {}) # language -> hex color +FW_DEPS = _TECH.get("fw_deps", {}) # {ecosystem: {dependency: framework}} +FW_SENTINELS_JS = _TECH.get("fw_sentinels_js", []) # [[basename, framework]] +FW_SENTINELS_OTHER = _TECH.get("fw_sentinels_other", []) # [[path, framework, lang]] + + +def _compile_vendor(patterns): + """One matcher from Linguist's vendor.yml regexes; skips Python-incompatible + ones (they're Ruby-flavored) so the union still compiles.""" + good = [] + for p in patterns: + try: + re.compile(p) + good.append(p) + except re.error: + continue + try: + return re.compile("|".join(f"(?:{p})" for p in good)) if good else None + except re.error: + return None + + +_VENDOR_RE = _compile_vendor(_TECH.get("vendor", [])) + +# Lockfiles Linguist classifies as *generated* (handled in code, not vendor.yml) +# — kept as a small supplement so they don't dominate the language bar. +NOISE_BASENAMES = frozenset({ + "package-lock.json", "yarn.lock", "pnpm-lock.yaml", "npm-shrinkwrap.json", + "composer.lock", "cargo.lock", "gemfile.lock", "poetry.lock", "go.sum", + "pdm.lock", "uv.lock", "flake.lock", +}) + + +def numstat_newpath(field): + """Resolve a numstat path column to the post-rename path. + + Renames render as `old => new`, or with a shared brace group like + `src/{old => new}/file.js`; plain paths pass through unchanged. + """ + if " => " not in field: + return field + lo = field.find("{") + hi = field.find("}", lo) if lo != -1 else -1 + if lo != -1 and hi != -1 and " => " in field[lo:hi]: + new = field[lo + 1:hi].split(" => ", 1)[1] + return field[:lo] + new + field[hi + 1:] + return field.split(" => ", 1)[1] + + +def classify_path(field): + """Map a numstat path column to a language name, or None to exclude it.""" + path = numstat_newpath(field.strip().strip('"')).replace("\\", "/") + if _VENDOR_RE and _VENDOR_RE.search(path): # Linguist vendored paths + return None + base = path.rsplit("/", 1)[-1].lower() + if base in NOISE_BASENAMES: + return None + if base.endswith((".min.js", ".min.css", ".map")): + return None + if base in FILENAME_LANG: # Dockerfile, Makefile, Rakefile, … + return FILENAME_LANG[base] + dot = base.rfind(".") + if dot <= 0: # no extension, or a dotfile like ".gitignore" + return OTHER_LANG + return EXT_LANG.get(base[dot + 1:], OTHER_LANG) + + +def top_languages(langs, limit=6): + """Build a sorted language-bar list from {name: [added, deleted, files]}. + + Ranks by lines touched (added + deleted); languages past `limit` collapse + into a single grey "Other" segment. Returns [] when nothing qualifies. + """ + items = [(name, a + d, files) for name, (a, d, files) in langs.items()] + total = sum(lines for _, lines, _ in items) + if total <= 0: + return [] + items.sort(key=lambda x: x[1], reverse=True) + out = [ + { + "name": name, + "lines": lines, + "files": files, + "pct": round(lines * 100 / total, 1), + "color": NAME_COLOR.get(name, OTHER_COLOR), + } + for name, lines, files in items[:limit] + ] + overflow = sum(lines for _, lines, _ in items[limit:]) + if overflow > 0: + existing = next((o for o in out if o["name"] == OTHER_LANG), None) + if existing: + existing["lines"] += overflow + existing["pct"] = round(existing["lines"] * 100 / total, 1) + else: + out.append({ + "name": OTHER_LANG, + "lines": overflow, + "files": 0, + "pct": round(overflow * 100 / total, 1), + "color": OTHER_COLOR, + }) + return out + + def git(*args, cwd=None): return subprocess.check_output(["git", *args], text=True, cwd=cwd) +def _git_show(path, cwd=None): + """Contents of `path` at HEAD, or "" if missing. Works on bare clones.""" + try: + return git("show", f"HEAD:{path}", cwd=cwd) + except subprocess.CalledProcessError: + return "" + + +def detect_frameworks(cwd=None): + """Detect frameworks at HEAD from a local repo / bare clone. + + Returns a list grouped by language, ordered by framework count: + [{"language": "TypeScript", "color": "#3178c6", "names": [...]}, ...] + Best-effort and local-only — the GraphQL remote path skips this. + """ + try: + tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) + except subprocess.CalledProcessError: + return [] + return _frameworks_from_files( + [p for p in tree.splitlines() if p], lambda p: _git_show(p, cwd) + ) + + +def _frameworks_from_files(paths, read_file): + """Core framework detection over a file list, driven by techdata maps. + + `paths`: repo-relative paths that exist. `read_file(path)` -> contents + ("" if unavailable; only called for manifests worth parsing). Decoupled + from git so the remote path can supply GraphQL-fetched blobs. + """ + if not FW_DEPS: + return [] + paths = set(paths) + by_base = defaultdict(list) + for p in paths: + by_base[p.rsplit("/", 1)[-1].lower()].append(p) + + found = defaultdict(list) + seen = defaultdict(set) + + def add(language, name): + if name and name not in seen[language]: + seen[language].add(name) + found[language].append(name) + + def present(dep, text): + return re.search(r"(?= 3: + lang = classify_path(cols[2]) + if lang: + rec = lang_stats.setdefault(cur, {}).setdefault(lang, [0, 0, 0]) + rec[0] += added + rec[1] += deleted + rec[2] += 1 default_branch = detect_default_branch(cwd=cwd) + extras = {"lang_stats": lang_stats, "frameworks": detect_frameworks(cwd=cwd)} return ( repo_name, github_base, @@ -476,6 +755,7 @@ def collect_local(cwd=None, suppress_current_user=False): default_branch, repo_disk_kb(cwd=cwd), collect_local_tags(cwd=cwd), + extras, ) @@ -748,6 +1028,100 @@ def fetch_remote_tags(owner, repo, token): return tags +def gh_rest_get(path, token): + """GET an api.github.com REST endpoint; returns the parsed JSON body.""" + req = urllib.request.Request( + f"https://api.github.com{path}", + headers={ + "Authorization": f"bearer {token}", + "User-Agent": "repo-intel", + "Accept": "application/vnd.github+json", + }, + ) + with urllib.request.urlopen(req) as resp: + return json.loads(resp.read()) + + +# Manifests _frameworks_from_files actually parses (so we only fetch those +# blobs). tsconfig.json / sentinels are presence-only — covered by the tree. +_REMOTE_MANIFEST_BASES = frozenset({ + "package.json", "composer.json", "pyproject.toml", "pipfile", + "setup.py", "setup.cfg", "gemfile", "go.mod", "cargo.toml", +}) + + +def _remote_manifest_paths(paths): + out = [] + for p in paths: + base = p.rsplit("/", 1)[-1].lower() + if base in _REMOTE_MANIFEST_BASES or ( + base.startswith("requirements") and base.endswith(".txt") + ): + out.append(p) + return out + + +def fetch_blob_texts(owner, repo, paths, token): + """HEAD blob text for each path via aliased GraphQL. Returns {path: text}.""" + out = {} + paths = list(paths) + for start in range(0, len(paths), 50): + chunk = paths[start:start + 50] + var_decls = ", ".join(f"$p{i}: String!" for i in range(len(chunk))) + frags = " ".join( + f"b{i}: object(expression: $p{i}) {{ ... on Blob {{ text }} }}" + for i in range(len(chunk)) + ) + query = ( + f"query($owner: String!, $repo: String!, {var_decls}) " + f"{{ repository(owner: $owner, name: $repo) {{ {frags} }} }}" + ) + variables = {"owner": owner, "repo": repo} + for i, p in enumerate(chunk): + variables[f"p{i}"] = f"HEAD:{p}" + try: + body = gh_graphql(query, variables, token) + except urllib.error.URLError as exc: + print(f" warning: manifest fetch failed: {exc}", file=sys.stderr) + continue + node = gh_repository(body) + for i, p in enumerate(chunk): + blob = node.get(f"b{i}") + if blob and blob.get("text") is not None: + out[p] = blob["text"] + return out + + +def fetch_frameworks_remote(owner, repo, token): + """Detect frameworks on the GraphQL path without a clone. + + Lists the repo tree (REST, recursive — manifests can be nested) and fetches + just the manifest blobs (GraphQL), then runs the shared detection core. + Per-file *languages* stay local-only (too expensive over the network), but + manifests are cheap, so frameworks work here too. + """ + if not token: + return [] + try: + tree = gh_rest_get(f"/repos/{owner}/{repo}/git/trees/HEAD?recursive=1", token) + except urllib.error.URLError as exc: + print(f" warning: framework tree fetch failed: {exc}", file=sys.stderr) + return [] + if tree.get("truncated"): + # GitHub caps the recursive tree at ~100k entries / 7MB; deep manifests + # past the cap are dropped, so detection may miss frameworks silently. + print( + " warning: repo tree truncated by GitHub — framework detection " + "may be incomplete", + file=sys.stderr, + ) + paths = [e["path"] for e in (tree.get("tree") or []) if e.get("type") == "blob"] + if not paths: + return [] + contents = fetch_blob_texts(owner, repo, _remote_manifest_paths(paths), token) + return _frameworks_from_files(paths, lambda p: contents.get(p, "")) + + def _paginate_history(fetch_page, cached_oids, last_n, since, have_count_baseline, label, skip_first=False): """Walk a Commit.history connection page by page. @@ -810,6 +1184,7 @@ def collect_remote(slug, token, no_cache=False, commits_filter=None, since=None, default_branch, repo_size_kb, tags, + extras, ) = collect_local(cwd=clone_dir, suppress_current_user=True) if not github_base: github_base = f"https://github.com/{owner}/{repo}" @@ -824,6 +1199,7 @@ def collect_remote(slug, token, no_cache=False, commits_filter=None, since=None, default_branch, repo_size_kb, tags, + extras, ) history_block = """ @@ -997,6 +1373,9 @@ def bottom_fetch_page(cursor): logins[email] = user["login"] tags = fetch_remote_tags(owner, repo, token) + # Per-file languages need a clone, but manifests are cheap to fetch — so + # frameworks work on the GraphQL path; lang_stats stays empty here. + frameworks = fetch_frameworks_remote(owner, repo, token) return ( repo_name, repo_url, @@ -1008,6 +1387,7 @@ def bottom_fetch_page(cursor): default_branch, repo_size_kb, tags, + {"lang_stats": {}, "frameworks": frameworks}, ) @@ -1060,7 +1440,11 @@ def build_data( default_branch, repo_size_kb, tags, + extras, ): + lang_stats = (extras or {}).get("lang_stats", {}) + frameworks = (extras or {}).get("frameworks", []) + repo_langs = {} authors = {} daily_by_author = defaultdict(lambda: defaultdict(int)) hourly_by_author = defaultdict(lambda: [0] * 24) @@ -1095,6 +1479,7 @@ def build_data( "deleted": 0, "dates": set(), "daily_counts": defaultdict(int), + "langs": {}, "first": d_key, "last": d_key, }, @@ -1104,6 +1489,15 @@ def build_data( rec["deleted"] += d rec["dates"].add(d_key) rec["daily_counts"][d_key] += 1 + for lang, (la, ld, lf) in lang_stats.get(h, {}).items(): + agg = rec["langs"].setdefault(lang, [0, 0, 0]) + agg[0] += la + agg[1] += ld + agg[2] += lf + repo = repo_langs.setdefault(lang, [0, 0, 0]) + repo[0] += la + repo[1] += ld + repo[2] += lf if d_key < rec["first"]: rec["first"] = d_key if d_key > rec["last"]: @@ -1143,6 +1537,7 @@ def build_data( "busiestCount": busiest_count, "avatarUrl": avatar_url(r["email"], override=avatars.get(r["email"])), "highlight": bool(current_email) and r["email"] == current_email, + "languages": top_languages(r["langs"]), } ) @@ -1160,16 +1555,23 @@ def build_data( if meta["email"] not in top_emails: continue a, d = line_stats.get(h, [0, 0]) - commits_list.append( - { - "h": h[:7], - "s": (meta["subject"] or "")[:120], - "e": meta["email"], - "d": meta.get("iso") or "", - "a": a, - "l": d, - } - ) + entry = { + "h": h[:7], + "s": (meta["subject"] or "")[:120], + "e": meta["email"], + "d": meta.get("iso") or "", + "a": a, + "l": d, + } + cl = lang_stats.get(h) + if cl: + ftypes = sorted( + ([name, NAME_COLOR.get(name, OTHER_COLOR), files] + for name, (_, _, files) in cl.items()), + key=lambda x: x[2], reverse=True, + ) + entry["f"] = ftypes[:4] + commits_list.append(entry) date_range = ( {"start": min(all_dates), "end": max(all_dates)} @@ -1196,6 +1598,8 @@ def build_data( "dowData": dow_data, "commits": commits_list, "tags": tags or [], + "repoLanguages": top_languages(repo_langs), + "frameworks": frameworks or [], } @@ -1290,6 +1694,7 @@ def main(): default_branch, repo_size_kb, tags, + extras, ) = collect_remote( remote, token, @@ -1318,6 +1723,7 @@ def main(): default_branch, repo_size_kb, tags, + extras, ) = collect_local() if not commits_meta: @@ -1348,6 +1754,7 @@ def main(): default_branch, repo_size_kb, tags, + extras, ) enrich_contributor_profiles(data["contributors"], commits_meta, github_base, token=token) diff --git a/src/repo-intel/techdata.json b/src/repo-intel/techdata.json new file mode 100644 index 0000000..4b3084c --- /dev/null +++ b/src/repo-intel/techdata.json @@ -0,0 +1,2651 @@ +{ + "_source": { + "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml", + "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml" + }, + "fw_deps": { + "Go": { + "github.com/gin-gonic/gin": "Gin", + "github.com/go-chi/chi": "chi", + "github.com/gofiber/fiber": "Fiber", + "github.com/gorilla/mux": "Gorilla", + "github.com/labstack/echo": "Echo", + "github.com/spf13/cobra": "Cobra", + "google.golang.org/grpc": "gRPC", + "gorm.io/gorm": "GORM" + }, + "PHP": { + "cakephp/cakephp": "CakePHP", + "laravel/framework": "Laravel", + "slim/slim": "Slim", + "symfony/framework-bundle": "Symfony", + "symfony/symfony": "Symfony", + "yiisoft/yii2": "Yii" + }, + "Python": { + "aiohttp": "aiohttp", + "celery": "Celery", + "click": "Click", + "django": "Django", + "djangorestframework": "Django REST", + "fastapi": "FastAPI", + "flask": "Flask", + "httpx": "HTTPX", + "keras": "Keras", + "matplotlib": "Matplotlib", + "numpy": "NumPy", + "pandas": "pandas", + "pydantic": "Pydantic", + "pyramid": "Pyramid", + "pytest": "pytest", + "requests": "Requests", + "sanic": "Sanic", + "scikit-learn": "scikit-learn", + "scipy": "SciPy", + "scrapy": "Scrapy", + "sqlalchemy": "SQLAlchemy", + "starlette": "Starlette", + "tensorflow": "TensorFlow", + "torch": "PyTorch", + "tornado": "Tornado", + "transformers": "Transformers", + "typer": "Typer" + }, + "Ruby": { + "devise": "Devise", + "hanami": "Hanami", + "puma": "Puma", + "rails": "Rails", + "rspec": "RSpec", + "sidekiq": "Sidekiq", + "sinatra": "Sinatra" + }, + "Rust": { + "actix-web": "Actix Web", + "axum": "Axum", + "bevy": "Bevy", + "clap": "clap", + "diesel": "Diesel", + "rocket": "Rocket", + "serde": "Serde", + "tauri": "Tauri", + "tokio": "Tokio", + "tonic": "Tonic", + "warp": "warp" + }, + "npm": { + "@angular/core": "Angular", + "@apollo/client": "Apollo", + "@chakra-ui/react": "Chakra UI", + "@hapi/hapi": "hapi", + "@ionic/core": "Ionic", + "@mui/material": "MUI", + "@nestjs/core": "NestJS", + "@playwright/test": "Playwright", + "@prisma/client": "Prisma", + "@reduxjs/toolkit": "Redux", + "@remix-run/react": "Remix", + "@sveltejs/kit": "SvelteKit", + "astro": "Astro", + "bootstrap": "Bootstrap", + "chart.js": "Chart.js", + "cypress": "Cypress", + "d3": "D3", + "electron": "Electron", + "esbuild": "esbuild", + "eslint": "ESLint", + "expo": "Expo", + "express": "Express", + "fastify": "Fastify", + "gatsby": "Gatsby", + "jest": "Jest", + "koa": "Koa", + "mocha": "Mocha", + "mongoose": "Mongoose", + "next": "Next.js", + "nuxt": "Nuxt", + "parcel": "Parcel", + "playwright": "Playwright", + "preact": "Preact", + "prettier": "Prettier", + "prisma": "Prisma", + "react": "React", + "react-dom": "React", + "react-native": "React Native", + "redux": "Redux", + "rollup": "Rollup", + "sequelize": "Sequelize", + "solid-js": "SolidJS", + "styled-components": "styled-components", + "svelte": "Svelte", + "tailwindcss": "Tailwind CSS", + "three": "three.js", + "typeorm": "TypeORM", + "vite": "Vite", + "vitest": "Vitest", + "vue": "Vue", + "webpack": "webpack", + "zustand": "Zustand" + } + }, + "fw_sentinels_js": [ + [ + "next.config.js", + "Next.js" + ], + [ + "next.config.ts", + "Next.js" + ], + [ + "next.config.mjs", + "Next.js" + ], + [ + "nuxt.config.js", + "Nuxt" + ], + [ + "nuxt.config.ts", + "Nuxt" + ], + [ + "svelte.config.js", + "Svelte" + ], + [ + "astro.config.mjs", + "Astro" + ], + [ + "vue.config.js", + "Vue" + ], + [ + "gatsby-config.js", + "Gatsby" + ], + [ + "angular.json", + "Angular" + ] + ], + "fw_sentinels_other": [ + [ + "manage.py", + "Django", + "Python" + ], + [ + "artisan", + "Laravel", + "PHP" + ], + [ + "config/application.rb", + "Rails", + "Ruby" + ] + ], + "lang": { + "color": { + "1C Enterprise": "#814CCC", + "2-Dimensional Array": "#38761D", + "4D": "#004289", + "ABAP": "#E8274B", + "ABAP CDS": "#555e25", + "AGS Script": "#B9D9FF", + "AIDL": "#34EB6B", + "AL": "#3AA2B5", + "ALGOL": "#D1E0DB", + "AMPL": "#E6EFBB", + "ANTLR": "#9DC3FF", + "API Blueprint": "#2ACCA8", + "APL": "#5A8164", + "ASP.NET": "#9400ff", + "ATS": "#1ac620", + "ActionScript": "#882B0F", + "Ada": "#02f88c", + "Adblock Filter List": "#800000", + "Adobe Font Metrics": "#fa0f00", + "Agda": "#315665", + "Aiken": "#640ff8", + "Alloy": "#64C800", + "Alpine Abuild": "#0D597F", + "Altium Designer": "#A89663", + "AngelScript": "#C7D7DC", + "Answer Set Programming": "#A9CC29", + "Ant Build System": "#A9157E", + "Antlers": "#ff269e", + "ApacheConf": "#d12127", + "Apex": "#1797c0", + "Apollo Guidance Computer": "#0B3D91", + "AppleScript": "#101F1F", + "Arc": "#aa2afe", + "AsciiDoc": "#73a0c5", + "AspectJ": "#a957b0", + "Assembly": "#6E4C13", + "Astro": "#ff5a03", + "Asymptote": "#ff0000", + "Augeas": "#9CC134", + "AutoHotkey": "#6594b9", + "AutoIt": "#1C3552", + "Avro IDL": "#0040FF", + "Awk": "#c30e9b", + "B (Formal Method)": "#8aa8c5", + "B4X": "#00e4ff", + "BASIC": "#ff0000", + "BQN": "#2b7067", + "Ballerina": "#FF5000", + "Batchfile": "#C1F12E", + "Beef": "#a52f4e", + "Berry": "#15A13C", + "BibTeX": "#778899", + "Bicep": "#519aba", + "Bikeshed": "#5562ac", + "Bison": "#6A463F", + "BitBake": "#00bce4", + "Blade": "#f7523f", + "BlitzBasic": "#00FFAE", + "BlitzMax": "#cd6400", + "Bluespec": "#12223c", + "Bluespec BH": "#12223c", + "Boo": "#d4bec1", + "Boogie": "#c80fa0", + "Brainfuck": "#2F2530", + "BrighterScript": "#66AABB", + "Brightscript": "#662D91", + "Browserslist": "#ffd539", + "Bru": "#F4AA41", + "BuildStream": "#006bff", + "C": "#555555", + "C#": "#178600", + "C++": "#f34b7d", + "C3": "#2563eb", + "CAP CDS": "#0092d1", + "CLIPS": "#00A300", + "CMake": "#DA3434", + "COLLADA": "#F1A42B", + "CQL": "#006091", + "CSON": "#244776", + "CSS": "#663399", + "CSV": "#237346", + "CUE": "#5886E1", + "CWeb": "#00007a", + "Cabal Config": "#483465", + "Caddyfile": "#22b638", + "Cadence": "#00ef8b", + "Cairo": "#ff4a48", + "Cairo Zero": "#ff4a48", + "CameLIGO": "#3be133", + "Cangjie": "#00868B", + "Cap'n Proto": "#c42727", + "Carbon": "#222222", + "Ceylon": "#dfa535", + "Chapel": "#8dc63f", + "ChucK": "#3f8000", + "Circom": "#707575", + "Cirru": "#ccccff", + "Clarion": "#db901e", + "Clarity": "#5546ff", + "Classic ASP": "#6a40fd", + "Clean": "#3F85AF", + "Click": "#E4E6F3", + "Clojure": "#db5855", + "Closure Templates": "#0d948f", + "Cloud Firestore Security Rules": "#FFA000", + "Clue": "#0009b5", + "CodeQL": "#140f46", + "CoffeeScript": "#244776", + "ColdFusion": "#ed2cd6", + "ColdFusion CFC": "#ed2cd6", + "Common Lisp": "#3fb68b", + "Common Workflow Language": "#B5314C", + "Component Pascal": "#B0CE4E", + "Cooklang": "#E15A29", + "Crystal": "#000100", + "Csound": "#1a1a1a", + "Csound Document": "#1a1a1a", + "Csound Score": "#1a1a1a", + "Cuda": "#3A4E3A", + "Curry": "#531242", + "Cylc": "#00b3fd", + "Cypher": "#34c0eb", + "Cython": "#fedf5b", + "D": "#ba595e", + "D2": "#526ee8", + "DM": "#447265", + "Dafny": "#FFEC25", + "Darcs Patch": "#8eff23", + "Dart": "#00B4AB", + "Daslang": "#d3d3d3", + "DataWeave": "#003a52", + "Debian Package Control File": "#D70751", + "DenizenScript": "#FBEE96", + "Dhall": "#dfafff", + "DirectX 3D File": "#aace60", + "Dockerfile": "#384d54", + "Dogescript": "#cca760", + "Dotenv": "#e5d559", + "Dune": "#89421e", + "Dylan": "#6c616e", + "E": "#ccce35", + "ECL": "#8a1267", + "ECLiPSe": "#001d9d", + "EJS": "#a91e50", + "EQ": "#a78649", + "Earthly": "#2af0ff", + "Easybuild": "#069406", + "Ecere Projects": "#913960", + "Ecmarkup": "#eb8131", + "Edge": "#0dffe0", + "EdgeQL": "#31A7FF", + "EditorConfig": "#fff1f2", + "Eiffel": "#4d6977", + "Elixir": "#6e4a7e", + "Elm": "#60B5CC", + "Elvish": "#55BB55", + "Elvish Transcript": "#55BB55", + "Emacs Lisp": "#c065db", + "EmberScript": "#FFF4F3", + "Erlang": "#B83998", + "Euphoria": "#FF790B", + "F#": "#b845fc", + "F*": "#572e30", + "FIGlet Font": "#FFDDBB", + "FIRRTL": "#2f632f", + "FLUX": "#88ccff", + "Factor": "#636746", + "Fancy": "#7b9db4", + "Fantom": "#14253c", + "Faust": "#c37240", + "Fennel": "#fff3d7", + "Filebench WML": "#F6B900", + "FlatBuffers": "#ed284a", + "Flix": "#d44a45", + "Fluent": "#ffcc33", + "Forth": "#341708", + "Fortran": "#4d41b1", + "Fortran Free Form": "#4d41b1", + "FreeBASIC": "#141AC9", + "FreeMarker": "#0050b2", + "Frege": "#00cafe", + "Futhark": "#5f021f", + "G-code": "#D08CF2", + "GAML": "#FFC766", + "GAMS": "#f49a22", + "GAP": "#0000cc", + "GCC Machine Description": "#FFCFAB", + "GDScript": "#355570", + "GDShader": "#478CBF", + "GEDCOM": "#003058", + "GLSL": "#5686a5", + "GSC": "#FF6800", + "Game Maker Language": "#71b417", + "Gemfile.lock": "#701516", + "Gemini": "#ff6900", + "Genero 4gl": "#63408e", + "Genero per": "#d8df39", + "Genie": "#fb855d", + "Genshi": "#951531", + "Gentoo Ebuild": "#9400ff", + "Gentoo Eclass": "#9400ff", + "Gerber Image": "#d20b00", + "Gherkin": "#5B2063", + "Git Attributes": "#F44D27", + "Git Commit": "#F44D27", + "Git Config": "#F44D27", + "Git Revision List": "#F44D27", + "Gleam": "#ffaff3", + "Glimmer JS": "#F5835F", + "Glimmer TS": "#3178c6", + "Glyph": "#c1ac7f", + "Gnuplot": "#f0a9f0", + "Go": "#00ADD8", + "Go Checksums": "#00ADD8", + "Go Module": "#00ADD8", + "Go Template": "#00ADD8", + "Go Workspace": "#00ADD8", + "Godot Resource": "#355570", + "Golo": "#88562A", + "Gosu": "#82937f", + "Grace": "#615f8b", + "Gradle": "#02303a", + "Gradle Kotlin DSL": "#02303a", + "Grammatical Framework": "#ff0000", + "GraphQL": "#e10098", + "Graphviz (DOT)": "#2596be", + "Groovy": "#4298b8", + "Groovy Server Pages": "#4298b8", + "HAProxy": "#106da9", + "HCL": "#844FBA", + "HIP": "#4F3A4F", + "HLSL": "#aace60", + "HOCON": "#9ff8ee", + "HTML": "#e34c26", + "HTML+ECR": "#2e1052", + "HTML+EEX": "#6e4a7e", + "HTML+ERB": "#701516", + "HTML+PHP": "#4f5d95", + "HTML+Razor": "#512be4", + "HTTP": "#005C9C", + "HXML": "#f68712", + "Hack": "#878787", + "Haml": "#ece2a9", + "Handlebars": "#f7931e", + "Harbour": "#0e60e3", + "Hare": "#9d7424", + "Haskell": "#5e5086", + "Haxe": "#df7900", + "HiveQL": "#dce200", + "HolyC": "#ffefaf", + "Hosts File": "#308888", + "Hurl": "#FF0288", + "Hy": "#7790B2", + "IDL": "#a3522f", + "IGOR Pro": "#0000cc", + "IL Assembly": "#512BD4", + "INI": "#d1dbe0", + "ISPC": "#2D68B1", + "Idris": "#b30000", + "Ignore List": "#000000", + "ImageJ Macro": "#99AAFF", + "Imba": "#16cec6", + "Inno Setup": "#264b99", + "Io": "#a9188d", + "Ioke": "#078193", + "Isabelle": "#FEFE00", + "Isabelle ROOT": "#FEFE00", + "J": "#9EEDFF", + "JAR Manifest": "#b07219", + "JCL": "#d90e09", + "JFlex": "#DBCA00", + "JSON": "#292929", + "JSON with Comments": "#292929", + "JSON5": "#267CB9", + "JSONLD": "#0c479c", + "JSONiq": "#40d47e", + "Jac": "#FC792D", + "Jai": "#ab8b4b", + "Janet": "#0886a5", + "Jasmin": "#d03600", + "Java": "#b07219", + "Java Properties": "#2A6277", + "Java Server Pages": "#2A6277", + "Java Template Engine": "#2A6277", + "JavaScript": "#f1e05a", + "JavaScript+ERB": "#f1e05a", + "Jest Snapshot": "#15c213", + "JetBrains MPS": "#21D789", + "Jinja": "#a52a22", + "Jison": "#56b3cb", + "Jison Lex": "#56b3cb", + "Jolie": "#843179", + "Jsonnet": "#0064bd", + "Julia": "#a270ba", + "Julia REPL": "#a270ba", + "Jupyter Notebook": "#DA5B0B", + "Just": "#384d54", + "KCL": "#7ABABF", + "KDL": "#ffb3b3", + "KFramework": "#4195c5", + "KRL": "#28430A", + "Kaitai Struct": "#773b37", + "KakouneScript": "#6f8042", + "KerboScript": "#41adf0", + "KiCad Layout": "#2f4aab", + "KiCad Legacy Layout": "#2f4aab", + "KiCad Schematic": "#2f4aab", + "KoLmafia ASH": "#B9D9B9", + "Koka": "#215166", + "Kotlin": "#A97BFF", + "LFE": "#4C3023", + "LLVM": "#185619", + "LOLCODE": "#cc9900", + "LSL": "#3d9970", + "LabVIEW": "#fede06", + "Lambdapi": "#8027a3", + "Langium": "#2c8c87", + "Lark": "#2980B9", + "Lasso": "#999999", + "Latte": "#f2a542", + "Leo": "#C4FFC2", + "Less": "#1d365d", + "Lex": "#DBCA00", + "LigoLANG": "#0e74ff", + "LilyPond": "#9ccc7c", + "Liquid": "#67b8de", + "Liquidsoap": "#990066", + "Literate Agda": "#315665", + "Literate CoffeeScript": "#244776", + "Literate Haskell": "#5e5086", + "LiveCode Script": "#0c5ba5", + "LiveScript": "#499886", + "Logtalk": "#295b9a", + "LookML": "#652B81", + "Lua": "#000080", + "Luau": "#00A2FF", + "M3U": "#179C7D", + "MATLAB": "#e16737", + "MAXScript": "#00a6a6", + "MDX": "#fcb32c", + "MLIR": "#5EC8DB", + "MQL4": "#62A8D6", + "MQL5": "#4A76B8", + "MTML": "#b7e1f4", + "Macaulay2": "#d8ffff", + "Makefile": "#427819", + "Mako": "#7e858d", + "Markdown": "#083fa1", + "Marko": "#42bff2", + "Mask": "#f97732", + "Mathematical Programming System": "#0530ad", + "Max": "#c4a79c", + "MeTTa": "#6a5acd", + "Mercury": "#ff2b2b", + "Mermaid": "#ff3670", + "Meson": "#007800", + "Metal": "#8f14e9", + "MiniYAML": "#ff1111", + "MiniZinc": "#06a9e6", + "Mint": "#02b046", + "Mirah": "#c7a938", + "Modelica": "#de1d31", + "Modula-2": "#10253f", + "Modula-3": "#223388", + "Mojo": "#ff4c1f", + "Monkey C": "#8D6747", + "MoonBit": "#b92381", + "MoonScript": "#ff4585", + "Motoko": "#fbb03b", + "Motorola 68K Assembly": "#005daa", + "Move": "#4a137a", + "Mustache": "#724b3b", + "NCL": "#28431f", + "NMODL": "#00356B", + "NPM Config": "#cb3837", + "NWScript": "#111522", + "Nasal": "#1d2c4e", + "Nearley": "#990000", + "Nemerle": "#3d3c6e", + "NetLinx": "#0aa0ff", + "NetLinx+ERB": "#747faa", + "NetLogo": "#ff6375", + "NewLisp": "#87AED7", + "Nextflow": "#3ac486", + "Nginx": "#009639", + "Nickel": "#E0C3FC", + "Nim": "#ffc200", + "Nit": "#009917", + "Nix": "#7e7eff", + "Noir": "#2f1f49", + "Nu": "#c9df40", + "NumPy": "#9C8AF9", + "Nunjucks": "#3d8137", + "Nushell": "#4E9906", + "OASv2-json": "#85ea2d", + "OASv2-yaml": "#85ea2d", + "OASv3-json": "#85ea2d", + "OASv3-yaml": "#85ea2d", + "OCaml": "#ef7a08", + "OMNeT++ MSG": "#a0e0a0", + "OMNeT++ NED": "#08607c", + "ObjectScript": "#424893", + "Objective-C": "#438eff", + "Objective-C++": "#6866fb", + "Objective-J": "#ff0c5a", + "Odin": "#60AFFE", + "Omgrofl": "#cabbff", + "Opal": "#f7ede0", + "Open Policy Agent": "#7d9199", + "OpenAPI Specification v2": "#85ea2d", + "OpenAPI Specification v3": "#85ea2d", + "OpenCL": "#ed2e2d", + "OpenEdge ABL": "#5ce600", + "OpenQASM": "#AA70FF", + "OpenSCAD": "#e5cd45", + "Option List": "#476732", + "Org": "#77aa99", + "OverpassQL": "#cce2aa", + "Oxygene": "#cdd0e3", + "Oz": "#fab738", + "P4": "#7055b5", + "PDDL": "#0d00ff", + "PEG.js": "#234d6b", + "PHP": "#4F5D95", + "PLSQL": "#dad8d8", + "PLpgSQL": "#336790", + "POV-Ray SDL": "#6bac65", + "Pact": "#F7A8B8", + "Pan": "#cc0000", + "Papyrus": "#6600cc", + "Parrot": "#f3ca0a", + "Pascal": "#E3F171", + "Pawn": "#dbb284", + "Pep8": "#C76F5B", + "Perl": "#0298c3", + "PicoLisp": "#6067af", + "PigLatin": "#fcd7de", + "Pike": "#005390", + "Pip Requirements": "#FFD343", + "Pkl": "#6b9543", + "PlantUML": "#fbbd16", + "PogoScript": "#d80074", + "Polar": "#ae81ff", + "Portugol": "#f8bd00", + "PostCSS": "#dc3a0c", + "PostScript": "#da291c", + "PowerBuilder": "#8f0f8d", + "PowerShell": "#012456", + "Praat": "#c8506d", + "Prisma": "#0c344b", + "Processing": "#0096D8", + "Procfile": "#3B2F63", + "Prolog": "#74283c", + "Promela": "#de0000", + "Propeller Spin": "#7fa2a7", + "Pug": "#a86454", + "Puppet": "#302B6D", + "PureBasic": "#5a6986", + "PureScript": "#1D222D", + "Pyret": "#ee1e10", + "Python": "#3572A5", + "Python console": "#3572A5", + "Python traceback": "#3572A5", + "Q#": "#fed659", + "QML": "#44a51c", + "Qt Script": "#00b841", + "Quake": "#882233", + "QuakeC": "#975777", + "QuickBASIC": "#008080", + "Quint": "#9d6ce5", + "R": "#198CE7", + "RAML": "#77d9fb", + "RAScript": "#2C97FA", + "RBS": "#701516", + "RDoc": "#701516", + "REXX": "#d90e09", + "RMarkdown": "#198ce7", + "RON": "#a62c00", + "ROS Interface": "#22314e", + "RPGLE": "#2BDE21", + "RUNOFF": "#665a4e", + "Racket": "#3c5caa", + "Ragel": "#9d5200", + "Raku": "#0000fb", + "Rascal": "#fffaa0", + "ReScript": "#ed5051", + "Reason": "#ff5847", + "ReasonLIGO": "#ff5847", + "Rebol": "#358a5b", + "Record Jar": "#0673ba", + "Red": "#f50000", + "Regular Expression": "#009a00", + "Ren'Py": "#ff7f7f", + "Rez": "#FFDAB3", + "Ring": "#2D54CB", + "Riot": "#A71E49", + "RobotFramework": "#00c0b5", + "Roc": "#7c38f5", + "Rocq Prover": "#d0b68c", + "Roff": "#ecdebe", + "Roff Manpage": "#ecdebe", + "Rouge": "#cc0088", + "RouterOS Script": "#DE3941", + "Ruby": "#701516", + "Rust": "#dea584", + "SAS": "#B34936", + "SCSS": "#c6538c", + "SPARQL": "#0C4597", + "SQF": "#3F3F3F", + "SQL": "#e38c00", + "SQLPL": "#e38c00", + "SRecode Template": "#348a34", + "STL": "#373b5e", + "SVG": "#ff9900", + "Sail": "#259dd5", + "SaltStack": "#646464", + "Sass": "#a53b70", + "Scala": "#c22d40", + "Scaml": "#bd181a", + "Scenic": "#fdc700", + "Scheme": "#1e4aec", + "Scilab": "#ca0f21", + "Self": "#0579aa", + "ShaderLab": "#222c37", + "Shell": "#89e051", + "ShellCheck Config": "#cecfcb", + "Shen": "#120F14", + "Simple File Verification": "#C9BFED", + "Singularity": "#64E6AD", + "Slang": "#1fbec9", + "Slash": "#007eff", + "Slice": "#003fa2", + "Slim": "#2b2b2b", + "Slint": "#2379F4", + "SmPL": "#c94949", + "Smalltalk": "#596706", + "Smarty": "#f0c040", + "Smithy": "#c44536", + "Snakemake": "#419179", + "Solidity": "#AA6746", + "SourcePawn": "#f69e1d", + "SpiceDB Schema": "#a5318a", + "Squirrel": "#800000", + "Stan": "#b2011d", + "Standard ML": "#dc566d", + "Starlark": "#76d275", + "Stata": "#1a5f91", + "StringTemplate": "#3fb34f", + "Stylus": "#ff6347", + "SubRip Text": "#9e0101", + "SugarSS": "#2fcc9f", + "SuperCollider": "#46390b", + "SurrealQL": "#ff00a0", + "Survex data": "#ffcc99", + "Svelte": "#ff3e00", + "Sway": "#00F58C", + "Sweave": "#198ce7", + "Swift": "#F05138", + "SystemVerilog": "#DAE1C2", + "TI Program": "#A0AA87", + "TL-Verilog": "#C40023", + "TLA": "#4b0079", + "TMDL": "#f0c913", + "TOML": "#9c4221", + "TSQL": "#e38c00", + "TSV": "#237346", + "TSX": "#3178c6", + "TXL": "#0178b8", + "Tact": "#48b5ff", + "Talon": "#333333", + "Tcl": "#e4cc98", + "TeX": "#3D6117", + "Teal": "#00B1BC", + "Terra": "#00004c", + "Terraform Template": "#7b42bb", + "TextGrid": "#c8506d", + "TextMate Properties": "#df66e4", + "Textile": "#ffe7ac", + "Thrift": "#D12127", + "Toit": "#c2c9fb", + "Tor Config": "#59316b", + "Tree-sitter Query": "#8ea64c", + "Turing": "#cf142b", + "Twig": "#c1d026", + "TypeScript": "#3178c6", + "TypeSpec": "#4A3665", + "Typst": "#239dad", + "Unified Parallel C": "#4e3617", + "Unity3D Asset": "#222c37", + "Uno": "#9933cc", + "UnrealScript": "#a54c4d", + "Untyped Plutus Core": "#36adbd", + "UrWeb": "#ccccee", + "V": "#4f87c4", + "VBA": "#867db1", + "VBScript": "#15dcdc", + "VCL": "#148AA8", + "VHDL": "#adb2cb", + "Vala": "#a56de2", + "Valve Data Format": "#f26025", + "Velocity Template Language": "#507cff", + "Vento": "#ff0080", + "Verilog": "#b2b7f8", + "Vim Help File": "#199f4b", + "Vim Script": "#199f4b", + "Vim Snippet": "#199f4b", + "Visual Basic .NET": "#945db7", + "Visual Basic 6.0": "#2c6353", + "Volt": "#1F1F1F", + "Vue": "#41b883", + "Vyper": "#9F4CF2", + "WDL": "#42f1f4", + "WGSL": "#1a5e9a", + "Web Ontology Language": "#5b70bd", + "WebAssembly": "#04133b", + "WebAssembly Interface Type": "#6250e7", + "Whiley": "#d5c397", + "Wikitext": "#fc5757", + "Windows Registry Entries": "#52d5ff", + "Witcher Script": "#ff0000", + "Wolfram Language": "#dd1100", + "Wollok": "#a23738", + "World of Warcraft Addon Data": "#f7e43f", + "Wren": "#383838", + "X10": "#4B6BEF", + "XC": "#99DA07", + "XML": "#0060ac", + "XML Property List": "#0060ac", + "XQuery": "#5232e7", + "XSLT": "#EB8CEB", + "Xmake": "#22a079", + "Xojo": "#81bd41", + "Xonsh": "#285EEF", + "Xtend": "#24255d", + "YAML": "#cb171e", + "YARA": "#220000", + "YASnippet": "#32AB90", + "Yacc": "#4B6C4B", + "Yul": "#794932", + "ZAP": "#0d665e", + "ZIL": "#dc75e5", + "ZenScript": "#00BCD1", + "Zephir": "#118f9e", + "Zig": "#ec915c", + "Zimpl": "#d67711", + "Zmodel": "#ff7100", + "crontab": "#ead7ac", + "eC": "#913960", + "fish": "#4aae47", + "hoon": "#00b171", + "iCalendar": "#ec564c", + "jq": "#c7254e", + "kvlang": "#1da6e0", + "mIRC Script": "#3d57c3", + "mcfunction": "#E22837", + "mdsvex": "#5f9ea0", + "mupad": "#244963", + "nanorc": "#2d004d", + "nesC": "#94B0C7", + "ooc": "#b0b77e", + "q": "#0040cd", + "reStructuredText": "#141414", + "sed": "#64b970", + "templ": "#66D0DD", + "vCard": "#ee2647", + "wisp": "#7582D1", + "xBase": "#403a40" + }, + "ext": { + "1": "Roff", + "1in": "Roff", + "1m": "Roff", + "1x": "Roff", + "2": "Roff", + "2da": "2-Dimensional Array", + "3": "Roff", + "3in": "Roff", + "3m": "Roff", + "3p": "Roff", + "3pm": "Roff", + "3qt": "Roff", + "3x": "Roff", + "4": "Roff", + "4dform": "JSON", + "4dm": "4D", + "4dproject": "JSON", + "4gl": "Genero 4gl", + "4th": "Forth", + "5": "Roff", + "6": "Roff", + "6pl": "Raku", + "6pm": "Raku", + "7": "Roff", + "8": "Roff", + "8xp": "TI Program", + "8xp.txt": "TI Program", + "9": "Roff", + "_coffee": "CoffeeScript", + "_js": "JavaScript", + "_ls": "LiveScript", + "a51": "Assembly", + "abap": "ABAP", + "action": "ROS Interface", + "ada": "Ada", + "adb": "Ada", + "adml": "XML", + "admx": "XML", + "ado": "Stata", + "adoc": "AsciiDoc", + "adp": "Tcl", + "ads": "Ada", + "afm": "Adobe Font Metrics", + "agc": "Assembly", + "agda": "Agda", + "ahk": "AutoHotkey", + "ahkl": "AutoHotkey", + "aidl": "AIDL", + "aj": "AspectJ", + "ak": "Aiken", + "al": "AL", + "alg": "ALGOL", + "als": "Alloy", + "ampl": "AMPL", + "angelscript": "AngelScript", + "anim": "Unity3D Asset", + "ant": "XML", + "antlers.html": "Antlers", + "antlers.php": "Antlers", + "antlers.xml": "Antlers", + "apacheconf": "ApacheConf", + "apex": "Apex", + "apib": "API Blueprint", + "apl": "APL", + "app": "Erlang", + "app.src": "Erlang", + "applescript": "AppleScript", + "arc": "Arc", + "arr": "Pyret", + "as": "ActionScript", + "asax": "ASP.NET", + "asc": "AGS Script", + "asciidoc": "AsciiDoc", + "ascx": "ASP.NET", + "asd": "Common Lisp", + "asddls": "ABAP CDS", + "ash": "KoLmafia ASH", + "ashx": "ASP.NET", + "asm": "Assembly", + "asmx": "ASP.NET", + "asp": "Classic ASP", + "aspx": "ASP.NET", + "asset": "Unity3D Asset", + "astro": "Astro", + "asy": "Asymptote", + "au3": "AutoIt", + "aug": "Augeas", + "auk": "Awk", + "aux": "TeX", + "avdl": "Avro IDL", + "avsc": "JSON", + "aw": "PHP", + "awk": "Awk", + "axaml": "XML", + "axd": "ASP.NET", + "axi": "NetLinx", + "axi.erb": "NetLinx+ERB", + "axml": "XML", + "axs": "NetLinx", + "axs.erb": "NetLinx+ERB", + "b": "Brainfuck", + "bal": "Ballerina", + "bas": "B4X", + "bash": "Shell", + "bat": "Batchfile", + "bats": "Shell", + "bb": "BitBake", + "bbappend": "BitBake", + "bbclass": "BitBake", + "bbx": "TeX", + "bdy": "PLSQL", + "be": "Berry", + "bf": "Beef", + "bi": "FreeBASIC", + "bib": "TeX", + "bibtex": "TeX", + "bicep": "Bicep", + "bicepparam": "Bicep", + "bison": "Yacc", + "blade": "Blade", + "blade.php": "Blade", + "bmx": "BlitzMax", + "bones": "JavaScript", + "boo": "Boo", + "boot": "Clojure", + "bpl": "Boogie", + "bqn": "BQN", + "brd": "KiCad Legacy Layout", + "brs": "Brightscript", + "bru": "Bru", + "bs": "Bluespec", + "bsl": "1C Enterprise", + "bst": "BuildStream", + "bsv": "Bluespec", + "builder": "Ruby", + "builds": "XML", + "bzl": "Starlark", + "c": "C", + "c++": "C++", + "c3": "C3", + "cabal": "Cabal Config", + "caddyfile": "Caddyfile", + "cairo": "Cairo", + "cake": "C#", + "capnp": "Cap'n Proto", + "carbon": "Carbon", + "cats": "C", + "cbx": "TeX", + "cc": "C++", + "ccproj": "XML", + "ccxml": "XML", + "cdc": "Cadence", + "cdf": "Wolfram Language", + "cds": "CAP CDS", + "ceylon": "Ceylon", + "cfc": "ColdFusion", + "cfg": "HAProxy", + "cfm": "ColdFusion", + "cfml": "ColdFusion", + "cgi": "Perl", + "cginc": "HLSL", + "ch": "xBase", + "chpl": "Chapel", + "circom": "Circom", + "cirru": "Cirru", + "cj": "Cangjie", + "cjs": "JavaScript", + "cjsx": "CoffeeScript", + "ck": "ChucK", + "cl": "C", + "cl2": "Clojure", + "clar": "Clarity", + "click": "Click", + "clixml": "XML", + "clj": "Clojure", + "cljc": "Clojure", + "cljs": "Clojure", + "cljs.hl": "Clojure", + "cljscm": "Clojure", + "cljx": "Clojure", + "clp": "CLIPS", + "cls": "Apex", + "clue": "Clue", + "clw": "Clarion", + "cmake": "CMake", + "cmake.in": "CMake", + "cmd": "Batchfile", + "cmp": "Gerber Image", + "cnc": "G-code", + "cnf": "INI", + "cocci": "SmPL", + "code-snippets": "JSON", + "code-workspace": "JSON", + "coffee": "CoffeeScript", + "coffee.md": "CoffeeScript", + "command": "Shell", + "containerfile": "Dockerfile", + "cook": "Cooklang", + "coq": "Rocq Prover", + "cp": "Component Pascal", + "cpp": "C++", + "cppm": "C++", + "cproject": "XML", + "cps": "Component Pascal", + "cql": "CQL", + "cr": "Crystal", + "cs": "C#", + "cs.pp": "C#", + "csc": "GSC", + "cscfg": "XML", + "csd": "Csound Document", + "csdef": "XML", + "cshtml": "HTML", + "csl": "XML", + "cson": "CSON", + "csproj": "XML", + "css": "CSS", + "csv": "CSV", + "csx": "C#", + "ct": "XML", + "ctl": "Visual Basic 6.0", + "ctp": "PHP", + "cts": "TypeScript", + "cu": "Cuda", + "cue": "CUE", + "cuh": "Cuda", + "curry": "Curry", + "cwl": "Common Workflow Language", + "cxx": "C++", + "cylc": "INI", + "cyp": "Cypher", + "cypher": "Cypher", + "d": "D", + "d2": "D2", + "dae": "COLLADA", + "darcspatch": "Darcs Patch", + "dart": "Dart", + "das": "Daslang", + "dats": "ATS", + "db2": "SQLPL", + "dcl": "Clean", + "ddl": "PLSQL", + "decls": "BlitzBasic", + "depproj": "XML", + "dfm": "Pascal", + "dfy": "Dafny", + "dhall": "Dhall", + "di": "D", + "dita": "XML", + "ditamap": "XML", + "ditaval": "XML", + "djs": "Dogescript", + "dll.config": "XML", + "dlm": "IDL", + "dm": "DM", + "do": "Stata", + "dockerfile": "Dockerfile", + "dof": "INI", + "doh": "Stata", + "dot": "Graphviz (DOT)", + "dotsettings": "XML", + "dpatch": "Darcs Patch", + "dpr": "Pascal", + "druby": "Mirah", + "dsc": "DenizenScript", + "dsp": "Faust", + "dsr": "Visual Basic 6.0", + "dtx": "TeX", + "duby": "Mirah", + "dwl": "DataWeave", + "dyalog": "APL", + "dyl": "Dylan", + "dylan": "Dylan", + "e": "E", + "eb": "Python", + "ebuild": "Shell", + "ec": "eC", + "ecl": "ECL", + "eclass": "Shell", + "eclxml": "ECL", + "ecr": "HTML", + "ect": "EJS", + "edge": "Edge", + "edgeql": "EdgeQL", + "editorconfig": "INI", + "eh": "eC", + "ejs": "EJS", + "ejs.t": "EJS", + "el": "Emacs Lisp", + "eliom": "OCaml", + "eliomi": "OCaml", + "elm": "Elm", + "elv": "Elvish", + "em": "EmberScript", + "emacs": "Emacs Lisp", + "emacs.desktop": "Emacs Lisp", + "emberscript": "EmberScript", + "env": "Dotenv", + "epj": "JavaScript", + "eps": "PostScript", + "epsi": "PostScript", + "eq": "EQ", + "erb": "HTML", + "erb.deface": "HTML", + "erl": "Erlang", + "es": "Erlang", + "es6": "JavaScript", + "escript": "Erlang", + "esdl": "EdgeQL", + "ex": "Elixir", + "exs": "Elixir", + "eye": "Ruby", + "f": "Fortran", + "f03": "Fortran", + "f08": "Fortran", + "f77": "Fortran", + "f90": "Fortran", + "f95": "Fortran", + "factor": "Factor", + "fan": "Fantom", + "fancypack": "Fancy", + "fbs": "FlatBuffers", + "fcgi": "Lua", + "feature": "Gherkin", + "filters": "XML", + "fir": "FIRRTL", + "fish": "Shell", + "flex": "Lex", + "flf": "FIGlet Font", + "flix": "Flix", + "flux": "FLUX", + "fnc": "PLSQL", + "fnl": "Fennel", + "for": "Fortran", + "forth": "Forth", + "fp": "GLSL", + "fpp": "Fortran", + "fr": "Frege", + "frag": "GLSL", + "frg": "GLSL", + "frm": "VBA", + "frt": "Forth", + "fs": "F#", + "fsh": "GLSL", + "fshader": "GLSL", + "fsi": "F#", + "fsproj": "XML", + "fst": "F*", + "fsti": "F*", + "fsx": "F#", + "fth": "Forth", + "ftl": "Fluent", + "ftlh": "FreeMarker", + "fun": "Standard ML", + "fut": "Futhark", + "fx": "FLUX", + "fxh": "HLSL", + "fxml": "XML", + "fy": "Fancy", + "g": "G-code", + "g4": "ANTLR", + "gaml": "GAML", + "gap": "GAP", + "gawk": "Awk", + "gbl": "Gerber Image", + "gbo": "Gerber Image", + "gbp": "Gerber Image", + "gbr": "Gerber Image", + "gbs": "Gerber Image", + "gco": "G-code", + "gcode": "G-code", + "gd": "GDScript", + "gdnlib": "Godot Resource", + "gdns": "Godot Resource", + "gdshader": "GDShader", + "gdshaderinc": "GDShader", + "ged": "GEDCOM", + "gemspec": "Ruby", + "geo": "GLSL", + "geojson": "JSON", + "geom": "GLSL", + "gf": "Grammatical Framework", + "gi": "GAP", + "gitconfig": "INI", + "gitignore": "Ignore List", + "gjs": "JavaScript", + "gko": "Gerber Image", + "glade": "XML", + "gleam": "Gleam", + "glf": "Glyph", + "glsl": "GLSL", + "glslf": "GLSL", + "glslv": "GLSL", + "gltf": "JSON", + "gmi": "Gemini", + "gml": "Game Maker Language", + "gms": "GAMS", + "gmx": "XML", + "gnu": "Gnuplot", + "gnuplot": "Gnuplot", + "go": "Go", + "god": "Ruby", + "gohtml": "Go Template", + "golo": "Golo", + "gotmpl": "Go Template", + "gp": "Gnuplot", + "gpb": "Gerber Image", + "gpt": "Gerber Image", + "gpx": "XML", + "gql": "GraphQL", + "grace": "Grace", + "gradle": "Gradle", + "gradle.kts": "Gradle", + "graphql": "GraphQL", + "graphqls": "GraphQL", + "groovy": "Groovy", + "grt": "Groovy", + "grxml": "XML", + "gs": "Genie", + "gsc": "GSC", + "gsh": "GSC", + "gshader": "GLSL", + "gsp": "Groovy", + "gst": "Gosu", + "gsx": "Gosu", + "gtl": "Gerber Image", + "gto": "Gerber Image", + "gtp": "Gerber Image", + "gtpl": "Groovy", + "gts": "TypeScript", + "gv": "Graphviz (DOT)", + "gvy": "Groovy", + "gyp": "Python", + "gypi": "Python", + "h": "C", + "h++": "C++", + "h.in": "C", + "ha": "Hare", + "hack": "Hack", + "haml": "Haml", + "haml.deface": "Haml", + "handlebars": "Handlebars", + "har": "JSON", + "hats": "ATS", + "hb": "Harbour", + "hbs": "Handlebars", + "hc": "HolyC", + "hcl": "HCL", + "heex": "HTML", + "hh": "C++", + "hhi": "Hack", + "hic": "Clojure", + "hip": "HIP", + "hlsl": "HLSL", + "hlsli": "HLSL", + "hocon": "HOCON", + "hoon": "hoon", + "hpp": "C++", + "hqf": "SQF", + "hql": "HiveQL", + "hrl": "Erlang", + "hs": "Haskell", + "hs-boot": "Haskell", + "hsc": "Haskell", + "hta": "HTML", + "htm": "HTML", + "html": "HTML", + "html.eex": "HTML", + "html.hl": "HTML", + "html.tmpl": "Go Template", + "http": "HTTP", + "hurl": "Hurl", + "hx": "Haxe", + "hxml": "HXML", + "hxsl": "Haxe", + "hxx": "C++", + "hy": "Hy", + "hzp": "XML", + "i": "Assembly", + "i3": "Modula-3", + "ical": "iCalendar", + "ice": "Slice", + "iced": "CoffeeScript", + "icl": "Clean", + "icls": "XML", + "ics": "iCalendar", + "idc": "C", + "idr": "Idris", + "ig": "Modula-3", + "ihlp": "Stata", + "ijm": "ImageJ Macro", + "ijs": "J", + "ik": "Ioke", + "il": "IL Assembly", + "ily": "LilyPond", + "imba": "Imba", + "iml": "XML", + "inc": "Assembly", + "ini": "INI", + "inl": "C++", + "ino": "C++", + "ins": "TeX", + "intr": "Dylan", + "io": "Io", + "iol": "Jolie", + "ipf": "IGOR Pro", + "ipp": "C++", + "ipynb": "Jupyter Notebook", + "isl": "Inno Setup", + "ispc": "ISPC", + "iss": "Inno Setup", + "iuml": "PlantUML", + "ivy": "XML", + "ixx": "C++", + "j": "Jasmin", + "j2": "Jinja", + "jac": "Jac", + "jade": "Pug", + "jai": "Jai", + "jake": "JavaScript", + "janet": "Janet", + "jav": "Java", + "java": "Java", + "javascript": "JavaScript", + "jbuilder": "Ruby", + "jcl": "JCL", + "jelly": "XML", + "jflex": "Lex", + "jinja": "Jinja", + "jinja2": "Jinja", + "jison": "Yacc", + "jisonlex": "Lex", + "jl": "Julia", + "jq": "JSONiq", + "js": "JavaScript", + "js.erb": "JavaScript", + "jsb": "JavaScript", + "jscad": "JavaScript", + "jsfl": "JavaScript", + "jsh": "Java", + "jslib": "JavaScript", + "jsm": "JavaScript", + "json": "JSON", + "json-tmlanguage": "JSON", + "json.example": "JSON", + "json5": "JSON5", + "jsonc": "JSON", + "jsonl": "JSON", + "jsonld": "JSONLD", + "jsonnet": "Jsonnet", + "jsp": "Java", + "jspre": "JavaScript", + "jsproj": "XML", + "jss": "JavaScript", + "jst": "EJS", + "jsx": "JavaScript", + "jte": "Java", + "just": "Just", + "k": "KCL", + "kak": "KakouneScript", + "kdl": "KDL", + "kicad_mod": "KiCad Layout", + "kicad_pcb": "KiCad Layout", + "kicad_sch": "KiCad Schematic", + "kicad_sym": "KiCad Schematic", + "kicad_wks": "KiCad Layout", + "kid": "Genshi", + "kk": "Koka", + "kml": "XML", + "kojo": "Scala", + "krl": "KRL", + "ks": "KerboScript", + "ksh": "Shell", + "ksy": "Kaitai Struct", + "kt": "Kotlin", + "ktm": "Kotlin", + "kts": "Kotlin", + "kv": "kvlang", + "l": "Common Lisp", + "lagda": "Agda", + "langium": "Langium", + "lark": "Lark", + "las": "Lasso", + "lasso": "Lasso", + "lasso8": "Lasso", + "lasso9": "Lasso", + "latte": "Latte", + "launch": "XML", + "lbx": "TeX", + "leex": "HTML", + "lektorproject": "INI", + "leo": "Leo", + "less": "Less", + "lex": "Lex", + "lfe": "LFE", + "lgt": "Logtalk", + "lhs": "Haskell", + "libsonnet": "Jsonnet", + "lid": "Dylan", + "lidr": "Idris", + "ligo": "LigoLANG", + "linq": "C#", + "liq": "Liquidsoap", + "liquid": "Liquid", + "lisp": "Common Lisp", + "litcoffee": "CoffeeScript", + "livecodescript": "LiveCode Script", + "livemd": "Markdown", + "lkml": "LookML", + "ll": "LLVM", + "lmi": "Python", + "logtalk": "Logtalk", + "lol": "LOLCODE", + "lookml": "LookML", + "lp": "Answer Set Programming", + "lpr": "Pascal", + "ls": "LiveScript", + "lsl": "LSL", + "lslp": "LSL", + "lsp": "Common Lisp", + "ltx": "TeX", + "lua": "Lua", + "luau": "Luau", + "lvclass": "LabVIEW", + "lvlib": "LabVIEW", + "lvproj": "LabVIEW", + "ly": "LilyPond", + "m": "Objective-C", + "m2": "Macaulay2", + "m3": "Modula-3", + "m3u": "M3U", + "m3u8": "M3U", + "ma": "Wolfram Language", + "mak": "Makefile", + "make": "Makefile", + "makefile": "Makefile", + "mako": "Mako", + "man": "Roff", + "mao": "Mako", + "markdown": "Markdown", + "marko": "Marko", + "mask": "Mask", + "mat": "Unity3D Asset", + "mata": "Stata", + "matah": "Stata", + "mathematica": "Wolfram Language", + "matlab": "MATLAB", + "mawk": "Awk", + "maxhelp": "Max", + "maxpat": "Max", + "maxproj": "Max", + "mbt": "MoonBit", + "mc": "Monkey C", + "mcfunction": "mcfunction", + "mch": "B (Formal Method)", + "mcmeta": "JSON", + "mcr": "MAXScript", + "md": "Markdown", + "mdoc": "Roff", + "mdown": "Markdown", + "mdpolicy": "XML", + "mdwn": "Markdown", + "mdx": "MDX", + "me": "Roff", + "mediawiki": "Wikitext", + "mermaid": "Mermaid", + "meta": "Unity3D Asset", + "metal": "Metal", + "metta": "MeTTa", + "mg": "Modula-3", + "mint": "Mint", + "mir": "YAML", + "mirah": "Mirah", + "mjml": "XML", + "mjs": "JavaScript", + "mk": "Makefile", + "mkd": "Markdown", + "mkdn": "Markdown", + "mkdown": "Markdown", + "mkfile": "Makefile", + "mkii": "TeX", + "mkiv": "TeX", + "mkvi": "TeX", + "ml": "OCaml", + "ml4": "OCaml", + "mli": "OCaml", + "mligo": "LigoLANG", + "mlir": "MLIR", + "mll": "OCaml", + "mly": "OCaml", + "mm": "Objective-C++", + "mmd": "Mermaid", + "mo": "Modelica", + "mod": "Modula-2", + "mojo": "Mojo", + "moo": "Mercury", + "moon": "MoonScript", + "move": "Move", + "mpl": "JetBrains MPS", + "mps": "JetBrains MPS", + "mq4": "MQL4", + "mq5": "MQL5", + "mqh": "MQL4", + "mrc": "mIRC Script", + "ms": "MAXScript", + "msd": "JetBrains MPS", + "msg": "OMNeT++ MSG", + "mspec": "Ruby", + "mt": "Wolfram Language", + "mtml": "MTML", + "mts": "TypeScript", + "mu": "mupad", + "mud": "ZIL", + "mustache": "Mustache", + "mxml": "XML", + "mxt": "Max", + "mysql": "SQL", + "mzn": "MiniZinc", + "n": "Nemerle", + "nanorc": "INI", + "nas": "Nasal", + "nasm": "Assembly", + "natvis": "XML", + "nawk": "Awk", + "nb": "Wolfram Language", + "nbp": "Wolfram Language", + "nc": "nesC", + "ncl": "NCL", + "ndproj": "XML", + "ne": "Nearley", + "nearley": "Nearley", + "ned": "OMNeT++ NED", + "nf": "Nextflow", + "nginx": "Nginx", + "nginxconf": "Nginx", + "nim": "Nim", + "nim.cfg": "Nim", + "nimble": "Nim", + "nimrod": "Nim", + "nims": "Nim", + "nit": "Nit", + "nix": "Nix", + "njk": "Nunjucks", + "njs": "JavaScript", + "nl": "NewLisp", + "nlogo": "NetLogo", + "nomad": "HCL", + "nproj": "XML", + "nqp": "Raku", + "nr": "Noir", + "nse": "Lua", + "nss": "NWScript", + "nu": "Nu", + "numpy": "Python", + "numpyw": "Python", + "numsc": "Python", + "nuspec": "XML", + "nut": "Squirrel", + "ny": "Common Lisp", + "odd": "XML", + "odin": "Odin", + "ol": "Jolie", + "omgrofl": "Omgrofl", + "ooc": "ooc", + "opal": "Opal", + "opencl": "C", + "orc": "Csound", + "org": "Org", + "os": "1C Enterprise", + "osm": "XML", + "outjob": "Altium Designer", + "overpassql": "OverpassQL", + "owl": "Web Ontology Language", + "oxygene": "Oxygene", + "oz": "Oz", + "p": "OpenEdge ABL", + "p4": "P4", + "p6": "Raku", + "p6l": "Raku", + "p6m": "Raku", + "p8": "Lua", + "pac": "JavaScript", + "pact": "Pact", + "pan": "Pan", + "parrot": "Parrot", + "pas": "Pascal", + "pascal": "Pascal", + "pat": "Max", + "pb": "PureBasic", + "pbi": "PureBasic", + "pbt": "PowerBuilder", + "pcbdoc": "Altium Designer", + "pck": "PLSQL", + "pcss": "CSS", + "pd_lua": "Lua", + "pddl": "PDDL", + "pde": "Processing", + "peggy": "PEG.js", + "pegjs": "PEG.js", + "pep": "Pep8", + "per": "Genero per", + "perl": "Perl", + "pfa": "PostScript", + "pgsql": "PLpgSQL", + "ph": "Perl", + "php": "PHP", + "php3": "PHP", + "php4": "PHP", + "php5": "PHP", + "phps": "PHP", + "phpt": "PHP", + "phtml": "HTML", + "pig": "PigLatin", + "pike": "Pike", + "pkb": "PLSQL", + "pkgproj": "XML", + "pkl": "Pkl", + "pks": "PLSQL", + "pl": "Perl", + "pl6": "Raku", + "plantuml": "PlantUML", + "plb": "PLSQL", + "plist": "XML", + "plot": "Gnuplot", + "pls": "PLSQL", + "plsql": "PLSQL", + "plt": "Gnuplot", + "pluginspec": "Ruby", + "plx": "Perl", + "pm": "Perl", + "pm6": "Raku", + "pml": "Promela", + "pmod": "Pike", + "podsl": "Common Lisp", + "podspec": "Ruby", + "pogo": "PogoScript", + "polar": "Polar", + "por": "Portugol", + "postcss": "CSS", + "pov": "POV-Ray SDL", + "pp": "Puppet", + "pprx": "REXX", + "praat": "Praat", + "prawn": "Ruby", + "prc": "PLSQL", + "prefab": "Unity3D Asset", + "prefs": "INI", + "prg": "xBase", + "prisma": "Prisma", + "prjpcb": "Altium Designer", + "pro": "Prolog", + "proj": "XML", + "prolog": "Prolog", + "properties": "Java Properties", + "props": "XML", + "prw": "xBase", + "ps": "PostScript", + "ps1": "PowerShell", + "ps1xml": "XML", + "psc": "Papyrus", + "psc1": "XML", + "psd1": "PowerShell", + "psgi": "Perl", + "psm1": "PowerShell", + "pt": "XML", + "pubxml": "XML", + "pug": "Pug", + "puml": "PlantUML", + "purs": "PureScript", + "pwn": "Pawn", + "pxd": "Cython", + "pxi": "Cython", + "py": "Python", + "py3": "Python", + "pyde": "Python", + "pyi": "Python", + "pyp": "Python", + "pyt": "Python", + "pytb": "Python", + "pyw": "Python", + "pyx": "Cython", + "q": "HiveQL", + "qasm": "OpenQASM", + "qbs": "QML", + "qc": "QuakeC", + "qhelp": "XML", + "ql": "CodeQL", + "qll": "CodeQL", + "qmd": "RMarkdown", + "qml": "QML", + "qnt": "Quint", + "qs": "Q#", + "r": "R", + "r2": "Rebol", + "r3": "Rebol", + "rabl": "Ruby", + "rake": "Ruby", + "raku": "Raku", + "rakumod": "Raku", + "raml": "RAML", + "rascript": "RAScript", + "razor": "HTML", + "rb": "Ruby", + "rbi": "Ruby", + "rbs": "Ruby", + "rbuild": "Ruby", + "rbw": "Ruby", + "rbx": "Ruby", + "rbxs": "Lua", + "rchit": "GLSL", + "rd": "R", + "rdf": "XML", + "rdoc": "RDoc", + "re": "Reason", + "reb": "Rebol", + "rebol": "Rebol", + "red": "Red", + "reds": "Red", + "reek": "YAML", + "reg": "Windows Registry Entries", + "regex": "Regular Expression", + "regexp": "Regular Expression", + "rego": "Open Policy Agent", + "rei": "Reason", + "religo": "LigoLANG", + "res": "ReScript", + "resi": "ReScript", + "resource": "RobotFramework", + "rest": "reStructuredText", + "rest.txt": "reStructuredText", + "resx": "XML", + "rex": "REXX", + "rexx": "REXX", + "rg": "Rouge", + "rhtml": "HTML", + "ring": "Ring", + "riot": "Riot", + "rkt": "Racket", + "rktd": "Racket", + "rktl": "Racket", + "rl": "Ragel", + "rmd": "RMarkdown", + "rmiss": "GLSL", + "rnh": "RUNOFF", + "rno": "RUNOFF", + "rnw": "Sweave", + "robot": "RobotFramework", + "roc": "Roc", + "rockspec": "Lua", + "roff": "Roff", + "ron": "RON", + "ronn": "Markdown", + "rpgle": "RPGLE", + "rpy": "Ren'Py", + "rq": "SPARQL", + "rs": "Rust", + "rs.in": "Rust", + "rsc": "Rascal", + "rss": "XML", + "rst": "reStructuredText", + "rst.txt": "reStructuredText", + "rsx": "R", + "ru": "Ruby", + "ruby": "Ruby", + "rviz": "YAML", + "s": "Assembly", + "sail": "Sail", + "sarif": "JSON", + "sas": "SAS", + "sass": "Sass", + "sats": "ATS", + "sbatch": "Shell", + "sbt": "Scala", + "sc": "SuperCollider", + "scad": "OpenSCAD", + "scala": "Scala", + "scaml": "Scaml", + "scd": "SuperCollider", + "sce": "Scilab", + "scenic": "Scenic", + "sch": "Scheme", + "schdoc": "Altium Designer", + "sci": "Scilab", + "scm": "Scheme", + "sco": "Csound Score", + "scpt": "AppleScript", + "scrbl": "Racket", + "scss": "SCSS", + "scxml": "XML", + "sdc": "Tcl", + "sed": "sed", + "self": "Self", + "sexp": "Common Lisp", + "sfproj": "XML", + "sfv": "Checksums", + "sh": "Shell", + "sh.in": "Shell", + "shader": "ShaderLab", + "shen": "Shen", + "shproj": "XML", + "sig": "Standard ML", + "sj": "Objective-J", + "sjs": "JavaScript", + "sl": "Slash", + "slang": "Slang", + "sld": "Scheme", + "slim": "Slim", + "slint": "Slint", + "slnx": "XML", + "sls": "SaltStack", + "slurm": "Shell", + "sma": "Pawn", + "smithy": "Smithy", + "smk": "Python", + "sml": "Standard ML", + "snakefile": "Python", + "snap": "Jest Snapshot", + "snip": "Vim Snippet", + "snippet": "Vim Snippet", + "snippets": "Vim Snippet", + "sol": "Solidity", + "soy": "Closure Templates", + "sp": "SourcePawn", + "sparql": "SPARQL", + "spc": "PLSQL", + "spec": "Python", + "spin": "Propeller Spin", + "sps": "Scheme", + "sqf": "SQF", + "sql": "SQL", + "sqlrpgle": "RPGLE", + "sra": "PowerBuilder", + "srdf": "XML", + "srt": "SRecode Template", + "sru": "PowerBuilder", + "srv": "ROS Interface", + "srw": "PowerBuilder", + "ss": "Scheme", + "ssjs": "JavaScript", + "sss": "SugarSS", + "st": "Smalltalk", + "stan": "Stan", + "star": "Starlark", + "sthlp": "Stata", + "stl": "STL", + "story": "Gherkin", + "storyboard": "XML", + "sttheme": "XML", + "sty": "TeX", + "styl": "Stylus", + "sublime-build": "JSON", + "sublime-color-scheme": "JSON", + "sublime-commands": "JSON", + "sublime-completions": "JSON", + "sublime-keymap": "JSON", + "sublime-macro": "JSON", + "sublime-menu": "JSON", + "sublime-mousemap": "JSON", + "sublime-project": "JSON", + "sublime-settings": "JSON", + "sublime-snippet": "XML", + "sublime-syntax": "YAML", + "sublime-theme": "JSON", + "sublime-workspace": "JSON", + "sublime_metrics": "JSON", + "sublime_session": "JSON", + "surql": "SurrealQL", + "sv": "SystemVerilog", + "svelte": "Svelte", + "svg": "SVG", + "svh": "SystemVerilog", + "svx": "mdsvex", + "sw": "Sway", + "swift": "Swift", + "syntax": "YAML", + "t": "Perl", + "tab": "SQL", + "tac": "Python", + "tact": "Tact", + "tag": "Java", + "talon": "Talon", + "targets": "XML", + "tcc": "C++", + "tcl": "Tcl", + "tcl.in": "Tcl", + "templ": "templ", + "tesc": "GLSL", + "tese": "GLSL", + "tex": "TeX", + "textgrid": "TextGrid", + "textile": "Textile", + "tf": "HCL", + "tfstate": "JSON", + "tfstate.backup": "JSON", + "tftpl": "HCL", + "tfvars": "HCL", + "thor": "Ruby", + "thrift": "Thrift", + "thy": "Isabelle", + "tl": "Teal", + "tla": "TLA", + "tlv": "TL-Verilog", + "tm": "Tcl", + "tmac": "Roff", + "tmcommand": "XML", + "tmdl": "TMDL", + "tml": "XML", + "tmlanguage": "XML", + "tmpl": "Go Template", + "tmpreferences": "XML", + "tmsnippet": "XML", + "tmtheme": "XML", + "tmux": "Shell", + "toc": "TeX", + "tofu": "HCL", + "toit": "Toit", + "toml": "TOML", + "toml.example": "TOML", + "tool": "Shell", + "topojson": "JSON", + "tpb": "PLSQL", + "tpl": "Smarty", + "tpp": "C++", + "tps": "PLSQL", + "tres": "Godot Resource", + "trg": "PLSQL", + "trigger": "Apex", + "ts": "TypeScript", + "tscn": "Godot Resource", + "tsconfig.json": "JSON", + "tsp": "TypeSpec", + "tst": "GAP", + "tsv": "TSV", + "tsx": "TypeScript", + "tu": "Turing", + "twig": "Twig", + "txl": "TXL", + "txt": "Adblock Filter List", + "txx": "C++", + "typ": "Typst", + "uc": "UnrealScript", + "udf": "SQL", + "udo": "Csound", + "ui": "XML", + "unity": "Unity3D Asset", + "uno": "Uno", + "upc": "C", + "uplc": "Untyped Plutus Core", + "ur": "UrWeb", + "urdf": "XML", + "url": "INI", + "urs": "UrWeb", + "ux": "XML", + "v": "Verilog", + "vala": "Vala", + "vapi": "Vala", + "vark": "Gosu", + "vb": "Visual Basic .NET", + "vba": "VBA", + "vbhtml": "Visual Basic .NET", + "vbproj": "XML", + "vbs": "VBScript", + "vcf": "vCard", + "vcl": "VCL", + "vcxproj": "XML", + "vdf": "Valve Data Format", + "veo": "Verilog", + "vert": "GLSL", + "vh": "SystemVerilog", + "vhd": "VHDL", + "vhdl": "VHDL", + "vhf": "VHDL", + "vhi": "VHDL", + "vho": "VHDL", + "vhost": "ApacheConf", + "vhs": "VHDL", + "vht": "VHDL", + "vhw": "VHDL", + "vim": "Vim Script", + "vimrc": "Vim Script", + "viw": "SQL", + "vmb": "Vim Script", + "volt": "Volt", + "vrx": "GLSL", + "vs": "GLSL", + "vsh": "GLSL", + "vshader": "GLSL", + "vsixmanifest": "XML", + "vssettings": "XML", + "vstemplate": "XML", + "vtl": "Velocity Template Language", + "vto": "Vento", + "vue": "Vue", + "vw": "PLSQL", + "vxml": "XML", + "vy": "Vyper", + "w": "CWeb", + "wast": "WebAssembly", + "wat": "WebAssembly", + "watchr": "Ruby", + "wdl": "WDL", + "webapp": "JSON", + "webmanifest": "JSON", + "wgsl": "WGSL", + "whiley": "Whiley", + "wiki": "Wikitext", + "wikitext": "Wikitext", + "wisp": "wisp", + "wit": "WebAssembly Interface Type", + "wixproj": "XML", + "wl": "Wolfram Language", + "wlk": "Wollok", + "wls": "Wolfram Language", + "wlt": "Wolfram Language", + "wlua": "Lua", + "workbook": "Markdown", + "workflow": "HCL", + "wren": "Wren", + "ws": "Witcher Script", + "wsdl": "XML", + "wsf": "XML", + "wsgi": "Python", + "wxi": "XML", + "wxl": "XML", + "wxs": "XML", + "x": "DirectX 3D File", + "x10": "X10", + "x3d": "XML", + "x68": "Assembly", + "xacro": "XML", + "xaml": "XML", + "xc": "XC", + "xdc": "Tcl", + "xht": "HTML", + "xhtml": "HTML", + "xib": "XML", + "xlf": "XML", + "xliff": "XML", + "xmi": "XML", + "xml": "XML", + "xml.dist": "XML", + "xmp": "XML", + "xojo_code": "Xojo", + "xojo_menu": "Xojo", + "xojo_report": "Xojo", + "xojo_script": "Xojo", + "xojo_toolbar": "Xojo", + "xojo_window": "Xojo", + "xproj": "XML", + "xpy": "Python", + "xq": "XQuery", + "xql": "XQuery", + "xqm": "XQuery", + "xquery": "XQuery", + "xqy": "XQuery", + "xrl": "Erlang", + "xsd": "XML", + "xsh": "Xonsh", + "xsjs": "JavaScript", + "xsjslib": "JavaScript", + "xsl": "XSLT", + "xslt": "XSLT", + "xspec": "XML", + "xtend": "Xtend", + "xul": "XML", + "xzap": "ZAP", + "y": "Yacc", + "yacc": "Yacc", + "yaml": "MiniYAML", + "yaml-tmlanguage": "YAML", + "yaml.sed": "YAML", + "yap": "Prolog", + "yar": "YARA", + "yara": "YARA", + "yasnippet": "YASnippet", + "yml": "YAML", + "yml.mysql": "YAML", + "yrl": "Erlang", + "yul": "Yul", + "yy": "Yacc", + "yyp": "JSON", + "zap": "ZAP", + "zcml": "XML", + "zed": "SpiceDB Schema", + "zep": "Zephir", + "zig": "Zig", + "zig.zon": "Zig", + "zil": "ZIL", + "zimpl": "Zimpl", + "zmodel": "Zmodel", + "zmpl": "Zimpl", + "zpl": "Zimpl", + "zs": "ZenScript", + "zsh": "Shell", + "zsh-theme": "Shell" + }, + "filename": { + ".abbrev_defs": "Emacs Lisp", + ".ackrc": "Option List", + ".all-contributorsrc": "JSON", + ".arcconfig": "JSON", + ".atomignore": "Ignore List", + ".auto-changelog": "JSON", + ".babelignore": "Ignore List", + ".babelrc": "JSON", + ".bash_aliases": "Shell", + ".bash_functions": "Shell", + ".bash_history": "Shell", + ".bash_logout": "Shell", + ".bash_profile": "Shell", + ".bashrc": "Shell", + ".browserslistrc": "Browserslist", + ".buckconfig": "INI", + ".bzrignore": "Ignore List", + ".c8rc": "JSON", + ".clang-format": "YAML", + ".clang-tidy": "YAML", + ".clangd": "YAML", + ".classpath": "XML", + ".coffeelintignore": "Ignore List", + ".coveragerc": "INI", + ".cproject": "XML", + ".cshrc": "Shell", + ".cvsignore": "Ignore List", + ".devcontainer.json": "JSON", + ".dockerignore": "Ignore List", + ".easignore": "Ignore List", + ".editorconfig": "INI", + ".eleventyignore": "Ignore List", + ".emacs": "Emacs Lisp", + ".emacs.desktop": "Emacs Lisp", + ".env": "Dotenv", + ".env.ci": "Dotenv", + ".env.dev": "Dotenv", + ".env.development": "Dotenv", + ".env.development.local": "Dotenv", + ".env.example": "Dotenv", + ".env.local": "Dotenv", + ".env.prod": "Dotenv", + ".env.production": "Dotenv", + ".env.sample": "Dotenv", + ".env.staging": "Dotenv", + ".env.template": "Dotenv", + ".env.test": "Dotenv", + ".env.testing": "Dotenv", + ".envrc": "Shell", + ".eslintignore": "Ignore List", + ".eslintrc.json": "JSON", + ".exrc": "Vim Script", + ".factor-boot-rc": "Factor", + ".factor-rc": "Factor", + ".flake8": "INI", + ".flaskenv": "Shell", + ".gclient": "Python", + ".gemrc": "YAML", + ".git-blame-ignore-revs": "Git Revision List", + ".gitattributes": "Git Attributes", + ".gitconfig": "INI", + ".gitignore": "Ignore List", + ".gitmodules": "INI", + ".gnus": "Emacs Lisp", + ".gvimrc": "Vim Script", + ".htaccess": "ApacheConf", + ".htmlhintrc": "JSON", + ".ignore": "Ignore List", + ".imgbotconfig": "JSON", + ".irbrc": "Ruby", + ".jscsrc": "JSON", + ".jshintrc": "JSON", + ".jslintrc": "JSON", + ".justfile": "Just", + ".kshrc": "Shell", + ".latexmkrc": "Perl", + ".login": "Shell", + ".luacheckrc": "Lua", + ".markdownlintignore": "Ignore List", + ".nanorc": "INI", + ".nodemonignore": "Ignore List", + ".npmignore": "Ignore List", + ".npmrc": "INI", + ".nvimrc": "Vim Script", + ".nycrc": "JSON", + ".oxlintrc.json": "JSON", + ".php": "PHP", + ".php_cs": "PHP", + ".php_cs.dist": "PHP", + ".prettierignore": "Ignore List", + ".profile": "Shell", + ".project": "XML", + ".pryrc": "Ruby", + ".pylintrc": "INI", + ".rprofile": "R", + ".rspec": "Option List", + ".scalafix.conf": "HOCON", + ".scalafmt.conf": "HOCON", + ".shellcheckrc": "ShellCheck Config", + ".simplecov": "Ruby", + ".spacemacs": "Emacs Lisp", + ".stylelintignore": "Ignore List", + ".swcrc": "JSON", + ".tern-config": "JSON", + ".tern-project": "JSON", + ".tm_properties": "TextMate Properties", + ".tmux.conf": "Shell", + ".vercelignore": "Ignore List", + ".vimrc": "Vim Script", + ".viper": "Emacs Lisp", + ".vscodeignore": "Ignore List", + ".watchmanconfig": "JSON", + ".xinitrc": "Shell", + ".xsession": "Shell", + ".yardopts": "Option List", + ".zlogin": "Shell", + ".zlogout": "Shell", + ".zprofile": "Shell", + ".zshenv": "Shell", + ".zshrc": "Shell", + "9fs": "Shell", + "_emacs": "Emacs Lisp", + "_helpers.tpl": "Go Template", + "_vimrc": "Vim Script", + "abbrev_defs": "Emacs Lisp", + "ack": "Perl", + "ackrc": "Option List", + "ant.xml": "Ant Build System", + "apache2.conf": "ApacheConf", + "api-extractor.json": "JSON", + "apkbuild": "Shell", + "app.config": "XML", + "appraisals": "Ruby", + "bash_aliases": "Shell", + "bash_logout": "Shell", + "bash_profile": "Shell", + "bashrc": "Shell", + "berksfile": "Ruby", + "brewfile": "Ruby", + "browserslist": "Browserslist", + "bsdmakefile": "Makefile", + "buck": "Starlark", + "build": "Starlark", + "build.bazel": "Starlark", + "build.xml": "Ant Build System", + "buildfile": "Ruby", + "buildozer.spec": "INI", + "bun.lock": "JSON", + "cabal.config": "Cabal Config", + "cabal.project": "Cabal Config", + "caddyfile": "Caddyfile", + "cakefile": "CoffeeScript", + "capfile": "Ruby", + "cargo.lock": "TOML", + "cargo.toml.orig": "TOML", + "cask": "Emacs Lisp", + "citation.cff": "YAML", + "cmakelists.txt": "CMake", + "commit_editmsg": "Git Commit", + "composer.lock": "JSON", + "containerfile": "Dockerfile", + "contents.lr": "Markdown", + "cpanfile": "Perl", + "crontab": "crontab", + "cshrc": "Shell", + "dangerfile": "Ruby", + "deliverfile": "Ruby", + "deno.lock": "JSON", + "deps": "Python", + "dev-requirements.txt": "Pip Requirements", + "devcontainer.json": "JSON", + "dockerfile": "Dockerfile", + "dune-project": "Dune", + "earthfile": "Earthly", + "eask": "Emacs Lisp", + "emakefile": "Erlang", + "eqnrc": "Roff", + "expr-dist": "R", + "fakefile": "Fancy", + "fastfile": "Ruby", + "firestore.rules": "Cloud Firestore Security Rules", + "flake.lock": "JSON", + "fp-lib-table": "KiCad Layout", + "gemfile": "Ruby", + "gemfile.lock": "Gemfile.lock", + "gitignore-global": "Ignore List", + "gitignore_global": "Ignore List", + "glide.lock": "YAML", + "gnumakefile": "Makefile", + "go.mod": "Go Module", + "go.sum": "Go Checksums", + "go.work": "Go Workspace", + "go.work.sum": "Go Checksums", + "gopkg.lock": "TOML", + "gradlew": "Shell", + "gradlew.bat": "Batchfile", + "guardfile": "Ruby", + "gvimrc": "Vim Script", + "haproxy.cfg": "HAProxy", + "hosts": "Hosts File", + "hosts.txt": "Hosts File", + "httpd.conf": "ApacheConf", + "installscript.qs": "Qt Script", + "jakefile": "JavaScript", + "jarfile": "Ruby", + "jenkinsfile": "Groovy", + "jsconfig.json": "JSON", + "justfile": "Just", + "kakrc": "KakouneScript", + "kbuild": "Makefile", + "kcl.mod": "KCL", + "kcl.mod.lock": "KCL", + "kshrc": "Shell", + "language-configuration.json": "JSON", + "language-subtag-registry.txt": "Record Jar", + "latexmkrc": "Perl", + "lexer.x": "Lex", + "login": "Shell", + "m3makefile": "Quake", + "m3overrides": "Quake", + "makefile": "Makefile", + "makefile.am": "Makefile", + "makefile.boot": "Makefile", + "makefile.frag": "Makefile", + "makefile.in": "Makefile", + "makefile.inc": "Makefile", + "makefile.pl": "Perl", + "makefile.sco": "Makefile", + "makefile.wat": "Makefile", + "man": "Shell", + "manifest.mf": "JAR Manifest", + "mavenfile": "Ruby", + "mcmod.info": "JSON", + "meson.build": "Meson", + "meson_options.txt": "Meson", + "mise.local.lock": "TOML", + "mise.lock": "TOML", + "mix.lock": "Elixir", + "mkfile": "Makefile", + "mmn": "Roff", + "mmt": "Roff", + "mocha.opts": "Option List", + "module.bazel": "Starlark", + "module.bazel.lock": "JSON", + "modulefile": "Puppet", + "mvnw": "Shell", + "mvnw.cmd": "Batchfile", + "nanorc": "INI", + "nextflow.config": "Nextflow", + "nginx.conf": "Nginx", + "nim.cfg": "Nim", + "notebook": "Jupyter Notebook", + "nuget.config": "XML", + "nukefile": "Nu", + "nvimrc": "Vim Script", + "owh": "Tcl", + "package.resolved": "JSON", + "packages.config": "XML", + "pdm.lock": "TOML", + "phakefile": "PHP", + "pipfile": "TOML", + "pipfile.lock": "JSON", + "pixi.lock": "YAML", + "pkgbuild": "Shell", + "podfile": "Ruby", + "poetry.lock": "TOML", + "procfile": "Procfile", + "profile": "Shell", + "project.ede": "Emacs Lisp", + "project.godot": "Godot Resource", + "puppetfile": "Ruby", + "pylintrc": "INI", + "rakefile": "Ruby", + "rebar.config": "Erlang", + "rebar.config.lock": "Erlang", + "rebar.lock": "Erlang", + "requirements-dev.txt": "Pip Requirements", + "requirements.lock.txt": "Pip Requirements", + "requirements.txt": "Pip Requirements", + "rexfile": "Perl", + "riemann.config": "Clojure", + "root": "Isabelle", + "sconscript": "Python", + "sconstruct": "Python", + "settings.stylecop": "XML", + "singularity": "Singularity", + "slakefile": "LiveScript", + "snakefile": "Python", + "snapfile": "Ruby", + "starfield": "Tcl", + "steepfile": "Ruby", + "suite.rc": "INI", + "thorfile": "Ruby", + "tiltfile": "Starlark", + "tmux.conf": "Shell", + "toolchain_installscript.qs": "Qt Script", + "torrc": "Tor Config", + "troffrc": "Roff", + "troffrc-end": "Roff", + "tsconfig.json": "JSON", + "tslint.json": "JSON", + "uv.lock": "TOML", + "vagrantfile": "Ruby", + "vimrc": "Vim Script", + "vlcrc": "INI", + "web.config": "XML", + "web.debug.config": "XML", + "web.release.config": "XML", + "workspace": "Starlark", + "workspace.bazel": "Starlark", + "workspace.bzlmod": "Starlark", + "wscript": "Python", + "xinitrc": "Shell", + "xmake.lua": "Xmake", + "xsession": "Shell", + "yarn.lock": "YAML", + "zlogin": "Shell", + "zlogout": "Shell", + "zprofile": "Shell", + "zshenv": "Shell", + "zshrc": "Shell" + } + }, + "vendor": [ + "(^|/)cache/", + "^[Dd]ependencies/", + "(^|/)dist/", + "^deps/", + "(^|/)configure$", + "(^|/)config\\.guess$", + "(^|/)config\\.sub$", + "(^|/)aclocal\\.m4", + "(^|/)libtool\\.m4", + "(^|/)ltoptions\\.m4", + "(^|/)ltsugar\\.m4", + "(^|/)ltversion\\.m4", + "(^|/)lt~obsolete\\.m4", + "(^|/)dotnet-install\\.(ps1|sh)$", + "(^|/)cpplint\\.py", + "(^|/)node_modules/", + "(^|/)\\.yarn/releases/", + "(^|/)\\.yarn/plugins/", + "(^|/)\\.yarn/sdks/", + "(^|/)\\.yarn/versions/", + "(^|/)\\.yarn/unplugged/", + "(^|/)_esy$", + "(^|/)bower_components/", + "^rebar$", + "(^|/)erlang\\.mk", + "(^|/)Godeps/_workspace/", + "(^|/)testdata/", + "(^|/)\\.indent\\.pro", + "(\\.|-)min\\.(js|css)$", + "([^\\s]*)import\\.(css|less|scss|styl)$", + "(^|/)bootstrap([^/.]*)(\\..*)?\\.(js|css|less|scss|styl)$", + "(^|/)custom\\.bootstrap([^\\s]*)(js|css|less|scss|styl)$", + "(^|/)font-?awesome\\.(css|less|scss|styl)$", + "(^|/)font-?awesome/.*\\.(css|less|scss|styl)$", + "(^|/)foundation\\.(css|less|scss|styl)$", + "(^|/)normalize\\.(css|less|scss|styl)$", + "(^|/)skeleton\\.(css|less|scss|styl)$", + "(^|/)[Bb]ourbon/.*\\.(css|less|scss|styl)$", + "(^|/)animate\\.(css|less|scss|styl)$", + "(^|/)materialize\\.(css|less|scss|styl|js)$", + "(^|/)select2/.*\\.(css|scss|js)$", + "(^|/)bulma\\.(css|sass|scss)$", + "(3rd|[Tt]hird)[-_]?[Pp]arty/", + "(^|/)vendors?/", + "(^|/)[Ee]xtern(als?)?/", + "(^|/)[Vv]+endor/", + "^debian/", + "(^|/)run\\.n$", + "(^|/)bootstrap-datepicker/", + "(^|/)jquery([^.]*)\\.js$", + "(^|/)jquery\\-\\d\\.\\d+(\\.\\d+)?\\.js$", + "(^|/)jquery\\-ui(\\-\\d\\.\\d+(\\.\\d+)?)?(\\.\\w+)?\\.(js|css)$", + "(^|/)jquery\\.(ui|effects)\\.([^.]*)\\.(js|css)$", + "(^|/)jquery\\.fn\\.gantt\\.js", + "(^|/)jquery\\.fancybox\\.(js|css)", + "(^|/)fuelux\\.js", + "(^|/)jquery\\.fileupload(-\\w+)?\\.js$", + "(^|/)jquery\\.dataTables\\.js", + "(^|/)bootbox\\.js", + "(^|/)pdf\\.worker\\.js", + "(^|/)slick\\.\\w+.js$", + "(^|/)Leaflet\\.Coordinates-\\d+\\.\\d+\\.\\d+\\.src\\.js$", + "(^|/)leaflet\\.draw-src\\.js", + "(^|/)leaflet\\.draw\\.css", + "(^|/)Control\\.FullScreen\\.css", + "(^|/)Control\\.FullScreen\\.js", + "(^|/)leaflet\\.spin\\.js", + "(^|/)wicket-leaflet\\.js", + "(^|/)\\.sublime-project", + "(^|/)\\.sublime-workspace", + "(^|/)\\.vscode/", + "(^|/)prototype(.*)\\.js$", + "(^|/)effects\\.js$", + "(^|/)controls\\.js$", + "(^|/)dragdrop\\.js$", + "(.*?)\\.d\\.ts$", + "(^|/)mootools([^.]*)\\d+\\.\\d+.\\d+([^.]*)\\.js$", + "(^|/)dojo\\.js$", + "(^|/)MochiKit\\.js$", + "(^|/)yahoo-([^.]*)\\.js$", + "(^|/)yui([^.]*)\\.js$", + "(^|/)ckeditor\\.js$", + "(^|/)tiny_mce([^.]*)\\.js$", + "(^|/)tiny_mce/(langs|plugins|themes|utils)", + "(^|/)ace-builds/", + "(^|/)fontello(.*?)\\.css$", + "(^|/)MathJax/", + "(^|/)Chart\\.js$", + "(^|/)[Cc]ode[Mm]irror/(\\d+\\.\\d+/)?(lib|mode|theme|addon|keymap|demo)", + "(^|/)shBrush([^.]*)\\.js$", + "(^|/)shCore\\.js$", + "(^|/)shLegacy\\.js$", + "(^|/)angular([^.]*)\\.js$", + "(^|\\/)d3(\\.v\\d+)?([^.]*)\\.js$", + "(^|/)react(-[^.]*)?\\.js$", + "(^|/)flow-typed/.*\\.js$", + "(^|/)modernizr\\-\\d\\.\\d+(\\.\\d+)?\\.js$", + "(^|/)modernizr\\.custom\\.\\d+\\.js$", + "(^|/)knockout-(\\d+\\.){3}(debug\\.)?js$", + "(^|/)docs?/_?(build|themes?|templates?|static)/", + "(^|/)admin_media/", + "(^|/)env/", + "(^|/)fabfile\\.py$", + "(^|/)waf$", + "(^|/)\\.osx$", + "\\.xctemplate/", + "\\.imageset/", + "(^|/)Carthage/", + "(^|/)Sparkle/", + "(^|/)Crashlytics\\.framework/", + "(^|/)Fabric\\.framework/", + "(^|/)BuddyBuildSDK\\.framework/", + "(^|/)Realm\\.framework", + "(^|/)RealmSwift\\.framework", + "(^|/)\\.gitattributes$", + "(^|/)\\.gitignore$", + "(^|/)\\.gitmodules$", + "(^|/)gradlew$", + "(^|/)gradlew\\.bat$", + "(^|/)gradle/wrapper/", + "(^|/)mvnw$", + "(^|/)mvnw\\.cmd$", + "(^|/)\\.mvn/wrapper/", + "-vsdoc\\.js$", + "\\.intellisense\\.js$", + "(^|/)jquery([^.]*)\\.validate(\\.unobtrusive)?\\.js$", + "(^|/)jquery([^.]*)\\.unobtrusive\\-ajax\\.js$", + "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\.debug)?\\.js$", + "(^|/)[Pp]ackages\\/.+\\.\\d+\\/", + "(^|/)extjs/.*?\\.js$", + "(^|/)extjs/.*?\\.xml$", + "(^|/)extjs/.*?\\.txt$", + "(^|/)extjs/.*?\\.html$", + "(^|/)extjs/.*?\\.properties$", + "(^|/)extjs/\\.sencha/", + "(^|/)extjs/docs/", + "(^|/)extjs/builds/", + "(^|/)extjs/cmd/", + "(^|/)extjs/examples/", + "(^|/)extjs/locale/", + "(^|/)extjs/packages/", + "(^|/)extjs/plugins/", + "(^|/)extjs/resources/", + "(^|/)extjs/src/", + "(^|/)extjs/welcome/", + "(^|/)html5shiv\\.js$", + "(^|/)[Tt]ests?/fixtures/", + "(^|/)[Ss]pecs?/fixtures/", + "(^|/)cordova([^.]*)\\.js$", + "(^|/)cordova\\-\\d\\.\\d(\\.\\d)?\\.js$", + "(^|/)foundation(\\..*)?\\.js$", + "(^|/)Vagrantfile$", + "(^|/)\\.[Dd][Ss]_[Ss]tore$", + "(^|/)inst/extdata/", + "(^|/)octicons\\.css", + "(^|/)sprockets-octicons\\.scss", + "(^|/)activator$", + "(^|/)activator\\.bat$", + "(^|/)proguard\\.pro$", + "(^|/)proguard-rules\\.pro$", + "(^|/)puphpet/", + "(^|/)\\.google_apis/", + "(^|/)Jenkinsfile$", + "(^|/)\\.gitpod\\.Dockerfile$", + "(^|/)\\.github/", + "(^|/)\\.obsidian/", + "(^|/)\\.teamcity/", + "(^|/)xvba_modules/" + ] +} \ No newline at end of file diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index 98aa55d..67036b8 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -197,6 +197,28 @@ .lane-popover .lp-stats .add { color: var(--color-added); } .lane-popover .lp-stats .del { color: var(--color-deleted); } .lane-popover .lp-period { color: var(--text-muted); font-size: 0.72rem; margin-top: 4px; } + /* Language bar — shared by the author popover and the Technologies section. */ + .langbar { display: flex; height: 8px; border-radius: 4px; overflow: hidden; background: var(--bg-badge); margin-top: 10px; } + .langbar > span { display: block; height: 100%; min-width: 2px; } + .lang-legend { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 8px; font-size: 0.74rem; color: var(--text-secondary); } + .lang-legend .lang-item { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; } + .lang-legend .lang-dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; } + .lang-legend .lang-pct { color: var(--text-muted); font-variant-numeric: tabular-nums; } + .lane-popover .langbar { margin-top: 12px; } + .lane-popover .lang-legend { font-size: 0.72rem; gap: 3px 10px; } + /* Technologies section. */ + #tech .tech-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; } + #tech .tech-bar-label { font-size: 0.78rem; color: var(--text-muted); margin: 0 0 4px; } + #tech .frameworks { display: flex; flex-direction: column; gap: 12px; } + #tech .fw-group { display: grid; grid-template-columns: 130px 1fr; gap: 10px; align-items: baseline; } + #tech .fw-lang { display: inline-flex; align-items: center; gap: 7px; font-size: 0.82rem; color: var(--text-secondary); font-weight: 600; } + #tech .fw-lang .lang-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; } + #tech .fw-items { display: flex; flex-wrap: wrap; gap: 6px; } + #tech .fw-chip { background: var(--bg-badge); border: 1px solid var(--border-default); border-radius: 999px; padding: 2px 10px; font-size: 0.76rem; color: var(--text-secondary); white-space: nowrap; } + #tech .tech-empty { color: var(--text-muted); font-size: 0.8rem; font-style: italic; } + .timeline-tooltip .tt-ftypes { display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 5px; } + .timeline-tooltip .tt-ftype { display: inline-flex; align-items: center; gap: 5px; font-size: 0.7rem; color: var(--text-secondary); } + .timeline-tooltip .tt-ftype .tt-fdot { width: 8px; height: 8px; border-radius: 2px; flex-shrink: 0; } * { scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb) var(--bg-primary); } ::-webkit-scrollbar { height: 8px; width: 8px; } ::-webkit-scrollbar-track { background: var(--bg-primary); border-radius: 4px; } @@ -205,6 +227,7 @@ @media (max-width: 900px) { .grid-2 { grid-template-columns: 1fr; } .grid-5 { grid-template-columns: repeat(2, 1fr); } + #tech .tech-grid { grid-template-columns: 1fr; } .layout { flex-direction: column; } .sidebar { position: static; width: 100%; } .sidebar nav { flex-direction: row; flex-wrap: wrap; } @@ -222,6 +245,7 @@

Contributions Commit timeline Summary + Technologies Overall Commit frequency Hour of day @@ -250,6 +274,10 @@

+

Overall

@@ -445,6 +473,53 @@

// === COMMIT TIMELINE === function escapeHtml(s) { return String(s).replace(/[&<>"']/g, m => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m])); } +// Stacked language bar from a [{name, pct, color}] list (Python-precomputed). +function langBarHtml(langs, { legend = true } = {}) { + if (!langs || !langs.length) return ''; + const segs = langs.map(l => + `` + ).join(''); + let html = `
${segs}
`; + if (legend) { + const items = langs.map(l => + `${escapeHtml(l.name)} ${l.pct}%` + ).join(''); + html += `
${items}
`; + } + return html; +} + +// Repo-wide Technologies section: language bar + frameworks grouped by language. +// Always shown; each column explains itself when there's nothing to display +// (e.g. the GraphQL remote path has no per-file language data). +function renderTech() { + const section = document.getElementById('tech'); + if (!section) return; + section.hidden = false; + const repoLangs = D.repoLanguages || []; + const frameworks = D.frameworks || []; + + const langEl = document.getElementById('techLanguages'); + langEl.innerHTML = repoLangs.length + ? `
Languages by lines changed
` + + langBarHtml(repoLangs, { legend: true }) + : `
Languages
` + + `
Available on local or bare-clone runs — the remote GitHub API can't read per-file data. Run repo-intel inside a clone for the language breakdown.
`; + + const fwEl = document.getElementById('techFrameworks'); + fwEl.innerHTML = `
Frameworks & libraries
` + ( + frameworks.length + ? `
` + frameworks.map(g => + `
` + + `${escapeHtml(g.language)}` + + `${g.names.map(n => `${escapeHtml(n)}`).join('')}` + + `
` + ).join('') + `
` + : `
No known frameworks detected in the repo's dependency manifests.
` + ); +} +renderTech(); + // GitHub branch paths preserve slashes (`feature/foo`), so encode segment-wise. function encodeBranch(b) { return (b || 'main').split('/').map(encodeURIComponent).join('/'); } @@ -514,7 +589,8 @@

`
` + `
${fmt(c.commits)} commits · ${c.activeDays} active day${c.activeDays === 1 ? '' : 's'}
` + `
+${fmt(c.added)} -${fmt(c.deleted)} (net ${netHtml})
` + - `
${c.first} — ${c.last}
`; + `
${c.first} — ${c.last}
` + + langBarHtml(c.languages, { legend: true }); installAvatarFallback(authorPopover.querySelector('.lp-avatar')); authorPopover.style.transform = ''; @@ -1276,9 +1352,22 @@

`
${escapeHtml(c.s || '')}
` + `
${dateStr} ${timeStr} · +${fmt(c.a || 0)} -${fmt(c.l || 0)} · ${c.h}
`; } + const ftAgg = {}; + for (const cc of bundle) for (const [name, fcolor, files] of (cc.f || [])) { + if (!ftAgg[name]) ftAgg[name] = [fcolor, 0]; + ftAgg[name][1] += files; + } + const ftSorted = Object.entries(ftAgg).sort((a, b) => b[1][1] - a[1][1]); + const ftShown = ftSorted.slice(0, 5); + const ftMore = ftSorted.length - ftShown.length; + const ftypesHtml = ftShown.length + ? `
` + ftShown.map(([name, [fcolor, files]]) => + `${escapeHtml(name)} ×${fmt(files)}` + ).join('') + (ftMore > 0 ? `+${ftMore}` : '') + `
` + : ''; tooltip.innerHTML = `
${avatarHtml}${escapeHtml(author.name)}${headerExtra}
` + - body; + body + ftypesHtml; installAvatarFallback(tooltip.querySelector('.tt-avatar')); tooltipHash = c.h; } diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index ee0c1b3..f7b2557 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n \n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( @@ -276,10 +276,280 @@ def iso_week_label(dt): return f"{y}-W{w:02d}" +# Language + framework detection data, generated from GitHub Linguist and a +# curated framework map by gen_techdata.py (see `make repo-intel-techdata`). +# build.py inlines the JSON here; when unbuilt we read the sibling file. Used +# only on the local + bare-clone paths — the GraphQL remote path lacks per-file +# data, so these maps go unused there. +TECHDATA = '{\n "_source": {\n "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml",\n "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml"\n },\n "fw_deps": {\n "Go": {\n "github.com/gin-gonic/gin": "Gin",\n "github.com/go-chi/chi": "chi",\n "github.com/gofiber/fiber": "Fiber",\n "github.com/gorilla/mux": "Gorilla",\n "github.com/labstack/echo": "Echo",\n "github.com/spf13/cobra": "Cobra",\n "google.golang.org/grpc": "gRPC",\n "gorm.io/gorm": "GORM"\n },\n "PHP": {\n "cakephp/cakephp": "CakePHP",\n "laravel/framework": "Laravel",\n "slim/slim": "Slim",\n "symfony/framework-bundle": "Symfony",\n "symfony/symfony": "Symfony",\n "yiisoft/yii2": "Yii"\n },\n "Python": {\n "aiohttp": "aiohttp",\n "celery": "Celery",\n "click": "Click",\n "django": "Django",\n "djangorestframework": "Django REST",\n "fastapi": "FastAPI",\n "flask": "Flask",\n "httpx": "HTTPX",\n "keras": "Keras",\n "matplotlib": "Matplotlib",\n "numpy": "NumPy",\n "pandas": "pandas",\n "pydantic": "Pydantic",\n "pyramid": "Pyramid",\n "pytest": "pytest",\n "requests": "Requests",\n "sanic": "Sanic",\n "scikit-learn": "scikit-learn",\n "scipy": "SciPy",\n "scrapy": "Scrapy",\n "sqlalchemy": "SQLAlchemy",\n "starlette": "Starlette",\n "tensorflow": "TensorFlow",\n "torch": "PyTorch",\n "tornado": "Tornado",\n "transformers": "Transformers",\n "typer": "Typer"\n },\n "Ruby": {\n "devise": "Devise",\n "hanami": "Hanami",\n "puma": "Puma",\n "rails": "Rails",\n "rspec": "RSpec",\n "sidekiq": "Sidekiq",\n "sinatra": "Sinatra"\n },\n "Rust": {\n "actix-web": "Actix Web",\n "axum": "Axum",\n "bevy": "Bevy",\n "clap": "clap",\n "diesel": "Diesel",\n "rocket": "Rocket",\n "serde": "Serde",\n "tauri": "Tauri",\n "tokio": "Tokio",\n "tonic": "Tonic",\n "warp": "warp"\n },\n "npm": {\n "@angular/core": "Angular",\n "@apollo/client": "Apollo",\n "@chakra-ui/react": "Chakra UI",\n "@hapi/hapi": "hapi",\n "@ionic/core": "Ionic",\n "@mui/material": "MUI",\n "@nestjs/core": "NestJS",\n "@playwright/test": "Playwright",\n "@prisma/client": "Prisma",\n "@reduxjs/toolkit": "Redux",\n "@remix-run/react": "Remix",\n "@sveltejs/kit": "SvelteKit",\n "astro": "Astro",\n "bootstrap": "Bootstrap",\n "chart.js": "Chart.js",\n "cypress": "Cypress",\n "d3": "D3",\n "electron": "Electron",\n "esbuild": "esbuild",\n "eslint": "ESLint",\n "expo": "Expo",\n "express": "Express",\n "fastify": "Fastify",\n "gatsby": "Gatsby",\n "jest": "Jest",\n "koa": "Koa",\n "mocha": "Mocha",\n "mongoose": "Mongoose",\n "next": "Next.js",\n "nuxt": "Nuxt",\n "parcel": "Parcel",\n "playwright": "Playwright",\n "preact": "Preact",\n "prettier": "Prettier",\n "prisma": "Prisma",\n "react": "React",\n "react-dom": "React",\n "react-native": "React Native",\n "redux": "Redux",\n "rollup": "Rollup",\n "sequelize": "Sequelize",\n "solid-js": "SolidJS",\n "styled-components": "styled-components",\n "svelte": "Svelte",\n "tailwindcss": "Tailwind CSS",\n "three": "three.js",\n "typeorm": "TypeORM",\n "vite": "Vite",\n "vitest": "Vitest",\n "vue": "Vue",\n "webpack": "webpack",\n "zustand": "Zustand"\n }\n },\n "fw_sentinels_js": [\n [\n "next.config.js",\n "Next.js"\n ],\n [\n "next.config.ts",\n "Next.js"\n ],\n [\n "next.config.mjs",\n "Next.js"\n ],\n [\n "nuxt.config.js",\n "Nuxt"\n ],\n [\n "nuxt.config.ts",\n "Nuxt"\n ],\n [\n "svelte.config.js",\n "Svelte"\n ],\n [\n "astro.config.mjs",\n "Astro"\n ],\n [\n "vue.config.js",\n "Vue"\n ],\n [\n "gatsby-config.js",\n "Gatsby"\n ],\n [\n "angular.json",\n "Angular"\n ]\n ],\n "fw_sentinels_other": [\n [\n "manage.py",\n "Django",\n "Python"\n ],\n [\n "artisan",\n "Laravel",\n "PHP"\n ],\n [\n "config/application.rb",\n "Rails",\n "Ruby"\n ]\n ],\n "lang": {\n "color": {\n "1C Enterprise": "#814CCC",\n "2-Dimensional Array": "#38761D",\n "4D": "#004289",\n "ABAP": "#E8274B",\n "ABAP CDS": "#555e25",\n "AGS Script": "#B9D9FF",\n "AIDL": "#34EB6B",\n "AL": "#3AA2B5",\n "ALGOL": "#D1E0DB",\n "AMPL": "#E6EFBB",\n "ANTLR": "#9DC3FF",\n "API Blueprint": "#2ACCA8",\n "APL": "#5A8164",\n "ASP.NET": "#9400ff",\n "ATS": "#1ac620",\n "ActionScript": "#882B0F",\n "Ada": "#02f88c",\n "Adblock Filter List": "#800000",\n "Adobe Font Metrics": "#fa0f00",\n "Agda": "#315665",\n "Aiken": "#640ff8",\n "Alloy": "#64C800",\n "Alpine Abuild": "#0D597F",\n "Altium Designer": "#A89663",\n "AngelScript": "#C7D7DC",\n "Answer Set Programming": "#A9CC29",\n "Ant Build System": "#A9157E",\n "Antlers": "#ff269e",\n "ApacheConf": "#d12127",\n "Apex": "#1797c0",\n "Apollo Guidance Computer": "#0B3D91",\n "AppleScript": "#101F1F",\n "Arc": "#aa2afe",\n "AsciiDoc": "#73a0c5",\n "AspectJ": "#a957b0",\n "Assembly": "#6E4C13",\n "Astro": "#ff5a03",\n "Asymptote": "#ff0000",\n "Augeas": "#9CC134",\n "AutoHotkey": "#6594b9",\n "AutoIt": "#1C3552",\n "Avro IDL": "#0040FF",\n "Awk": "#c30e9b",\n "B (Formal Method)": "#8aa8c5",\n "B4X": "#00e4ff",\n "BASIC": "#ff0000",\n "BQN": "#2b7067",\n "Ballerina": "#FF5000",\n "Batchfile": "#C1F12E",\n "Beef": "#a52f4e",\n "Berry": "#15A13C",\n "BibTeX": "#778899",\n "Bicep": "#519aba",\n "Bikeshed": "#5562ac",\n "Bison": "#6A463F",\n "BitBake": "#00bce4",\n "Blade": "#f7523f",\n "BlitzBasic": "#00FFAE",\n "BlitzMax": "#cd6400",\n "Bluespec": "#12223c",\n "Bluespec BH": "#12223c",\n "Boo": "#d4bec1",\n "Boogie": "#c80fa0",\n "Brainfuck": "#2F2530",\n "BrighterScript": "#66AABB",\n "Brightscript": "#662D91",\n "Browserslist": "#ffd539",\n "Bru": "#F4AA41",\n "BuildStream": "#006bff",\n "C": "#555555",\n "C#": "#178600",\n "C++": "#f34b7d",\n "C3": "#2563eb",\n "CAP CDS": "#0092d1",\n "CLIPS": "#00A300",\n "CMake": "#DA3434",\n "COLLADA": "#F1A42B",\n "CQL": "#006091",\n "CSON": "#244776",\n "CSS": "#663399",\n "CSV": "#237346",\n "CUE": "#5886E1",\n "CWeb": "#00007a",\n "Cabal Config": "#483465",\n "Caddyfile": "#22b638",\n "Cadence": "#00ef8b",\n "Cairo": "#ff4a48",\n "Cairo Zero": "#ff4a48",\n "CameLIGO": "#3be133",\n "Cangjie": "#00868B",\n "Cap\'n Proto": "#c42727",\n "Carbon": "#222222",\n "Ceylon": "#dfa535",\n "Chapel": "#8dc63f",\n "ChucK": "#3f8000",\n "Circom": "#707575",\n "Cirru": "#ccccff",\n "Clarion": "#db901e",\n "Clarity": "#5546ff",\n "Classic ASP": "#6a40fd",\n "Clean": "#3F85AF",\n "Click": "#E4E6F3",\n "Clojure": "#db5855",\n "Closure Templates": "#0d948f",\n "Cloud Firestore Security Rules": "#FFA000",\n "Clue": "#0009b5",\n "CodeQL": "#140f46",\n "CoffeeScript": "#244776",\n "ColdFusion": "#ed2cd6",\n "ColdFusion CFC": "#ed2cd6",\n "Common Lisp": "#3fb68b",\n "Common Workflow Language": "#B5314C",\n "Component Pascal": "#B0CE4E",\n "Cooklang": "#E15A29",\n "Crystal": "#000100",\n "Csound": "#1a1a1a",\n "Csound Document": "#1a1a1a",\n "Csound Score": "#1a1a1a",\n "Cuda": "#3A4E3A",\n "Curry": "#531242",\n "Cylc": "#00b3fd",\n "Cypher": "#34c0eb",\n "Cython": "#fedf5b",\n "D": "#ba595e",\n "D2": "#526ee8",\n "DM": "#447265",\n "Dafny": "#FFEC25",\n "Darcs Patch": "#8eff23",\n "Dart": "#00B4AB",\n "Daslang": "#d3d3d3",\n "DataWeave": "#003a52",\n "Debian Package Control File": "#D70751",\n "DenizenScript": "#FBEE96",\n "Dhall": "#dfafff",\n "DirectX 3D File": "#aace60",\n "Dockerfile": "#384d54",\n "Dogescript": "#cca760",\n "Dotenv": "#e5d559",\n "Dune": "#89421e",\n "Dylan": "#6c616e",\n "E": "#ccce35",\n "ECL": "#8a1267",\n "ECLiPSe": "#001d9d",\n "EJS": "#a91e50",\n "EQ": "#a78649",\n "Earthly": "#2af0ff",\n "Easybuild": "#069406",\n "Ecere Projects": "#913960",\n "Ecmarkup": "#eb8131",\n "Edge": "#0dffe0",\n "EdgeQL": "#31A7FF",\n "EditorConfig": "#fff1f2",\n "Eiffel": "#4d6977",\n "Elixir": "#6e4a7e",\n "Elm": "#60B5CC",\n "Elvish": "#55BB55",\n "Elvish Transcript": "#55BB55",\n "Emacs Lisp": "#c065db",\n "EmberScript": "#FFF4F3",\n "Erlang": "#B83998",\n "Euphoria": "#FF790B",\n "F#": "#b845fc",\n "F*": "#572e30",\n "FIGlet Font": "#FFDDBB",\n "FIRRTL": "#2f632f",\n "FLUX": "#88ccff",\n "Factor": "#636746",\n "Fancy": "#7b9db4",\n "Fantom": "#14253c",\n "Faust": "#c37240",\n "Fennel": "#fff3d7",\n "Filebench WML": "#F6B900",\n "FlatBuffers": "#ed284a",\n "Flix": "#d44a45",\n "Fluent": "#ffcc33",\n "Forth": "#341708",\n "Fortran": "#4d41b1",\n "Fortran Free Form": "#4d41b1",\n "FreeBASIC": "#141AC9",\n "FreeMarker": "#0050b2",\n "Frege": "#00cafe",\n "Futhark": "#5f021f",\n "G-code": "#D08CF2",\n "GAML": "#FFC766",\n "GAMS": "#f49a22",\n "GAP": "#0000cc",\n "GCC Machine Description": "#FFCFAB",\n "GDScript": "#355570",\n "GDShader": "#478CBF",\n "GEDCOM": "#003058",\n "GLSL": "#5686a5",\n "GSC": "#FF6800",\n "Game Maker Language": "#71b417",\n "Gemfile.lock": "#701516",\n "Gemini": "#ff6900",\n "Genero 4gl": "#63408e",\n "Genero per": "#d8df39",\n "Genie": "#fb855d",\n "Genshi": "#951531",\n "Gentoo Ebuild": "#9400ff",\n "Gentoo Eclass": "#9400ff",\n "Gerber Image": "#d20b00",\n "Gherkin": "#5B2063",\n "Git Attributes": "#F44D27",\n "Git Commit": "#F44D27",\n "Git Config": "#F44D27",\n "Git Revision List": "#F44D27",\n "Gleam": "#ffaff3",\n "Glimmer JS": "#F5835F",\n "Glimmer TS": "#3178c6",\n "Glyph": "#c1ac7f",\n "Gnuplot": "#f0a9f0",\n "Go": "#00ADD8",\n "Go Checksums": "#00ADD8",\n "Go Module": "#00ADD8",\n "Go Template": "#00ADD8",\n "Go Workspace": "#00ADD8",\n "Godot Resource": "#355570",\n "Golo": "#88562A",\n "Gosu": "#82937f",\n "Grace": "#615f8b",\n "Gradle": "#02303a",\n "Gradle Kotlin DSL": "#02303a",\n "Grammatical Framework": "#ff0000",\n "GraphQL": "#e10098",\n "Graphviz (DOT)": "#2596be",\n "Groovy": "#4298b8",\n "Groovy Server Pages": "#4298b8",\n "HAProxy": "#106da9",\n "HCL": "#844FBA",\n "HIP": "#4F3A4F",\n "HLSL": "#aace60",\n "HOCON": "#9ff8ee",\n "HTML": "#e34c26",\n "HTML+ECR": "#2e1052",\n "HTML+EEX": "#6e4a7e",\n "HTML+ERB": "#701516",\n "HTML+PHP": "#4f5d95",\n "HTML+Razor": "#512be4",\n "HTTP": "#005C9C",\n "HXML": "#f68712",\n "Hack": "#878787",\n "Haml": "#ece2a9",\n "Handlebars": "#f7931e",\n "Harbour": "#0e60e3",\n "Hare": "#9d7424",\n "Haskell": "#5e5086",\n "Haxe": "#df7900",\n "HiveQL": "#dce200",\n "HolyC": "#ffefaf",\n "Hosts File": "#308888",\n "Hurl": "#FF0288",\n "Hy": "#7790B2",\n "IDL": "#a3522f",\n "IGOR Pro": "#0000cc",\n "IL Assembly": "#512BD4",\n "INI": "#d1dbe0",\n "ISPC": "#2D68B1",\n "Idris": "#b30000",\n "Ignore List": "#000000",\n "ImageJ Macro": "#99AAFF",\n "Imba": "#16cec6",\n "Inno Setup": "#264b99",\n "Io": "#a9188d",\n "Ioke": "#078193",\n "Isabelle": "#FEFE00",\n "Isabelle ROOT": "#FEFE00",\n "J": "#9EEDFF",\n "JAR Manifest": "#b07219",\n "JCL": "#d90e09",\n "JFlex": "#DBCA00",\n "JSON": "#292929",\n "JSON with Comments": "#292929",\n "JSON5": "#267CB9",\n "JSONLD": "#0c479c",\n "JSONiq": "#40d47e",\n "Jac": "#FC792D",\n "Jai": "#ab8b4b",\n "Janet": "#0886a5",\n "Jasmin": "#d03600",\n "Java": "#b07219",\n "Java Properties": "#2A6277",\n "Java Server Pages": "#2A6277",\n "Java Template Engine": "#2A6277",\n "JavaScript": "#f1e05a",\n "JavaScript+ERB": "#f1e05a",\n "Jest Snapshot": "#15c213",\n "JetBrains MPS": "#21D789",\n "Jinja": "#a52a22",\n "Jison": "#56b3cb",\n "Jison Lex": "#56b3cb",\n "Jolie": "#843179",\n "Jsonnet": "#0064bd",\n "Julia": "#a270ba",\n "Julia REPL": "#a270ba",\n "Jupyter Notebook": "#DA5B0B",\n "Just": "#384d54",\n "KCL": "#7ABABF",\n "KDL": "#ffb3b3",\n "KFramework": "#4195c5",\n "KRL": "#28430A",\n "Kaitai Struct": "#773b37",\n "KakouneScript": "#6f8042",\n "KerboScript": "#41adf0",\n "KiCad Layout": "#2f4aab",\n "KiCad Legacy Layout": "#2f4aab",\n "KiCad Schematic": "#2f4aab",\n "KoLmafia ASH": "#B9D9B9",\n "Koka": "#215166",\n "Kotlin": "#A97BFF",\n "LFE": "#4C3023",\n "LLVM": "#185619",\n "LOLCODE": "#cc9900",\n "LSL": "#3d9970",\n "LabVIEW": "#fede06",\n "Lambdapi": "#8027a3",\n "Langium": "#2c8c87",\n "Lark": "#2980B9",\n "Lasso": "#999999",\n "Latte": "#f2a542",\n "Leo": "#C4FFC2",\n "Less": "#1d365d",\n "Lex": "#DBCA00",\n "LigoLANG": "#0e74ff",\n "LilyPond": "#9ccc7c",\n "Liquid": "#67b8de",\n "Liquidsoap": "#990066",\n "Literate Agda": "#315665",\n "Literate CoffeeScript": "#244776",\n "Literate Haskell": "#5e5086",\n "LiveCode Script": "#0c5ba5",\n "LiveScript": "#499886",\n "Logtalk": "#295b9a",\n "LookML": "#652B81",\n "Lua": "#000080",\n "Luau": "#00A2FF",\n "M3U": "#179C7D",\n "MATLAB": "#e16737",\n "MAXScript": "#00a6a6",\n "MDX": "#fcb32c",\n "MLIR": "#5EC8DB",\n "MQL4": "#62A8D6",\n "MQL5": "#4A76B8",\n "MTML": "#b7e1f4",\n "Macaulay2": "#d8ffff",\n "Makefile": "#427819",\n "Mako": "#7e858d",\n "Markdown": "#083fa1",\n "Marko": "#42bff2",\n "Mask": "#f97732",\n "Mathematical Programming System": "#0530ad",\n "Max": "#c4a79c",\n "MeTTa": "#6a5acd",\n "Mercury": "#ff2b2b",\n "Mermaid": "#ff3670",\n "Meson": "#007800",\n "Metal": "#8f14e9",\n "MiniYAML": "#ff1111",\n "MiniZinc": "#06a9e6",\n "Mint": "#02b046",\n "Mirah": "#c7a938",\n "Modelica": "#de1d31",\n "Modula-2": "#10253f",\n "Modula-3": "#223388",\n "Mojo": "#ff4c1f",\n "Monkey C": "#8D6747",\n "MoonBit": "#b92381",\n "MoonScript": "#ff4585",\n "Motoko": "#fbb03b",\n "Motorola 68K Assembly": "#005daa",\n "Move": "#4a137a",\n "Mustache": "#724b3b",\n "NCL": "#28431f",\n "NMODL": "#00356B",\n "NPM Config": "#cb3837",\n "NWScript": "#111522",\n "Nasal": "#1d2c4e",\n "Nearley": "#990000",\n "Nemerle": "#3d3c6e",\n "NetLinx": "#0aa0ff",\n "NetLinx+ERB": "#747faa",\n "NetLogo": "#ff6375",\n "NewLisp": "#87AED7",\n "Nextflow": "#3ac486",\n "Nginx": "#009639",\n "Nickel": "#E0C3FC",\n "Nim": "#ffc200",\n "Nit": "#009917",\n "Nix": "#7e7eff",\n "Noir": "#2f1f49",\n "Nu": "#c9df40",\n "NumPy": "#9C8AF9",\n "Nunjucks": "#3d8137",\n "Nushell": "#4E9906",\n "OASv2-json": "#85ea2d",\n "OASv2-yaml": "#85ea2d",\n "OASv3-json": "#85ea2d",\n "OASv3-yaml": "#85ea2d",\n "OCaml": "#ef7a08",\n "OMNeT++ MSG": "#a0e0a0",\n "OMNeT++ NED": "#08607c",\n "ObjectScript": "#424893",\n "Objective-C": "#438eff",\n "Objective-C++": "#6866fb",\n "Objective-J": "#ff0c5a",\n "Odin": "#60AFFE",\n "Omgrofl": "#cabbff",\n "Opal": "#f7ede0",\n "Open Policy Agent": "#7d9199",\n "OpenAPI Specification v2": "#85ea2d",\n "OpenAPI Specification v3": "#85ea2d",\n "OpenCL": "#ed2e2d",\n "OpenEdge ABL": "#5ce600",\n "OpenQASM": "#AA70FF",\n "OpenSCAD": "#e5cd45",\n "Option List": "#476732",\n "Org": "#77aa99",\n "OverpassQL": "#cce2aa",\n "Oxygene": "#cdd0e3",\n "Oz": "#fab738",\n "P4": "#7055b5",\n "PDDL": "#0d00ff",\n "PEG.js": "#234d6b",\n "PHP": "#4F5D95",\n "PLSQL": "#dad8d8",\n "PLpgSQL": "#336790",\n "POV-Ray SDL": "#6bac65",\n "Pact": "#F7A8B8",\n "Pan": "#cc0000",\n "Papyrus": "#6600cc",\n "Parrot": "#f3ca0a",\n "Pascal": "#E3F171",\n "Pawn": "#dbb284",\n "Pep8": "#C76F5B",\n "Perl": "#0298c3",\n "PicoLisp": "#6067af",\n "PigLatin": "#fcd7de",\n "Pike": "#005390",\n "Pip Requirements": "#FFD343",\n "Pkl": "#6b9543",\n "PlantUML": "#fbbd16",\n "PogoScript": "#d80074",\n "Polar": "#ae81ff",\n "Portugol": "#f8bd00",\n "PostCSS": "#dc3a0c",\n "PostScript": "#da291c",\n "PowerBuilder": "#8f0f8d",\n "PowerShell": "#012456",\n "Praat": "#c8506d",\n "Prisma": "#0c344b",\n "Processing": "#0096D8",\n "Procfile": "#3B2F63",\n "Prolog": "#74283c",\n "Promela": "#de0000",\n "Propeller Spin": "#7fa2a7",\n "Pug": "#a86454",\n "Puppet": "#302B6D",\n "PureBasic": "#5a6986",\n "PureScript": "#1D222D",\n "Pyret": "#ee1e10",\n "Python": "#3572A5",\n "Python console": "#3572A5",\n "Python traceback": "#3572A5",\n "Q#": "#fed659",\n "QML": "#44a51c",\n "Qt Script": "#00b841",\n "Quake": "#882233",\n "QuakeC": "#975777",\n "QuickBASIC": "#008080",\n "Quint": "#9d6ce5",\n "R": "#198CE7",\n "RAML": "#77d9fb",\n "RAScript": "#2C97FA",\n "RBS": "#701516",\n "RDoc": "#701516",\n "REXX": "#d90e09",\n "RMarkdown": "#198ce7",\n "RON": "#a62c00",\n "ROS Interface": "#22314e",\n "RPGLE": "#2BDE21",\n "RUNOFF": "#665a4e",\n "Racket": "#3c5caa",\n "Ragel": "#9d5200",\n "Raku": "#0000fb",\n "Rascal": "#fffaa0",\n "ReScript": "#ed5051",\n "Reason": "#ff5847",\n "ReasonLIGO": "#ff5847",\n "Rebol": "#358a5b",\n "Record Jar": "#0673ba",\n "Red": "#f50000",\n "Regular Expression": "#009a00",\n "Ren\'Py": "#ff7f7f",\n "Rez": "#FFDAB3",\n "Ring": "#2D54CB",\n "Riot": "#A71E49",\n "RobotFramework": "#00c0b5",\n "Roc": "#7c38f5",\n "Rocq Prover": "#d0b68c",\n "Roff": "#ecdebe",\n "Roff Manpage": "#ecdebe",\n "Rouge": "#cc0088",\n "RouterOS Script": "#DE3941",\n "Ruby": "#701516",\n "Rust": "#dea584",\n "SAS": "#B34936",\n "SCSS": "#c6538c",\n "SPARQL": "#0C4597",\n "SQF": "#3F3F3F",\n "SQL": "#e38c00",\n "SQLPL": "#e38c00",\n "SRecode Template": "#348a34",\n "STL": "#373b5e",\n "SVG": "#ff9900",\n "Sail": "#259dd5",\n "SaltStack": "#646464",\n "Sass": "#a53b70",\n "Scala": "#c22d40",\n "Scaml": "#bd181a",\n "Scenic": "#fdc700",\n "Scheme": "#1e4aec",\n "Scilab": "#ca0f21",\n "Self": "#0579aa",\n "ShaderLab": "#222c37",\n "Shell": "#89e051",\n "ShellCheck Config": "#cecfcb",\n "Shen": "#120F14",\n "Simple File Verification": "#C9BFED",\n "Singularity": "#64E6AD",\n "Slang": "#1fbec9",\n "Slash": "#007eff",\n "Slice": "#003fa2",\n "Slim": "#2b2b2b",\n "Slint": "#2379F4",\n "SmPL": "#c94949",\n "Smalltalk": "#596706",\n "Smarty": "#f0c040",\n "Smithy": "#c44536",\n "Snakemake": "#419179",\n "Solidity": "#AA6746",\n "SourcePawn": "#f69e1d",\n "SpiceDB Schema": "#a5318a",\n "Squirrel": "#800000",\n "Stan": "#b2011d",\n "Standard ML": "#dc566d",\n "Starlark": "#76d275",\n "Stata": "#1a5f91",\n "StringTemplate": "#3fb34f",\n "Stylus": "#ff6347",\n "SubRip Text": "#9e0101",\n "SugarSS": "#2fcc9f",\n "SuperCollider": "#46390b",\n "SurrealQL": "#ff00a0",\n "Survex data": "#ffcc99",\n "Svelte": "#ff3e00",\n "Sway": "#00F58C",\n "Sweave": "#198ce7",\n "Swift": "#F05138",\n "SystemVerilog": "#DAE1C2",\n "TI Program": "#A0AA87",\n "TL-Verilog": "#C40023",\n "TLA": "#4b0079",\n "TMDL": "#f0c913",\n "TOML": "#9c4221",\n "TSQL": "#e38c00",\n "TSV": "#237346",\n "TSX": "#3178c6",\n "TXL": "#0178b8",\n "Tact": "#48b5ff",\n "Talon": "#333333",\n "Tcl": "#e4cc98",\n "TeX": "#3D6117",\n "Teal": "#00B1BC",\n "Terra": "#00004c",\n "Terraform Template": "#7b42bb",\n "TextGrid": "#c8506d",\n "TextMate Properties": "#df66e4",\n "Textile": "#ffe7ac",\n "Thrift": "#D12127",\n "Toit": "#c2c9fb",\n "Tor Config": "#59316b",\n "Tree-sitter Query": "#8ea64c",\n "Turing": "#cf142b",\n "Twig": "#c1d026",\n "TypeScript": "#3178c6",\n "TypeSpec": "#4A3665",\n "Typst": "#239dad",\n "Unified Parallel C": "#4e3617",\n "Unity3D Asset": "#222c37",\n "Uno": "#9933cc",\n "UnrealScript": "#a54c4d",\n "Untyped Plutus Core": "#36adbd",\n "UrWeb": "#ccccee",\n "V": "#4f87c4",\n "VBA": "#867db1",\n "VBScript": "#15dcdc",\n "VCL": "#148AA8",\n "VHDL": "#adb2cb",\n "Vala": "#a56de2",\n "Valve Data Format": "#f26025",\n "Velocity Template Language": "#507cff",\n "Vento": "#ff0080",\n "Verilog": "#b2b7f8",\n "Vim Help File": "#199f4b",\n "Vim Script": "#199f4b",\n "Vim Snippet": "#199f4b",\n "Visual Basic .NET": "#945db7",\n "Visual Basic 6.0": "#2c6353",\n "Volt": "#1F1F1F",\n "Vue": "#41b883",\n "Vyper": "#9F4CF2",\n "WDL": "#42f1f4",\n "WGSL": "#1a5e9a",\n "Web Ontology Language": "#5b70bd",\n "WebAssembly": "#04133b",\n "WebAssembly Interface Type": "#6250e7",\n "Whiley": "#d5c397",\n "Wikitext": "#fc5757",\n "Windows Registry Entries": "#52d5ff",\n "Witcher Script": "#ff0000",\n "Wolfram Language": "#dd1100",\n "Wollok": "#a23738",\n "World of Warcraft Addon Data": "#f7e43f",\n "Wren": "#383838",\n "X10": "#4B6BEF",\n "XC": "#99DA07",\n "XML": "#0060ac",\n "XML Property List": "#0060ac",\n "XQuery": "#5232e7",\n "XSLT": "#EB8CEB",\n "Xmake": "#22a079",\n "Xojo": "#81bd41",\n "Xonsh": "#285EEF",\n "Xtend": "#24255d",\n "YAML": "#cb171e",\n "YARA": "#220000",\n "YASnippet": "#32AB90",\n "Yacc": "#4B6C4B",\n "Yul": "#794932",\n "ZAP": "#0d665e",\n "ZIL": "#dc75e5",\n "ZenScript": "#00BCD1",\n "Zephir": "#118f9e",\n "Zig": "#ec915c",\n "Zimpl": "#d67711",\n "Zmodel": "#ff7100",\n "crontab": "#ead7ac",\n "eC": "#913960",\n "fish": "#4aae47",\n "hoon": "#00b171",\n "iCalendar": "#ec564c",\n "jq": "#c7254e",\n "kvlang": "#1da6e0",\n "mIRC Script": "#3d57c3",\n "mcfunction": "#E22837",\n "mdsvex": "#5f9ea0",\n "mupad": "#244963",\n "nanorc": "#2d004d",\n "nesC": "#94B0C7",\n "ooc": "#b0b77e",\n "q": "#0040cd",\n "reStructuredText": "#141414",\n "sed": "#64b970",\n "templ": "#66D0DD",\n "vCard": "#ee2647",\n "wisp": "#7582D1",\n "xBase": "#403a40"\n },\n "ext": {\n "1": "Roff",\n "1in": "Roff",\n "1m": "Roff",\n "1x": "Roff",\n "2": "Roff",\n "2da": "2-Dimensional Array",\n "3": "Roff",\n "3in": "Roff",\n "3m": "Roff",\n "3p": "Roff",\n "3pm": "Roff",\n "3qt": "Roff",\n "3x": "Roff",\n "4": "Roff",\n "4dform": "JSON",\n "4dm": "4D",\n "4dproject": "JSON",\n "4gl": "Genero 4gl",\n "4th": "Forth",\n "5": "Roff",\n "6": "Roff",\n "6pl": "Raku",\n "6pm": "Raku",\n "7": "Roff",\n "8": "Roff",\n "8xp": "TI Program",\n "8xp.txt": "TI Program",\n "9": "Roff",\n "_coffee": "CoffeeScript",\n "_js": "JavaScript",\n "_ls": "LiveScript",\n "a51": "Assembly",\n "abap": "ABAP",\n "action": "ROS Interface",\n "ada": "Ada",\n "adb": "Ada",\n "adml": "XML",\n "admx": "XML",\n "ado": "Stata",\n "adoc": "AsciiDoc",\n "adp": "Tcl",\n "ads": "Ada",\n "afm": "Adobe Font Metrics",\n "agc": "Assembly",\n "agda": "Agda",\n "ahk": "AutoHotkey",\n "ahkl": "AutoHotkey",\n "aidl": "AIDL",\n "aj": "AspectJ",\n "ak": "Aiken",\n "al": "AL",\n "alg": "ALGOL",\n "als": "Alloy",\n "ampl": "AMPL",\n "angelscript": "AngelScript",\n "anim": "Unity3D Asset",\n "ant": "XML",\n "antlers.html": "Antlers",\n "antlers.php": "Antlers",\n "antlers.xml": "Antlers",\n "apacheconf": "ApacheConf",\n "apex": "Apex",\n "apib": "API Blueprint",\n "apl": "APL",\n "app": "Erlang",\n "app.src": "Erlang",\n "applescript": "AppleScript",\n "arc": "Arc",\n "arr": "Pyret",\n "as": "ActionScript",\n "asax": "ASP.NET",\n "asc": "AGS Script",\n "asciidoc": "AsciiDoc",\n "ascx": "ASP.NET",\n "asd": "Common Lisp",\n "asddls": "ABAP CDS",\n "ash": "KoLmafia ASH",\n "ashx": "ASP.NET",\n "asm": "Assembly",\n "asmx": "ASP.NET",\n "asp": "Classic ASP",\n "aspx": "ASP.NET",\n "asset": "Unity3D Asset",\n "astro": "Astro",\n "asy": "Asymptote",\n "au3": "AutoIt",\n "aug": "Augeas",\n "auk": "Awk",\n "aux": "TeX",\n "avdl": "Avro IDL",\n "avsc": "JSON",\n "aw": "PHP",\n "awk": "Awk",\n "axaml": "XML",\n "axd": "ASP.NET",\n "axi": "NetLinx",\n "axi.erb": "NetLinx+ERB",\n "axml": "XML",\n "axs": "NetLinx",\n "axs.erb": "NetLinx+ERB",\n "b": "Brainfuck",\n "bal": "Ballerina",\n "bas": "B4X",\n "bash": "Shell",\n "bat": "Batchfile",\n "bats": "Shell",\n "bb": "BitBake",\n "bbappend": "BitBake",\n "bbclass": "BitBake",\n "bbx": "TeX",\n "bdy": "PLSQL",\n "be": "Berry",\n "bf": "Beef",\n "bi": "FreeBASIC",\n "bib": "TeX",\n "bibtex": "TeX",\n "bicep": "Bicep",\n "bicepparam": "Bicep",\n "bison": "Yacc",\n "blade": "Blade",\n "blade.php": "Blade",\n "bmx": "BlitzMax",\n "bones": "JavaScript",\n "boo": "Boo",\n "boot": "Clojure",\n "bpl": "Boogie",\n "bqn": "BQN",\n "brd": "KiCad Legacy Layout",\n "brs": "Brightscript",\n "bru": "Bru",\n "bs": "Bluespec",\n "bsl": "1C Enterprise",\n "bst": "BuildStream",\n "bsv": "Bluespec",\n "builder": "Ruby",\n "builds": "XML",\n "bzl": "Starlark",\n "c": "C",\n "c++": "C++",\n "c3": "C3",\n "cabal": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cairo": "Cairo",\n "cake": "C#",\n "capnp": "Cap\'n Proto",\n "carbon": "Carbon",\n "cats": "C",\n "cbx": "TeX",\n "cc": "C++",\n "ccproj": "XML",\n "ccxml": "XML",\n "cdc": "Cadence",\n "cdf": "Wolfram Language",\n "cds": "CAP CDS",\n "ceylon": "Ceylon",\n "cfc": "ColdFusion",\n "cfg": "HAProxy",\n "cfm": "ColdFusion",\n "cfml": "ColdFusion",\n "cgi": "Perl",\n "cginc": "HLSL",\n "ch": "xBase",\n "chpl": "Chapel",\n "circom": "Circom",\n "cirru": "Cirru",\n "cj": "Cangjie",\n "cjs": "JavaScript",\n "cjsx": "CoffeeScript",\n "ck": "ChucK",\n "cl": "C",\n "cl2": "Clojure",\n "clar": "Clarity",\n "click": "Click",\n "clixml": "XML",\n "clj": "Clojure",\n "cljc": "Clojure",\n "cljs": "Clojure",\n "cljs.hl": "Clojure",\n "cljscm": "Clojure",\n "cljx": "Clojure",\n "clp": "CLIPS",\n "cls": "Apex",\n "clue": "Clue",\n "clw": "Clarion",\n "cmake": "CMake",\n "cmake.in": "CMake",\n "cmd": "Batchfile",\n "cmp": "Gerber Image",\n "cnc": "G-code",\n "cnf": "INI",\n "cocci": "SmPL",\n "code-snippets": "JSON",\n "code-workspace": "JSON",\n "coffee": "CoffeeScript",\n "coffee.md": "CoffeeScript",\n "command": "Shell",\n "containerfile": "Dockerfile",\n "cook": "Cooklang",\n "coq": "Rocq Prover",\n "cp": "Component Pascal",\n "cpp": "C++",\n "cppm": "C++",\n "cproject": "XML",\n "cps": "Component Pascal",\n "cql": "CQL",\n "cr": "Crystal",\n "cs": "C#",\n "cs.pp": "C#",\n "csc": "GSC",\n "cscfg": "XML",\n "csd": "Csound Document",\n "csdef": "XML",\n "cshtml": "HTML",\n "csl": "XML",\n "cson": "CSON",\n "csproj": "XML",\n "css": "CSS",\n "csv": "CSV",\n "csx": "C#",\n "ct": "XML",\n "ctl": "Visual Basic 6.0",\n "ctp": "PHP",\n "cts": "TypeScript",\n "cu": "Cuda",\n "cue": "CUE",\n "cuh": "Cuda",\n "curry": "Curry",\n "cwl": "Common Workflow Language",\n "cxx": "C++",\n "cylc": "INI",\n "cyp": "Cypher",\n "cypher": "Cypher",\n "d": "D",\n "d2": "D2",\n "dae": "COLLADA",\n "darcspatch": "Darcs Patch",\n "dart": "Dart",\n "das": "Daslang",\n "dats": "ATS",\n "db2": "SQLPL",\n "dcl": "Clean",\n "ddl": "PLSQL",\n "decls": "BlitzBasic",\n "depproj": "XML",\n "dfm": "Pascal",\n "dfy": "Dafny",\n "dhall": "Dhall",\n "di": "D",\n "dita": "XML",\n "ditamap": "XML",\n "ditaval": "XML",\n "djs": "Dogescript",\n "dll.config": "XML",\n "dlm": "IDL",\n "dm": "DM",\n "do": "Stata",\n "dockerfile": "Dockerfile",\n "dof": "INI",\n "doh": "Stata",\n "dot": "Graphviz (DOT)",\n "dotsettings": "XML",\n "dpatch": "Darcs Patch",\n "dpr": "Pascal",\n "druby": "Mirah",\n "dsc": "DenizenScript",\n "dsp": "Faust",\n "dsr": "Visual Basic 6.0",\n "dtx": "TeX",\n "duby": "Mirah",\n "dwl": "DataWeave",\n "dyalog": "APL",\n "dyl": "Dylan",\n "dylan": "Dylan",\n "e": "E",\n "eb": "Python",\n "ebuild": "Shell",\n "ec": "eC",\n "ecl": "ECL",\n "eclass": "Shell",\n "eclxml": "ECL",\n "ecr": "HTML",\n "ect": "EJS",\n "edge": "Edge",\n "edgeql": "EdgeQL",\n "editorconfig": "INI",\n "eh": "eC",\n "ejs": "EJS",\n "ejs.t": "EJS",\n "el": "Emacs Lisp",\n "eliom": "OCaml",\n "eliomi": "OCaml",\n "elm": "Elm",\n "elv": "Elvish",\n "em": "EmberScript",\n "emacs": "Emacs Lisp",\n "emacs.desktop": "Emacs Lisp",\n "emberscript": "EmberScript",\n "env": "Dotenv",\n "epj": "JavaScript",\n "eps": "PostScript",\n "epsi": "PostScript",\n "eq": "EQ",\n "erb": "HTML",\n "erb.deface": "HTML",\n "erl": "Erlang",\n "es": "Erlang",\n "es6": "JavaScript",\n "escript": "Erlang",\n "esdl": "EdgeQL",\n "ex": "Elixir",\n "exs": "Elixir",\n "eye": "Ruby",\n "f": "Fortran",\n "f03": "Fortran",\n "f08": "Fortran",\n "f77": "Fortran",\n "f90": "Fortran",\n "f95": "Fortran",\n "factor": "Factor",\n "fan": "Fantom",\n "fancypack": "Fancy",\n "fbs": "FlatBuffers",\n "fcgi": "Lua",\n "feature": "Gherkin",\n "filters": "XML",\n "fir": "FIRRTL",\n "fish": "Shell",\n "flex": "Lex",\n "flf": "FIGlet Font",\n "flix": "Flix",\n "flux": "FLUX",\n "fnc": "PLSQL",\n "fnl": "Fennel",\n "for": "Fortran",\n "forth": "Forth",\n "fp": "GLSL",\n "fpp": "Fortran",\n "fr": "Frege",\n "frag": "GLSL",\n "frg": "GLSL",\n "frm": "VBA",\n "frt": "Forth",\n "fs": "F#",\n "fsh": "GLSL",\n "fshader": "GLSL",\n "fsi": "F#",\n "fsproj": "XML",\n "fst": "F*",\n "fsti": "F*",\n "fsx": "F#",\n "fth": "Forth",\n "ftl": "Fluent",\n "ftlh": "FreeMarker",\n "fun": "Standard ML",\n "fut": "Futhark",\n "fx": "FLUX",\n "fxh": "HLSL",\n "fxml": "XML",\n "fy": "Fancy",\n "g": "G-code",\n "g4": "ANTLR",\n "gaml": "GAML",\n "gap": "GAP",\n "gawk": "Awk",\n "gbl": "Gerber Image",\n "gbo": "Gerber Image",\n "gbp": "Gerber Image",\n "gbr": "Gerber Image",\n "gbs": "Gerber Image",\n "gco": "G-code",\n "gcode": "G-code",\n "gd": "GDScript",\n "gdnlib": "Godot Resource",\n "gdns": "Godot Resource",\n "gdshader": "GDShader",\n "gdshaderinc": "GDShader",\n "ged": "GEDCOM",\n "gemspec": "Ruby",\n "geo": "GLSL",\n "geojson": "JSON",\n "geom": "GLSL",\n "gf": "Grammatical Framework",\n "gi": "GAP",\n "gitconfig": "INI",\n "gitignore": "Ignore List",\n "gjs": "JavaScript",\n "gko": "Gerber Image",\n "glade": "XML",\n "gleam": "Gleam",\n "glf": "Glyph",\n "glsl": "GLSL",\n "glslf": "GLSL",\n "glslv": "GLSL",\n "gltf": "JSON",\n "gmi": "Gemini",\n "gml": "Game Maker Language",\n "gms": "GAMS",\n "gmx": "XML",\n "gnu": "Gnuplot",\n "gnuplot": "Gnuplot",\n "go": "Go",\n "god": "Ruby",\n "gohtml": "Go Template",\n "golo": "Golo",\n "gotmpl": "Go Template",\n "gp": "Gnuplot",\n "gpb": "Gerber Image",\n "gpt": "Gerber Image",\n "gpx": "XML",\n "gql": "GraphQL",\n "grace": "Grace",\n "gradle": "Gradle",\n "gradle.kts": "Gradle",\n "graphql": "GraphQL",\n "graphqls": "GraphQL",\n "groovy": "Groovy",\n "grt": "Groovy",\n "grxml": "XML",\n "gs": "Genie",\n "gsc": "GSC",\n "gsh": "GSC",\n "gshader": "GLSL",\n "gsp": "Groovy",\n "gst": "Gosu",\n "gsx": "Gosu",\n "gtl": "Gerber Image",\n "gto": "Gerber Image",\n "gtp": "Gerber Image",\n "gtpl": "Groovy",\n "gts": "TypeScript",\n "gv": "Graphviz (DOT)",\n "gvy": "Groovy",\n "gyp": "Python",\n "gypi": "Python",\n "h": "C",\n "h++": "C++",\n "h.in": "C",\n "ha": "Hare",\n "hack": "Hack",\n "haml": "Haml",\n "haml.deface": "Haml",\n "handlebars": "Handlebars",\n "har": "JSON",\n "hats": "ATS",\n "hb": "Harbour",\n "hbs": "Handlebars",\n "hc": "HolyC",\n "hcl": "HCL",\n "heex": "HTML",\n "hh": "C++",\n "hhi": "Hack",\n "hic": "Clojure",\n "hip": "HIP",\n "hlsl": "HLSL",\n "hlsli": "HLSL",\n "hocon": "HOCON",\n "hoon": "hoon",\n "hpp": "C++",\n "hqf": "SQF",\n "hql": "HiveQL",\n "hrl": "Erlang",\n "hs": "Haskell",\n "hs-boot": "Haskell",\n "hsc": "Haskell",\n "hta": "HTML",\n "htm": "HTML",\n "html": "HTML",\n "html.eex": "HTML",\n "html.hl": "HTML",\n "html.tmpl": "Go Template",\n "http": "HTTP",\n "hurl": "Hurl",\n "hx": "Haxe",\n "hxml": "HXML",\n "hxsl": "Haxe",\n "hxx": "C++",\n "hy": "Hy",\n "hzp": "XML",\n "i": "Assembly",\n "i3": "Modula-3",\n "ical": "iCalendar",\n "ice": "Slice",\n "iced": "CoffeeScript",\n "icl": "Clean",\n "icls": "XML",\n "ics": "iCalendar",\n "idc": "C",\n "idr": "Idris",\n "ig": "Modula-3",\n "ihlp": "Stata",\n "ijm": "ImageJ Macro",\n "ijs": "J",\n "ik": "Ioke",\n "il": "IL Assembly",\n "ily": "LilyPond",\n "imba": "Imba",\n "iml": "XML",\n "inc": "Assembly",\n "ini": "INI",\n "inl": "C++",\n "ino": "C++",\n "ins": "TeX",\n "intr": "Dylan",\n "io": "Io",\n "iol": "Jolie",\n "ipf": "IGOR Pro",\n "ipp": "C++",\n "ipynb": "Jupyter Notebook",\n "isl": "Inno Setup",\n "ispc": "ISPC",\n "iss": "Inno Setup",\n "iuml": "PlantUML",\n "ivy": "XML",\n "ixx": "C++",\n "j": "Jasmin",\n "j2": "Jinja",\n "jac": "Jac",\n "jade": "Pug",\n "jai": "Jai",\n "jake": "JavaScript",\n "janet": "Janet",\n "jav": "Java",\n "java": "Java",\n "javascript": "JavaScript",\n "jbuilder": "Ruby",\n "jcl": "JCL",\n "jelly": "XML",\n "jflex": "Lex",\n "jinja": "Jinja",\n "jinja2": "Jinja",\n "jison": "Yacc",\n "jisonlex": "Lex",\n "jl": "Julia",\n "jq": "JSONiq",\n "js": "JavaScript",\n "js.erb": "JavaScript",\n "jsb": "JavaScript",\n "jscad": "JavaScript",\n "jsfl": "JavaScript",\n "jsh": "Java",\n "jslib": "JavaScript",\n "jsm": "JavaScript",\n "json": "JSON",\n "json-tmlanguage": "JSON",\n "json.example": "JSON",\n "json5": "JSON5",\n "jsonc": "JSON",\n "jsonl": "JSON",\n "jsonld": "JSONLD",\n "jsonnet": "Jsonnet",\n "jsp": "Java",\n "jspre": "JavaScript",\n "jsproj": "XML",\n "jss": "JavaScript",\n "jst": "EJS",\n "jsx": "JavaScript",\n "jte": "Java",\n "just": "Just",\n "k": "KCL",\n "kak": "KakouneScript",\n "kdl": "KDL",\n "kicad_mod": "KiCad Layout",\n "kicad_pcb": "KiCad Layout",\n "kicad_sch": "KiCad Schematic",\n "kicad_sym": "KiCad Schematic",\n "kicad_wks": "KiCad Layout",\n "kid": "Genshi",\n "kk": "Koka",\n "kml": "XML",\n "kojo": "Scala",\n "krl": "KRL",\n "ks": "KerboScript",\n "ksh": "Shell",\n "ksy": "Kaitai Struct",\n "kt": "Kotlin",\n "ktm": "Kotlin",\n "kts": "Kotlin",\n "kv": "kvlang",\n "l": "Common Lisp",\n "lagda": "Agda",\n "langium": "Langium",\n "lark": "Lark",\n "las": "Lasso",\n "lasso": "Lasso",\n "lasso8": "Lasso",\n "lasso9": "Lasso",\n "latte": "Latte",\n "launch": "XML",\n "lbx": "TeX",\n "leex": "HTML",\n "lektorproject": "INI",\n "leo": "Leo",\n "less": "Less",\n "lex": "Lex",\n "lfe": "LFE",\n "lgt": "Logtalk",\n "lhs": "Haskell",\n "libsonnet": "Jsonnet",\n "lid": "Dylan",\n "lidr": "Idris",\n "ligo": "LigoLANG",\n "linq": "C#",\n "liq": "Liquidsoap",\n "liquid": "Liquid",\n "lisp": "Common Lisp",\n "litcoffee": "CoffeeScript",\n "livecodescript": "LiveCode Script",\n "livemd": "Markdown",\n "lkml": "LookML",\n "ll": "LLVM",\n "lmi": "Python",\n "logtalk": "Logtalk",\n "lol": "LOLCODE",\n "lookml": "LookML",\n "lp": "Answer Set Programming",\n "lpr": "Pascal",\n "ls": "LiveScript",\n "lsl": "LSL",\n "lslp": "LSL",\n "lsp": "Common Lisp",\n "ltx": "TeX",\n "lua": "Lua",\n "luau": "Luau",\n "lvclass": "LabVIEW",\n "lvlib": "LabVIEW",\n "lvproj": "LabVIEW",\n "ly": "LilyPond",\n "m": "Objective-C",\n "m2": "Macaulay2",\n "m3": "Modula-3",\n "m3u": "M3U",\n "m3u8": "M3U",\n "ma": "Wolfram Language",\n "mak": "Makefile",\n "make": "Makefile",\n "makefile": "Makefile",\n "mako": "Mako",\n "man": "Roff",\n "mao": "Mako",\n "markdown": "Markdown",\n "marko": "Marko",\n "mask": "Mask",\n "mat": "Unity3D Asset",\n "mata": "Stata",\n "matah": "Stata",\n "mathematica": "Wolfram Language",\n "matlab": "MATLAB",\n "mawk": "Awk",\n "maxhelp": "Max",\n "maxpat": "Max",\n "maxproj": "Max",\n "mbt": "MoonBit",\n "mc": "Monkey C",\n "mcfunction": "mcfunction",\n "mch": "B (Formal Method)",\n "mcmeta": "JSON",\n "mcr": "MAXScript",\n "md": "Markdown",\n "mdoc": "Roff",\n "mdown": "Markdown",\n "mdpolicy": "XML",\n "mdwn": "Markdown",\n "mdx": "MDX",\n "me": "Roff",\n "mediawiki": "Wikitext",\n "mermaid": "Mermaid",\n "meta": "Unity3D Asset",\n "metal": "Metal",\n "metta": "MeTTa",\n "mg": "Modula-3",\n "mint": "Mint",\n "mir": "YAML",\n "mirah": "Mirah",\n "mjml": "XML",\n "mjs": "JavaScript",\n "mk": "Makefile",\n "mkd": "Markdown",\n "mkdn": "Markdown",\n "mkdown": "Markdown",\n "mkfile": "Makefile",\n "mkii": "TeX",\n "mkiv": "TeX",\n "mkvi": "TeX",\n "ml": "OCaml",\n "ml4": "OCaml",\n "mli": "OCaml",\n "mligo": "LigoLANG",\n "mlir": "MLIR",\n "mll": "OCaml",\n "mly": "OCaml",\n "mm": "Objective-C++",\n "mmd": "Mermaid",\n "mo": "Modelica",\n "mod": "Modula-2",\n "mojo": "Mojo",\n "moo": "Mercury",\n "moon": "MoonScript",\n "move": "Move",\n "mpl": "JetBrains MPS",\n "mps": "JetBrains MPS",\n "mq4": "MQL4",\n "mq5": "MQL5",\n "mqh": "MQL4",\n "mrc": "mIRC Script",\n "ms": "MAXScript",\n "msd": "JetBrains MPS",\n "msg": "OMNeT++ MSG",\n "mspec": "Ruby",\n "mt": "Wolfram Language",\n "mtml": "MTML",\n "mts": "TypeScript",\n "mu": "mupad",\n "mud": "ZIL",\n "mustache": "Mustache",\n "mxml": "XML",\n "mxt": "Max",\n "mysql": "SQL",\n "mzn": "MiniZinc",\n "n": "Nemerle",\n "nanorc": "INI",\n "nas": "Nasal",\n "nasm": "Assembly",\n "natvis": "XML",\n "nawk": "Awk",\n "nb": "Wolfram Language",\n "nbp": "Wolfram Language",\n "nc": "nesC",\n "ncl": "NCL",\n "ndproj": "XML",\n "ne": "Nearley",\n "nearley": "Nearley",\n "ned": "OMNeT++ NED",\n "nf": "Nextflow",\n "nginx": "Nginx",\n "nginxconf": "Nginx",\n "nim": "Nim",\n "nim.cfg": "Nim",\n "nimble": "Nim",\n "nimrod": "Nim",\n "nims": "Nim",\n "nit": "Nit",\n "nix": "Nix",\n "njk": "Nunjucks",\n "njs": "JavaScript",\n "nl": "NewLisp",\n "nlogo": "NetLogo",\n "nomad": "HCL",\n "nproj": "XML",\n "nqp": "Raku",\n "nr": "Noir",\n "nse": "Lua",\n "nss": "NWScript",\n "nu": "Nu",\n "numpy": "Python",\n "numpyw": "Python",\n "numsc": "Python",\n "nuspec": "XML",\n "nut": "Squirrel",\n "ny": "Common Lisp",\n "odd": "XML",\n "odin": "Odin",\n "ol": "Jolie",\n "omgrofl": "Omgrofl",\n "ooc": "ooc",\n "opal": "Opal",\n "opencl": "C",\n "orc": "Csound",\n "org": "Org",\n "os": "1C Enterprise",\n "osm": "XML",\n "outjob": "Altium Designer",\n "overpassql": "OverpassQL",\n "owl": "Web Ontology Language",\n "oxygene": "Oxygene",\n "oz": "Oz",\n "p": "OpenEdge ABL",\n "p4": "P4",\n "p6": "Raku",\n "p6l": "Raku",\n "p6m": "Raku",\n "p8": "Lua",\n "pac": "JavaScript",\n "pact": "Pact",\n "pan": "Pan",\n "parrot": "Parrot",\n "pas": "Pascal",\n "pascal": "Pascal",\n "pat": "Max",\n "pb": "PureBasic",\n "pbi": "PureBasic",\n "pbt": "PowerBuilder",\n "pcbdoc": "Altium Designer",\n "pck": "PLSQL",\n "pcss": "CSS",\n "pd_lua": "Lua",\n "pddl": "PDDL",\n "pde": "Processing",\n "peggy": "PEG.js",\n "pegjs": "PEG.js",\n "pep": "Pep8",\n "per": "Genero per",\n "perl": "Perl",\n "pfa": "PostScript",\n "pgsql": "PLpgSQL",\n "ph": "Perl",\n "php": "PHP",\n "php3": "PHP",\n "php4": "PHP",\n "php5": "PHP",\n "phps": "PHP",\n "phpt": "PHP",\n "phtml": "HTML",\n "pig": "PigLatin",\n "pike": "Pike",\n "pkb": "PLSQL",\n "pkgproj": "XML",\n "pkl": "Pkl",\n "pks": "PLSQL",\n "pl": "Perl",\n "pl6": "Raku",\n "plantuml": "PlantUML",\n "plb": "PLSQL",\n "plist": "XML",\n "plot": "Gnuplot",\n "pls": "PLSQL",\n "plsql": "PLSQL",\n "plt": "Gnuplot",\n "pluginspec": "Ruby",\n "plx": "Perl",\n "pm": "Perl",\n "pm6": "Raku",\n "pml": "Promela",\n "pmod": "Pike",\n "podsl": "Common Lisp",\n "podspec": "Ruby",\n "pogo": "PogoScript",\n "polar": "Polar",\n "por": "Portugol",\n "postcss": "CSS",\n "pov": "POV-Ray SDL",\n "pp": "Puppet",\n "pprx": "REXX",\n "praat": "Praat",\n "prawn": "Ruby",\n "prc": "PLSQL",\n "prefab": "Unity3D Asset",\n "prefs": "INI",\n "prg": "xBase",\n "prisma": "Prisma",\n "prjpcb": "Altium Designer",\n "pro": "Prolog",\n "proj": "XML",\n "prolog": "Prolog",\n "properties": "Java Properties",\n "props": "XML",\n "prw": "xBase",\n "ps": "PostScript",\n "ps1": "PowerShell",\n "ps1xml": "XML",\n "psc": "Papyrus",\n "psc1": "XML",\n "psd1": "PowerShell",\n "psgi": "Perl",\n "psm1": "PowerShell",\n "pt": "XML",\n "pubxml": "XML",\n "pug": "Pug",\n "puml": "PlantUML",\n "purs": "PureScript",\n "pwn": "Pawn",\n "pxd": "Cython",\n "pxi": "Cython",\n "py": "Python",\n "py3": "Python",\n "pyde": "Python",\n "pyi": "Python",\n "pyp": "Python",\n "pyt": "Python",\n "pytb": "Python",\n "pyw": "Python",\n "pyx": "Cython",\n "q": "HiveQL",\n "qasm": "OpenQASM",\n "qbs": "QML",\n "qc": "QuakeC",\n "qhelp": "XML",\n "ql": "CodeQL",\n "qll": "CodeQL",\n "qmd": "RMarkdown",\n "qml": "QML",\n "qnt": "Quint",\n "qs": "Q#",\n "r": "R",\n "r2": "Rebol",\n "r3": "Rebol",\n "rabl": "Ruby",\n "rake": "Ruby",\n "raku": "Raku",\n "rakumod": "Raku",\n "raml": "RAML",\n "rascript": "RAScript",\n "razor": "HTML",\n "rb": "Ruby",\n "rbi": "Ruby",\n "rbs": "Ruby",\n "rbuild": "Ruby",\n "rbw": "Ruby",\n "rbx": "Ruby",\n "rbxs": "Lua",\n "rchit": "GLSL",\n "rd": "R",\n "rdf": "XML",\n "rdoc": "RDoc",\n "re": "Reason",\n "reb": "Rebol",\n "rebol": "Rebol",\n "red": "Red",\n "reds": "Red",\n "reek": "YAML",\n "reg": "Windows Registry Entries",\n "regex": "Regular Expression",\n "regexp": "Regular Expression",\n "rego": "Open Policy Agent",\n "rei": "Reason",\n "religo": "LigoLANG",\n "res": "ReScript",\n "resi": "ReScript",\n "resource": "RobotFramework",\n "rest": "reStructuredText",\n "rest.txt": "reStructuredText",\n "resx": "XML",\n "rex": "REXX",\n "rexx": "REXX",\n "rg": "Rouge",\n "rhtml": "HTML",\n "ring": "Ring",\n "riot": "Riot",\n "rkt": "Racket",\n "rktd": "Racket",\n "rktl": "Racket",\n "rl": "Ragel",\n "rmd": "RMarkdown",\n "rmiss": "GLSL",\n "rnh": "RUNOFF",\n "rno": "RUNOFF",\n "rnw": "Sweave",\n "robot": "RobotFramework",\n "roc": "Roc",\n "rockspec": "Lua",\n "roff": "Roff",\n "ron": "RON",\n "ronn": "Markdown",\n "rpgle": "RPGLE",\n "rpy": "Ren\'Py",\n "rq": "SPARQL",\n "rs": "Rust",\n "rs.in": "Rust",\n "rsc": "Rascal",\n "rss": "XML",\n "rst": "reStructuredText",\n "rst.txt": "reStructuredText",\n "rsx": "R",\n "ru": "Ruby",\n "ruby": "Ruby",\n "rviz": "YAML",\n "s": "Assembly",\n "sail": "Sail",\n "sarif": "JSON",\n "sas": "SAS",\n "sass": "Sass",\n "sats": "ATS",\n "sbatch": "Shell",\n "sbt": "Scala",\n "sc": "SuperCollider",\n "scad": "OpenSCAD",\n "scala": "Scala",\n "scaml": "Scaml",\n "scd": "SuperCollider",\n "sce": "Scilab",\n "scenic": "Scenic",\n "sch": "Scheme",\n "schdoc": "Altium Designer",\n "sci": "Scilab",\n "scm": "Scheme",\n "sco": "Csound Score",\n "scpt": "AppleScript",\n "scrbl": "Racket",\n "scss": "SCSS",\n "scxml": "XML",\n "sdc": "Tcl",\n "sed": "sed",\n "self": "Self",\n "sexp": "Common Lisp",\n "sfproj": "XML",\n "sfv": "Checksums",\n "sh": "Shell",\n "sh.in": "Shell",\n "shader": "ShaderLab",\n "shen": "Shen",\n "shproj": "XML",\n "sig": "Standard ML",\n "sj": "Objective-J",\n "sjs": "JavaScript",\n "sl": "Slash",\n "slang": "Slang",\n "sld": "Scheme",\n "slim": "Slim",\n "slint": "Slint",\n "slnx": "XML",\n "sls": "SaltStack",\n "slurm": "Shell",\n "sma": "Pawn",\n "smithy": "Smithy",\n "smk": "Python",\n "sml": "Standard ML",\n "snakefile": "Python",\n "snap": "Jest Snapshot",\n "snip": "Vim Snippet",\n "snippet": "Vim Snippet",\n "snippets": "Vim Snippet",\n "sol": "Solidity",\n "soy": "Closure Templates",\n "sp": "SourcePawn",\n "sparql": "SPARQL",\n "spc": "PLSQL",\n "spec": "Python",\n "spin": "Propeller Spin",\n "sps": "Scheme",\n "sqf": "SQF",\n "sql": "SQL",\n "sqlrpgle": "RPGLE",\n "sra": "PowerBuilder",\n "srdf": "XML",\n "srt": "SRecode Template",\n "sru": "PowerBuilder",\n "srv": "ROS Interface",\n "srw": "PowerBuilder",\n "ss": "Scheme",\n "ssjs": "JavaScript",\n "sss": "SugarSS",\n "st": "Smalltalk",\n "stan": "Stan",\n "star": "Starlark",\n "sthlp": "Stata",\n "stl": "STL",\n "story": "Gherkin",\n "storyboard": "XML",\n "sttheme": "XML",\n "sty": "TeX",\n "styl": "Stylus",\n "sublime-build": "JSON",\n "sublime-color-scheme": "JSON",\n "sublime-commands": "JSON",\n "sublime-completions": "JSON",\n "sublime-keymap": "JSON",\n "sublime-macro": "JSON",\n "sublime-menu": "JSON",\n "sublime-mousemap": "JSON",\n "sublime-project": "JSON",\n "sublime-settings": "JSON",\n "sublime-snippet": "XML",\n "sublime-syntax": "YAML",\n "sublime-theme": "JSON",\n "sublime-workspace": "JSON",\n "sublime_metrics": "JSON",\n "sublime_session": "JSON",\n "surql": "SurrealQL",\n "sv": "SystemVerilog",\n "svelte": "Svelte",\n "svg": "SVG",\n "svh": "SystemVerilog",\n "svx": "mdsvex",\n "sw": "Sway",\n "swift": "Swift",\n "syntax": "YAML",\n "t": "Perl",\n "tab": "SQL",\n "tac": "Python",\n "tact": "Tact",\n "tag": "Java",\n "talon": "Talon",\n "targets": "XML",\n "tcc": "C++",\n "tcl": "Tcl",\n "tcl.in": "Tcl",\n "templ": "templ",\n "tesc": "GLSL",\n "tese": "GLSL",\n "tex": "TeX",\n "textgrid": "TextGrid",\n "textile": "Textile",\n "tf": "HCL",\n "tfstate": "JSON",\n "tfstate.backup": "JSON",\n "tftpl": "HCL",\n "tfvars": "HCL",\n "thor": "Ruby",\n "thrift": "Thrift",\n "thy": "Isabelle",\n "tl": "Teal",\n "tla": "TLA",\n "tlv": "TL-Verilog",\n "tm": "Tcl",\n "tmac": "Roff",\n "tmcommand": "XML",\n "tmdl": "TMDL",\n "tml": "XML",\n "tmlanguage": "XML",\n "tmpl": "Go Template",\n "tmpreferences": "XML",\n "tmsnippet": "XML",\n "tmtheme": "XML",\n "tmux": "Shell",\n "toc": "TeX",\n "tofu": "HCL",\n "toit": "Toit",\n "toml": "TOML",\n "toml.example": "TOML",\n "tool": "Shell",\n "topojson": "JSON",\n "tpb": "PLSQL",\n "tpl": "Smarty",\n "tpp": "C++",\n "tps": "PLSQL",\n "tres": "Godot Resource",\n "trg": "PLSQL",\n "trigger": "Apex",\n "ts": "TypeScript",\n "tscn": "Godot Resource",\n "tsconfig.json": "JSON",\n "tsp": "TypeSpec",\n "tst": "GAP",\n "tsv": "TSV",\n "tsx": "TypeScript",\n "tu": "Turing",\n "twig": "Twig",\n "txl": "TXL",\n "txt": "Adblock Filter List",\n "txx": "C++",\n "typ": "Typst",\n "uc": "UnrealScript",\n "udf": "SQL",\n "udo": "Csound",\n "ui": "XML",\n "unity": "Unity3D Asset",\n "uno": "Uno",\n "upc": "C",\n "uplc": "Untyped Plutus Core",\n "ur": "UrWeb",\n "urdf": "XML",\n "url": "INI",\n "urs": "UrWeb",\n "ux": "XML",\n "v": "Verilog",\n "vala": "Vala",\n "vapi": "Vala",\n "vark": "Gosu",\n "vb": "Visual Basic .NET",\n "vba": "VBA",\n "vbhtml": "Visual Basic .NET",\n "vbproj": "XML",\n "vbs": "VBScript",\n "vcf": "vCard",\n "vcl": "VCL",\n "vcxproj": "XML",\n "vdf": "Valve Data Format",\n "veo": "Verilog",\n "vert": "GLSL",\n "vh": "SystemVerilog",\n "vhd": "VHDL",\n "vhdl": "VHDL",\n "vhf": "VHDL",\n "vhi": "VHDL",\n "vho": "VHDL",\n "vhost": "ApacheConf",\n "vhs": "VHDL",\n "vht": "VHDL",\n "vhw": "VHDL",\n "vim": "Vim Script",\n "vimrc": "Vim Script",\n "viw": "SQL",\n "vmb": "Vim Script",\n "volt": "Volt",\n "vrx": "GLSL",\n "vs": "GLSL",\n "vsh": "GLSL",\n "vshader": "GLSL",\n "vsixmanifest": "XML",\n "vssettings": "XML",\n "vstemplate": "XML",\n "vtl": "Velocity Template Language",\n "vto": "Vento",\n "vue": "Vue",\n "vw": "PLSQL",\n "vxml": "XML",\n "vy": "Vyper",\n "w": "CWeb",\n "wast": "WebAssembly",\n "wat": "WebAssembly",\n "watchr": "Ruby",\n "wdl": "WDL",\n "webapp": "JSON",\n "webmanifest": "JSON",\n "wgsl": "WGSL",\n "whiley": "Whiley",\n "wiki": "Wikitext",\n "wikitext": "Wikitext",\n "wisp": "wisp",\n "wit": "WebAssembly Interface Type",\n "wixproj": "XML",\n "wl": "Wolfram Language",\n "wlk": "Wollok",\n "wls": "Wolfram Language",\n "wlt": "Wolfram Language",\n "wlua": "Lua",\n "workbook": "Markdown",\n "workflow": "HCL",\n "wren": "Wren",\n "ws": "Witcher Script",\n "wsdl": "XML",\n "wsf": "XML",\n "wsgi": "Python",\n "wxi": "XML",\n "wxl": "XML",\n "wxs": "XML",\n "x": "DirectX 3D File",\n "x10": "X10",\n "x3d": "XML",\n "x68": "Assembly",\n "xacro": "XML",\n "xaml": "XML",\n "xc": "XC",\n "xdc": "Tcl",\n "xht": "HTML",\n "xhtml": "HTML",\n "xib": "XML",\n "xlf": "XML",\n "xliff": "XML",\n "xmi": "XML",\n "xml": "XML",\n "xml.dist": "XML",\n "xmp": "XML",\n "xojo_code": "Xojo",\n "xojo_menu": "Xojo",\n "xojo_report": "Xojo",\n "xojo_script": "Xojo",\n "xojo_toolbar": "Xojo",\n "xojo_window": "Xojo",\n "xproj": "XML",\n "xpy": "Python",\n "xq": "XQuery",\n "xql": "XQuery",\n "xqm": "XQuery",\n "xquery": "XQuery",\n "xqy": "XQuery",\n "xrl": "Erlang",\n "xsd": "XML",\n "xsh": "Xonsh",\n "xsjs": "JavaScript",\n "xsjslib": "JavaScript",\n "xsl": "XSLT",\n "xslt": "XSLT",\n "xspec": "XML",\n "xtend": "Xtend",\n "xul": "XML",\n "xzap": "ZAP",\n "y": "Yacc",\n "yacc": "Yacc",\n "yaml": "MiniYAML",\n "yaml-tmlanguage": "YAML",\n "yaml.sed": "YAML",\n "yap": "Prolog",\n "yar": "YARA",\n "yara": "YARA",\n "yasnippet": "YASnippet",\n "yml": "YAML",\n "yml.mysql": "YAML",\n "yrl": "Erlang",\n "yul": "Yul",\n "yy": "Yacc",\n "yyp": "JSON",\n "zap": "ZAP",\n "zcml": "XML",\n "zed": "SpiceDB Schema",\n "zep": "Zephir",\n "zig": "Zig",\n "zig.zon": "Zig",\n "zil": "ZIL",\n "zimpl": "Zimpl",\n "zmodel": "Zmodel",\n "zmpl": "Zimpl",\n "zpl": "Zimpl",\n "zs": "ZenScript",\n "zsh": "Shell",\n "zsh-theme": "Shell"\n },\n "filename": {\n ".abbrev_defs": "Emacs Lisp",\n ".ackrc": "Option List",\n ".all-contributorsrc": "JSON",\n ".arcconfig": "JSON",\n ".atomignore": "Ignore List",\n ".auto-changelog": "JSON",\n ".babelignore": "Ignore List",\n ".babelrc": "JSON",\n ".bash_aliases": "Shell",\n ".bash_functions": "Shell",\n ".bash_history": "Shell",\n ".bash_logout": "Shell",\n ".bash_profile": "Shell",\n ".bashrc": "Shell",\n ".browserslistrc": "Browserslist",\n ".buckconfig": "INI",\n ".bzrignore": "Ignore List",\n ".c8rc": "JSON",\n ".clang-format": "YAML",\n ".clang-tidy": "YAML",\n ".clangd": "YAML",\n ".classpath": "XML",\n ".coffeelintignore": "Ignore List",\n ".coveragerc": "INI",\n ".cproject": "XML",\n ".cshrc": "Shell",\n ".cvsignore": "Ignore List",\n ".devcontainer.json": "JSON",\n ".dockerignore": "Ignore List",\n ".easignore": "Ignore List",\n ".editorconfig": "INI",\n ".eleventyignore": "Ignore List",\n ".emacs": "Emacs Lisp",\n ".emacs.desktop": "Emacs Lisp",\n ".env": "Dotenv",\n ".env.ci": "Dotenv",\n ".env.dev": "Dotenv",\n ".env.development": "Dotenv",\n ".env.development.local": "Dotenv",\n ".env.example": "Dotenv",\n ".env.local": "Dotenv",\n ".env.prod": "Dotenv",\n ".env.production": "Dotenv",\n ".env.sample": "Dotenv",\n ".env.staging": "Dotenv",\n ".env.template": "Dotenv",\n ".env.test": "Dotenv",\n ".env.testing": "Dotenv",\n ".envrc": "Shell",\n ".eslintignore": "Ignore List",\n ".eslintrc.json": "JSON",\n ".exrc": "Vim Script",\n ".factor-boot-rc": "Factor",\n ".factor-rc": "Factor",\n ".flake8": "INI",\n ".flaskenv": "Shell",\n ".gclient": "Python",\n ".gemrc": "YAML",\n ".git-blame-ignore-revs": "Git Revision List",\n ".gitattributes": "Git Attributes",\n ".gitconfig": "INI",\n ".gitignore": "Ignore List",\n ".gitmodules": "INI",\n ".gnus": "Emacs Lisp",\n ".gvimrc": "Vim Script",\n ".htaccess": "ApacheConf",\n ".htmlhintrc": "JSON",\n ".ignore": "Ignore List",\n ".imgbotconfig": "JSON",\n ".irbrc": "Ruby",\n ".jscsrc": "JSON",\n ".jshintrc": "JSON",\n ".jslintrc": "JSON",\n ".justfile": "Just",\n ".kshrc": "Shell",\n ".latexmkrc": "Perl",\n ".login": "Shell",\n ".luacheckrc": "Lua",\n ".markdownlintignore": "Ignore List",\n ".nanorc": "INI",\n ".nodemonignore": "Ignore List",\n ".npmignore": "Ignore List",\n ".npmrc": "INI",\n ".nvimrc": "Vim Script",\n ".nycrc": "JSON",\n ".oxlintrc.json": "JSON",\n ".php": "PHP",\n ".php_cs": "PHP",\n ".php_cs.dist": "PHP",\n ".prettierignore": "Ignore List",\n ".profile": "Shell",\n ".project": "XML",\n ".pryrc": "Ruby",\n ".pylintrc": "INI",\n ".rprofile": "R",\n ".rspec": "Option List",\n ".scalafix.conf": "HOCON",\n ".scalafmt.conf": "HOCON",\n ".shellcheckrc": "ShellCheck Config",\n ".simplecov": "Ruby",\n ".spacemacs": "Emacs Lisp",\n ".stylelintignore": "Ignore List",\n ".swcrc": "JSON",\n ".tern-config": "JSON",\n ".tern-project": "JSON",\n ".tm_properties": "TextMate Properties",\n ".tmux.conf": "Shell",\n ".vercelignore": "Ignore List",\n ".vimrc": "Vim Script",\n ".viper": "Emacs Lisp",\n ".vscodeignore": "Ignore List",\n ".watchmanconfig": "JSON",\n ".xinitrc": "Shell",\n ".xsession": "Shell",\n ".yardopts": "Option List",\n ".zlogin": "Shell",\n ".zlogout": "Shell",\n ".zprofile": "Shell",\n ".zshenv": "Shell",\n ".zshrc": "Shell",\n "9fs": "Shell",\n "_emacs": "Emacs Lisp",\n "_helpers.tpl": "Go Template",\n "_vimrc": "Vim Script",\n "abbrev_defs": "Emacs Lisp",\n "ack": "Perl",\n "ackrc": "Option List",\n "ant.xml": "Ant Build System",\n "apache2.conf": "ApacheConf",\n "api-extractor.json": "JSON",\n "apkbuild": "Shell",\n "app.config": "XML",\n "appraisals": "Ruby",\n "bash_aliases": "Shell",\n "bash_logout": "Shell",\n "bash_profile": "Shell",\n "bashrc": "Shell",\n "berksfile": "Ruby",\n "brewfile": "Ruby",\n "browserslist": "Browserslist",\n "bsdmakefile": "Makefile",\n "buck": "Starlark",\n "build": "Starlark",\n "build.bazel": "Starlark",\n "build.xml": "Ant Build System",\n "buildfile": "Ruby",\n "buildozer.spec": "INI",\n "bun.lock": "JSON",\n "cabal.config": "Cabal Config",\n "cabal.project": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cakefile": "CoffeeScript",\n "capfile": "Ruby",\n "cargo.lock": "TOML",\n "cargo.toml.orig": "TOML",\n "cask": "Emacs Lisp",\n "citation.cff": "YAML",\n "cmakelists.txt": "CMake",\n "commit_editmsg": "Git Commit",\n "composer.lock": "JSON",\n "containerfile": "Dockerfile",\n "contents.lr": "Markdown",\n "cpanfile": "Perl",\n "crontab": "crontab",\n "cshrc": "Shell",\n "dangerfile": "Ruby",\n "deliverfile": "Ruby",\n "deno.lock": "JSON",\n "deps": "Python",\n "dev-requirements.txt": "Pip Requirements",\n "devcontainer.json": "JSON",\n "dockerfile": "Dockerfile",\n "dune-project": "Dune",\n "earthfile": "Earthly",\n "eask": "Emacs Lisp",\n "emakefile": "Erlang",\n "eqnrc": "Roff",\n "expr-dist": "R",\n "fakefile": "Fancy",\n "fastfile": "Ruby",\n "firestore.rules": "Cloud Firestore Security Rules",\n "flake.lock": "JSON",\n "fp-lib-table": "KiCad Layout",\n "gemfile": "Ruby",\n "gemfile.lock": "Gemfile.lock",\n "gitignore-global": "Ignore List",\n "gitignore_global": "Ignore List",\n "glide.lock": "YAML",\n "gnumakefile": "Makefile",\n "go.mod": "Go Module",\n "go.sum": "Go Checksums",\n "go.work": "Go Workspace",\n "go.work.sum": "Go Checksums",\n "gopkg.lock": "TOML",\n "gradlew": "Shell",\n "gradlew.bat": "Batchfile",\n "guardfile": "Ruby",\n "gvimrc": "Vim Script",\n "haproxy.cfg": "HAProxy",\n "hosts": "Hosts File",\n "hosts.txt": "Hosts File",\n "httpd.conf": "ApacheConf",\n "installscript.qs": "Qt Script",\n "jakefile": "JavaScript",\n "jarfile": "Ruby",\n "jenkinsfile": "Groovy",\n "jsconfig.json": "JSON",\n "justfile": "Just",\n "kakrc": "KakouneScript",\n "kbuild": "Makefile",\n "kcl.mod": "KCL",\n "kcl.mod.lock": "KCL",\n "kshrc": "Shell",\n "language-configuration.json": "JSON",\n "language-subtag-registry.txt": "Record Jar",\n "latexmkrc": "Perl",\n "lexer.x": "Lex",\n "login": "Shell",\n "m3makefile": "Quake",\n "m3overrides": "Quake",\n "makefile": "Makefile",\n "makefile.am": "Makefile",\n "makefile.boot": "Makefile",\n "makefile.frag": "Makefile",\n "makefile.in": "Makefile",\n "makefile.inc": "Makefile",\n "makefile.pl": "Perl",\n "makefile.sco": "Makefile",\n "makefile.wat": "Makefile",\n "man": "Shell",\n "manifest.mf": "JAR Manifest",\n "mavenfile": "Ruby",\n "mcmod.info": "JSON",\n "meson.build": "Meson",\n "meson_options.txt": "Meson",\n "mise.local.lock": "TOML",\n "mise.lock": "TOML",\n "mix.lock": "Elixir",\n "mkfile": "Makefile",\n "mmn": "Roff",\n "mmt": "Roff",\n "mocha.opts": "Option List",\n "module.bazel": "Starlark",\n "module.bazel.lock": "JSON",\n "modulefile": "Puppet",\n "mvnw": "Shell",\n "mvnw.cmd": "Batchfile",\n "nanorc": "INI",\n "nextflow.config": "Nextflow",\n "nginx.conf": "Nginx",\n "nim.cfg": "Nim",\n "notebook": "Jupyter Notebook",\n "nuget.config": "XML",\n "nukefile": "Nu",\n "nvimrc": "Vim Script",\n "owh": "Tcl",\n "package.resolved": "JSON",\n "packages.config": "XML",\n "pdm.lock": "TOML",\n "phakefile": "PHP",\n "pipfile": "TOML",\n "pipfile.lock": "JSON",\n "pixi.lock": "YAML",\n "pkgbuild": "Shell",\n "podfile": "Ruby",\n "poetry.lock": "TOML",\n "procfile": "Procfile",\n "profile": "Shell",\n "project.ede": "Emacs Lisp",\n "project.godot": "Godot Resource",\n "puppetfile": "Ruby",\n "pylintrc": "INI",\n "rakefile": "Ruby",\n "rebar.config": "Erlang",\n "rebar.config.lock": "Erlang",\n "rebar.lock": "Erlang",\n "requirements-dev.txt": "Pip Requirements",\n "requirements.lock.txt": "Pip Requirements",\n "requirements.txt": "Pip Requirements",\n "rexfile": "Perl",\n "riemann.config": "Clojure",\n "root": "Isabelle",\n "sconscript": "Python",\n "sconstruct": "Python",\n "settings.stylecop": "XML",\n "singularity": "Singularity",\n "slakefile": "LiveScript",\n "snakefile": "Python",\n "snapfile": "Ruby",\n "starfield": "Tcl",\n "steepfile": "Ruby",\n "suite.rc": "INI",\n "thorfile": "Ruby",\n "tiltfile": "Starlark",\n "tmux.conf": "Shell",\n "toolchain_installscript.qs": "Qt Script",\n "torrc": "Tor Config",\n "troffrc": "Roff",\n "troffrc-end": "Roff",\n "tsconfig.json": "JSON",\n "tslint.json": "JSON",\n "uv.lock": "TOML",\n "vagrantfile": "Ruby",\n "vimrc": "Vim Script",\n "vlcrc": "INI",\n "web.config": "XML",\n "web.debug.config": "XML",\n "web.release.config": "XML",\n "workspace": "Starlark",\n "workspace.bazel": "Starlark",\n "workspace.bzlmod": "Starlark",\n "wscript": "Python",\n "xinitrc": "Shell",\n "xmake.lua": "Xmake",\n "xsession": "Shell",\n "yarn.lock": "YAML",\n "zlogin": "Shell",\n "zlogout": "Shell",\n "zprofile": "Shell",\n "zshenv": "Shell",\n "zshrc": "Shell"\n }\n },\n "vendor": [\n "(^|/)cache/",\n "^[Dd]ependencies/",\n "(^|/)dist/",\n "^deps/",\n "(^|/)configure$",\n "(^|/)config\\\\.guess$",\n "(^|/)config\\\\.sub$",\n "(^|/)aclocal\\\\.m4",\n "(^|/)libtool\\\\.m4",\n "(^|/)ltoptions\\\\.m4",\n "(^|/)ltsugar\\\\.m4",\n "(^|/)ltversion\\\\.m4",\n "(^|/)lt~obsolete\\\\.m4",\n "(^|/)dotnet-install\\\\.(ps1|sh)$",\n "(^|/)cpplint\\\\.py",\n "(^|/)node_modules/",\n "(^|/)\\\\.yarn/releases/",\n "(^|/)\\\\.yarn/plugins/",\n "(^|/)\\\\.yarn/sdks/",\n "(^|/)\\\\.yarn/versions/",\n "(^|/)\\\\.yarn/unplugged/",\n "(^|/)_esy$",\n "(^|/)bower_components/",\n "^rebar$",\n "(^|/)erlang\\\\.mk",\n "(^|/)Godeps/_workspace/",\n "(^|/)testdata/",\n "(^|/)\\\\.indent\\\\.pro",\n "(\\\\.|-)min\\\\.(js|css)$",\n "([^\\\\s]*)import\\\\.(css|less|scss|styl)$",\n "(^|/)bootstrap([^/.]*)(\\\\..*)?\\\\.(js|css|less|scss|styl)$",\n "(^|/)custom\\\\.bootstrap([^\\\\s]*)(js|css|less|scss|styl)$",\n "(^|/)font-?awesome\\\\.(css|less|scss|styl)$",\n "(^|/)font-?awesome/.*\\\\.(css|less|scss|styl)$",\n "(^|/)foundation\\\\.(css|less|scss|styl)$",\n "(^|/)normalize\\\\.(css|less|scss|styl)$",\n "(^|/)skeleton\\\\.(css|less|scss|styl)$",\n "(^|/)[Bb]ourbon/.*\\\\.(css|less|scss|styl)$",\n "(^|/)animate\\\\.(css|less|scss|styl)$",\n "(^|/)materialize\\\\.(css|less|scss|styl|js)$",\n "(^|/)select2/.*\\\\.(css|scss|js)$",\n "(^|/)bulma\\\\.(css|sass|scss)$",\n "(3rd|[Tt]hird)[-_]?[Pp]arty/",\n "(^|/)vendors?/",\n "(^|/)[Ee]xtern(als?)?/",\n "(^|/)[Vv]+endor/",\n "^debian/",\n "(^|/)run\\\\.n$",\n "(^|/)bootstrap-datepicker/",\n "(^|/)jquery([^.]*)\\\\.js$",\n "(^|/)jquery\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)jquery\\\\-ui(\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?)?(\\\\.\\\\w+)?\\\\.(js|css)$",\n "(^|/)jquery\\\\.(ui|effects)\\\\.([^.]*)\\\\.(js|css)$",\n "(^|/)jquery\\\\.fn\\\\.gantt\\\\.js",\n "(^|/)jquery\\\\.fancybox\\\\.(js|css)",\n "(^|/)fuelux\\\\.js",\n "(^|/)jquery\\\\.fileupload(-\\\\w+)?\\\\.js$",\n "(^|/)jquery\\\\.dataTables\\\\.js",\n "(^|/)bootbox\\\\.js",\n "(^|/)pdf\\\\.worker\\\\.js",\n "(^|/)slick\\\\.\\\\w+.js$",\n "(^|/)Leaflet\\\\.Coordinates-\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.src\\\\.js$",\n "(^|/)leaflet\\\\.draw-src\\\\.js",\n "(^|/)leaflet\\\\.draw\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.js",\n "(^|/)leaflet\\\\.spin\\\\.js",\n "(^|/)wicket-leaflet\\\\.js",\n "(^|/)\\\\.sublime-project",\n "(^|/)\\\\.sublime-workspace",\n "(^|/)\\\\.vscode/",\n "(^|/)prototype(.*)\\\\.js$",\n "(^|/)effects\\\\.js$",\n "(^|/)controls\\\\.js$",\n "(^|/)dragdrop\\\\.js$",\n "(.*?)\\\\.d\\\\.ts$",\n "(^|/)mootools([^.]*)\\\\d+\\\\.\\\\d+.\\\\d+([^.]*)\\\\.js$",\n "(^|/)dojo\\\\.js$",\n "(^|/)MochiKit\\\\.js$",\n "(^|/)yahoo-([^.]*)\\\\.js$",\n "(^|/)yui([^.]*)\\\\.js$",\n "(^|/)ckeditor\\\\.js$",\n "(^|/)tiny_mce([^.]*)\\\\.js$",\n "(^|/)tiny_mce/(langs|plugins|themes|utils)",\n "(^|/)ace-builds/",\n "(^|/)fontello(.*?)\\\\.css$",\n "(^|/)MathJax/",\n "(^|/)Chart\\\\.js$",\n "(^|/)[Cc]ode[Mm]irror/(\\\\d+\\\\.\\\\d+/)?(lib|mode|theme|addon|keymap|demo)",\n "(^|/)shBrush([^.]*)\\\\.js$",\n "(^|/)shCore\\\\.js$",\n "(^|/)shLegacy\\\\.js$",\n "(^|/)angular([^.]*)\\\\.js$",\n "(^|\\\\/)d3(\\\\.v\\\\d+)?([^.]*)\\\\.js$",\n "(^|/)react(-[^.]*)?\\\\.js$",\n "(^|/)flow-typed/.*\\\\.js$",\n "(^|/)modernizr\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)modernizr\\\\.custom\\\\.\\\\d+\\\\.js$",\n "(^|/)knockout-(\\\\d+\\\\.){3}(debug\\\\.)?js$",\n "(^|/)docs?/_?(build|themes?|templates?|static)/",\n "(^|/)admin_media/",\n "(^|/)env/",\n "(^|/)fabfile\\\\.py$",\n "(^|/)waf$",\n "(^|/)\\\\.osx$",\n "\\\\.xctemplate/",\n "\\\\.imageset/",\n "(^|/)Carthage/",\n "(^|/)Sparkle/",\n "(^|/)Crashlytics\\\\.framework/",\n "(^|/)Fabric\\\\.framework/",\n "(^|/)BuddyBuildSDK\\\\.framework/",\n "(^|/)Realm\\\\.framework",\n "(^|/)RealmSwift\\\\.framework",\n "(^|/)\\\\.gitattributes$",\n "(^|/)\\\\.gitignore$",\n "(^|/)\\\\.gitmodules$",\n "(^|/)gradlew$",\n "(^|/)gradlew\\\\.bat$",\n "(^|/)gradle/wrapper/",\n "(^|/)mvnw$",\n "(^|/)mvnw\\\\.cmd$",\n "(^|/)\\\\.mvn/wrapper/",\n "-vsdoc\\\\.js$",\n "\\\\.intellisense\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.validate(\\\\.unobtrusive)?\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.unobtrusive\\\\-ajax\\\\.js$",\n "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\\\.debug)?\\\\.js$",\n "(^|/)[Pp]ackages\\\\/.+\\\\.\\\\d+\\\\/",\n "(^|/)extjs/.*?\\\\.js$",\n "(^|/)extjs/.*?\\\\.xml$",\n "(^|/)extjs/.*?\\\\.txt$",\n "(^|/)extjs/.*?\\\\.html$",\n "(^|/)extjs/.*?\\\\.properties$",\n "(^|/)extjs/\\\\.sencha/",\n "(^|/)extjs/docs/",\n "(^|/)extjs/builds/",\n "(^|/)extjs/cmd/",\n "(^|/)extjs/examples/",\n "(^|/)extjs/locale/",\n "(^|/)extjs/packages/",\n "(^|/)extjs/plugins/",\n "(^|/)extjs/resources/",\n "(^|/)extjs/src/",\n "(^|/)extjs/welcome/",\n "(^|/)html5shiv\\\\.js$",\n "(^|/)[Tt]ests?/fixtures/",\n "(^|/)[Ss]pecs?/fixtures/",\n "(^|/)cordova([^.]*)\\\\.js$",\n "(^|/)cordova\\\\-\\\\d\\\\.\\\\d(\\\\.\\\\d)?\\\\.js$",\n "(^|/)foundation(\\\\..*)?\\\\.js$",\n "(^|/)Vagrantfile$",\n "(^|/)\\\\.[Dd][Ss]_[Ss]tore$",\n "(^|/)inst/extdata/",\n "(^|/)octicons\\\\.css",\n "(^|/)sprockets-octicons\\\\.scss",\n "(^|/)activator$",\n "(^|/)activator\\\\.bat$",\n "(^|/)proguard\\\\.pro$",\n "(^|/)proguard-rules\\\\.pro$",\n "(^|/)puphpet/",\n "(^|/)\\\\.google_apis/",\n "(^|/)Jenkinsfile$",\n "(^|/)\\\\.gitpod\\\\.Dockerfile$",\n "(^|/)\\\\.github/",\n "(^|/)\\\\.obsidian/",\n "(^|/)\\\\.teamcity/",\n "(^|/)xvba_modules/"\n ]\n}' +OTHER_LANG = "Other" +OTHER_COLOR = "#8b949e" + + +def _load_techdata(): + raw = TECHDATA + if raw == "__TECHDATA_PLACEHOLDER__": + sibling = Path(__file__).resolve().parent / "techdata.json" + if not sibling.exists(): + return {} + try: + return json.loads(sibling.read_text()) + except (json.JSONDecodeError, OSError): + return {} + try: + return json.loads(raw) + except (json.JSONDecodeError, ValueError): + return {} + + +_TECH = _load_techdata() +_LANG = _TECH.get("lang", {}) +EXT_LANG = _LANG.get("ext", {}) # extension (no dot, lower) -> language +FILENAME_LANG = _LANG.get("filename", {}) # lowercased filename -> language +NAME_COLOR = _LANG.get("color", {}) # language -> hex color +FW_DEPS = _TECH.get("fw_deps", {}) # {ecosystem: {dependency: framework}} +FW_SENTINELS_JS = _TECH.get("fw_sentinels_js", []) # [[basename, framework]] +FW_SENTINELS_OTHER = _TECH.get("fw_sentinels_other", []) # [[path, framework, lang]] + + +def _compile_vendor(patterns): + """One matcher from Linguist's vendor.yml regexes; skips Python-incompatible + ones (they're Ruby-flavored) so the union still compiles.""" + good = [] + for p in patterns: + try: + re.compile(p) + good.append(p) + except re.error: + continue + try: + return re.compile("|".join(f"(?:{p})" for p in good)) if good else None + except re.error: + return None + + +_VENDOR_RE = _compile_vendor(_TECH.get("vendor", [])) + +# Lockfiles Linguist classifies as *generated* (handled in code, not vendor.yml) +# — kept as a small supplement so they don't dominate the language bar. +NOISE_BASENAMES = frozenset({ + "package-lock.json", "yarn.lock", "pnpm-lock.yaml", "npm-shrinkwrap.json", + "composer.lock", "cargo.lock", "gemfile.lock", "poetry.lock", "go.sum", + "pdm.lock", "uv.lock", "flake.lock", +}) + + +def numstat_newpath(field): + """Resolve a numstat path column to the post-rename path. + + Renames render as `old => new`, or with a shared brace group like + `src/{old => new}/file.js`; plain paths pass through unchanged. + """ + if " => " not in field: + return field + lo = field.find("{") + hi = field.find("}", lo) if lo != -1 else -1 + if lo != -1 and hi != -1 and " => " in field[lo:hi]: + new = field[lo + 1:hi].split(" => ", 1)[1] + return field[:lo] + new + field[hi + 1:] + return field.split(" => ", 1)[1] + + +def classify_path(field): + """Map a numstat path column to a language name, or None to exclude it.""" + path = numstat_newpath(field.strip().strip('"')).replace("\\", "/") + if _VENDOR_RE and _VENDOR_RE.search(path): # Linguist vendored paths + return None + base = path.rsplit("/", 1)[-1].lower() + if base in NOISE_BASENAMES: + return None + if base.endswith((".min.js", ".min.css", ".map")): + return None + if base in FILENAME_LANG: # Dockerfile, Makefile, Rakefile, … + return FILENAME_LANG[base] + dot = base.rfind(".") + if dot <= 0: # no extension, or a dotfile like ".gitignore" + return OTHER_LANG + return EXT_LANG.get(base[dot + 1:], OTHER_LANG) + + +def top_languages(langs, limit=6): + """Build a sorted language-bar list from {name: [added, deleted, files]}. + + Ranks by lines touched (added + deleted); languages past `limit` collapse + into a single grey "Other" segment. Returns [] when nothing qualifies. + """ + items = [(name, a + d, files) for name, (a, d, files) in langs.items()] + total = sum(lines for _, lines, _ in items) + if total <= 0: + return [] + items.sort(key=lambda x: x[1], reverse=True) + out = [ + { + "name": name, + "lines": lines, + "files": files, + "pct": round(lines * 100 / total, 1), + "color": NAME_COLOR.get(name, OTHER_COLOR), + } + for name, lines, files in items[:limit] + ] + overflow = sum(lines for _, lines, _ in items[limit:]) + if overflow > 0: + existing = next((o for o in out if o["name"] == OTHER_LANG), None) + if existing: + existing["lines"] += overflow + existing["pct"] = round(existing["lines"] * 100 / total, 1) + else: + out.append({ + "name": OTHER_LANG, + "lines": overflow, + "files": 0, + "pct": round(overflow * 100 / total, 1), + "color": OTHER_COLOR, + }) + return out + + def git(*args, cwd=None): return subprocess.check_output(["git", *args], text=True, cwd=cwd) +def _git_show(path, cwd=None): + """Contents of `path` at HEAD, or "" if missing. Works on bare clones.""" + try: + return git("show", f"HEAD:{path}", cwd=cwd) + except subprocess.CalledProcessError: + return "" + + +def detect_frameworks(cwd=None): + """Detect frameworks at HEAD from a local repo / bare clone. + + Returns a list grouped by language, ordered by framework count: + [{"language": "TypeScript", "color": "#3178c6", "names": [...]}, ...] + Best-effort and local-only — the GraphQL remote path skips this. + """ + try: + tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) + except subprocess.CalledProcessError: + return [] + return _frameworks_from_files( + [p for p in tree.splitlines() if p], lambda p: _git_show(p, cwd) + ) + + +def _frameworks_from_files(paths, read_file): + """Core framework detection over a file list, driven by techdata maps. + + `paths`: repo-relative paths that exist. `read_file(path)` -> contents + ("" if unavailable; only called for manifests worth parsing). Decoupled + from git so the remote path can supply GraphQL-fetched blobs. + """ + if not FW_DEPS: + return [] + paths = set(paths) + by_base = defaultdict(list) + for p in paths: + by_base[p.rsplit("/", 1)[-1].lower()].append(p) + + found = defaultdict(list) + seen = defaultdict(set) + + def add(language, name): + if name and name not in seen[language]: + seen[language].add(name) + found[language].append(name) + + def present(dep, text): + return re.search(r"(?= 3: + lang = classify_path(cols[2]) + if lang: + rec = lang_stats.setdefault(cur, {}).setdefault(lang, [0, 0, 0]) + rec[0] += added + rec[1] += deleted + rec[2] += 1 default_branch = detect_default_branch(cwd=cwd) + extras = {"lang_stats": lang_stats, "frameworks": detect_frameworks(cwd=cwd)} return ( repo_name, github_base, @@ -476,6 +755,7 @@ def collect_local(cwd=None, suppress_current_user=False): default_branch, repo_disk_kb(cwd=cwd), collect_local_tags(cwd=cwd), + extras, ) @@ -748,6 +1028,100 @@ query($owner: String!, $repo: String!, $cursor: String) { return tags +def gh_rest_get(path, token): + """GET an api.github.com REST endpoint; returns the parsed JSON body.""" + req = urllib.request.Request( + f"https://api.github.com{path}", + headers={ + "Authorization": f"bearer {token}", + "User-Agent": "repo-intel", + "Accept": "application/vnd.github+json", + }, + ) + with urllib.request.urlopen(req) as resp: + return json.loads(resp.read()) + + +# Manifests _frameworks_from_files actually parses (so we only fetch those +# blobs). tsconfig.json / sentinels are presence-only — covered by the tree. +_REMOTE_MANIFEST_BASES = frozenset({ + "package.json", "composer.json", "pyproject.toml", "pipfile", + "setup.py", "setup.cfg", "gemfile", "go.mod", "cargo.toml", +}) + + +def _remote_manifest_paths(paths): + out = [] + for p in paths: + base = p.rsplit("/", 1)[-1].lower() + if base in _REMOTE_MANIFEST_BASES or ( + base.startswith("requirements") and base.endswith(".txt") + ): + out.append(p) + return out + + +def fetch_blob_texts(owner, repo, paths, token): + """HEAD blob text for each path via aliased GraphQL. Returns {path: text}.""" + out = {} + paths = list(paths) + for start in range(0, len(paths), 50): + chunk = paths[start:start + 50] + var_decls = ", ".join(f"$p{i}: String!" for i in range(len(chunk))) + frags = " ".join( + f"b{i}: object(expression: $p{i}) {{ ... on Blob {{ text }} }}" + for i in range(len(chunk)) + ) + query = ( + f"query($owner: String!, $repo: String!, {var_decls}) " + f"{{ repository(owner: $owner, name: $repo) {{ {frags} }} }}" + ) + variables = {"owner": owner, "repo": repo} + for i, p in enumerate(chunk): + variables[f"p{i}"] = f"HEAD:{p}" + try: + body = gh_graphql(query, variables, token) + except urllib.error.URLError as exc: + print(f" warning: manifest fetch failed: {exc}", file=sys.stderr) + continue + node = gh_repository(body) + for i, p in enumerate(chunk): + blob = node.get(f"b{i}") + if blob and blob.get("text") is not None: + out[p] = blob["text"] + return out + + +def fetch_frameworks_remote(owner, repo, token): + """Detect frameworks on the GraphQL path without a clone. + + Lists the repo tree (REST, recursive — manifests can be nested) and fetches + just the manifest blobs (GraphQL), then runs the shared detection core. + Per-file *languages* stay local-only (too expensive over the network), but + manifests are cheap, so frameworks work here too. + """ + if not token: + return [] + try: + tree = gh_rest_get(f"/repos/{owner}/{repo}/git/trees/HEAD?recursive=1", token) + except urllib.error.URLError as exc: + print(f" warning: framework tree fetch failed: {exc}", file=sys.stderr) + return [] + if tree.get("truncated"): + # GitHub caps the recursive tree at ~100k entries / 7MB; deep manifests + # past the cap are dropped, so detection may miss frameworks silently. + print( + " warning: repo tree truncated by GitHub — framework detection " + "may be incomplete", + file=sys.stderr, + ) + paths = [e["path"] for e in (tree.get("tree") or []) if e.get("type") == "blob"] + if not paths: + return [] + contents = fetch_blob_texts(owner, repo, _remote_manifest_paths(paths), token) + return _frameworks_from_files(paths, lambda p: contents.get(p, "")) + + def _paginate_history(fetch_page, cached_oids, last_n, since, have_count_baseline, label, skip_first=False): """Walk a Commit.history connection page by page. @@ -810,6 +1184,7 @@ def collect_remote(slug, token, no_cache=False, commits_filter=None, since=None, default_branch, repo_size_kb, tags, + extras, ) = collect_local(cwd=clone_dir, suppress_current_user=True) if not github_base: github_base = f"https://github.com/{owner}/{repo}" @@ -824,6 +1199,7 @@ def collect_remote(slug, token, no_cache=False, commits_filter=None, since=None, default_branch, repo_size_kb, tags, + extras, ) history_block = """ @@ -997,6 +1373,9 @@ query($owner: String!, $repo: String!, $oid: GitObjectID!, $cursor: String, $pag logins[email] = user["login"] tags = fetch_remote_tags(owner, repo, token) + # Per-file languages need a clone, but manifests are cheap to fetch — so + # frameworks work on the GraphQL path; lang_stats stays empty here. + frameworks = fetch_frameworks_remote(owner, repo, token) return ( repo_name, repo_url, @@ -1008,6 +1387,7 @@ query($owner: String!, $repo: String!, $oid: GitObjectID!, $cursor: String, $pag default_branch, repo_size_kb, tags, + {"lang_stats": {}, "frameworks": frameworks}, ) @@ -1060,7 +1440,11 @@ def build_data( default_branch, repo_size_kb, tags, + extras, ): + lang_stats = (extras or {}).get("lang_stats", {}) + frameworks = (extras or {}).get("frameworks", []) + repo_langs = {} authors = {} daily_by_author = defaultdict(lambda: defaultdict(int)) hourly_by_author = defaultdict(lambda: [0] * 24) @@ -1095,6 +1479,7 @@ def build_data( "deleted": 0, "dates": set(), "daily_counts": defaultdict(int), + "langs": {}, "first": d_key, "last": d_key, }, @@ -1104,6 +1489,15 @@ def build_data( rec["deleted"] += d rec["dates"].add(d_key) rec["daily_counts"][d_key] += 1 + for lang, (la, ld, lf) in lang_stats.get(h, {}).items(): + agg = rec["langs"].setdefault(lang, [0, 0, 0]) + agg[0] += la + agg[1] += ld + agg[2] += lf + repo = repo_langs.setdefault(lang, [0, 0, 0]) + repo[0] += la + repo[1] += ld + repo[2] += lf if d_key < rec["first"]: rec["first"] = d_key if d_key > rec["last"]: @@ -1143,6 +1537,7 @@ def build_data( "busiestCount": busiest_count, "avatarUrl": avatar_url(r["email"], override=avatars.get(r["email"])), "highlight": bool(current_email) and r["email"] == current_email, + "languages": top_languages(r["langs"]), } ) @@ -1160,16 +1555,23 @@ def build_data( if meta["email"] not in top_emails: continue a, d = line_stats.get(h, [0, 0]) - commits_list.append( - { - "h": h[:7], - "s": (meta["subject"] or "")[:120], - "e": meta["email"], - "d": meta.get("iso") or "", - "a": a, - "l": d, - } - ) + entry = { + "h": h[:7], + "s": (meta["subject"] or "")[:120], + "e": meta["email"], + "d": meta.get("iso") or "", + "a": a, + "l": d, + } + cl = lang_stats.get(h) + if cl: + ftypes = sorted( + ([name, NAME_COLOR.get(name, OTHER_COLOR), files] + for name, (_, _, files) in cl.items()), + key=lambda x: x[2], reverse=True, + ) + entry["f"] = ftypes[:4] + commits_list.append(entry) date_range = ( {"start": min(all_dates), "end": max(all_dates)} @@ -1196,6 +1598,8 @@ def build_data( "dowData": dow_data, "commits": commits_list, "tags": tags or [], + "repoLanguages": top_languages(repo_langs), + "frameworks": frameworks or [], } @@ -1290,6 +1694,7 @@ def main(): default_branch, repo_size_kb, tags, + extras, ) = collect_remote( remote, token, @@ -1318,6 +1723,7 @@ def main(): default_branch, repo_size_kb, tags, + extras, ) = collect_local() if not commits_meta: @@ -1348,6 +1754,7 @@ def main(): default_branch, repo_size_kb, tags, + extras, ) enrich_contributor_profiles(data["contributors"], commits_meta, github_base, token=token) From 30542f8ad6c47a966278455e51fd24a91698aefe Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 19:31:09 +0100 Subject: [PATCH 02/14] Improve repo-intel language detection and Technologies layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Count only files present at HEAD, so churn against deleted files (e.g. vendored bash_completion.d scripts) no longer inflates "Other" - Detect extensionless scripts by shebang (bin/* → Shell, repo-intel → Python) - Surface Docker/Make as detected tools; rename the section to "Frameworks & tools" and give the Tools group a distinct color - Link each language in the bar to GitHub code search for the repo - Tighten framework row spacing; move Technologies above Summary --- src/repo-intel/gen_techdata.py | 15 +++++ src/repo-intel/repo-intel.py | 103 +++++++++++++++++++++++++++++-- src/repo-intel/techdata.json | 36 +++++++++++ src/repo-intel/template.html | 42 +++++++++---- stow/bin/repo-intel | 107 ++++++++++++++++++++++++++++++--- 5 files changed, 276 insertions(+), 27 deletions(-) diff --git a/src/repo-intel/gen_techdata.py b/src/repo-intel/gen_techdata.py index e9567a7..c3c3788 100644 --- a/src/repo-intel/gen_techdata.py +++ b/src/repo-intel/gen_techdata.py @@ -116,11 +116,25 @@ }, } +# Colors for synthetic framework groups Linguist doesn't define a language for. +# Purple keeps "Tools" distinct from the grey "Other" bucket on the same page. +SYNTHETIC_COLORS = {"Tools": "#a371f7"} + # Backend / non-JS sentinel files: basename (or sub-path) → (framework, language). +# The "Tools" bucket surfaces build/devops tooling that's present as a config +# file rather than a dependency — it'd otherwise hide in the long tail of the +# language bar (Dockerfile/Makefile are tiny by line count). CURATED_SENTINELS = [ ["manage.py", "Django", "Python"], ["artisan", "Laravel", "PHP"], ["config/application.rb", "Rails", "Ruby"], + ["Dockerfile", "Docker", "Tools"], + ["docker-compose.yml", "Docker Compose", "Tools"], + ["docker-compose.yaml", "Docker Compose", "Tools"], + ["compose.yml", "Docker Compose", "Tools"], + ["compose.yaml", "Docker Compose", "Tools"], + ["Makefile", "Make", "Tools"], + ["GNUmakefile", "Make", "Tools"], ] @@ -207,6 +221,7 @@ def build_language_tables(langs): for ext, lang in EXT_OVERRIDE.items(): if lang in name_color: ext_lang[ext] = lang + name_color.update(SYNTHETIC_COLORS) # synthetic buckets Linguist doesn't color return name_color, ext_lang, filename_lang diff --git a/src/repo-intel/repo-intel.py b/src/repo-intel/repo-intel.py index 93727ba..46eb139 100755 --- a/src/repo-intel/repo-intel.py +++ b/src/repo-intel/repo-intel.py @@ -338,6 +338,36 @@ def _compile_vendor(patterns): "pdm.lock", "uv.lock", "flake.lock", }) +# Shebang interpreter → language, for extensionless scripts Linguist can't name +# from a path alone (e.g. `bin/deploy` with `#!/usr/bin/env bash`). A small +# curated map mirroring Linguist's `interpreters:`; trailing version digits are +# stripped (`python3` → `python`) before lookup. Names must be real Linguist +# languages so they pick up a color. +SHEBANG_LANG = { + "sh": "Shell", "bash": "Shell", "zsh": "Shell", "dash": "Shell", + "ksh": "Shell", "fish": "fish", "python": "Python", "ruby": "Ruby", + "node": "JavaScript", "perl": "Perl", "awk": "Awk", "gawk": "Awk", + "lua": "Lua", "php": "PHP", "rscript": "R", "tclsh": "Tcl", + "groovy": "Groovy", "osascript": "AppleScript", +} + + +def shebang_lang(first_line): + """Language for a `#!…` first line, or None. Resolves `env interp` and pins + `python3`→Python by stripping trailing version digits from the interpreter.""" + if not first_line.startswith("#!"): + return None + interp = None + for tok in first_line[2:].split(): + name = tok.rsplit("/", 1)[-1] + if name != "env": # skip the `env` in `#!/usr/bin/env python3` + interp = name + break + if not interp: + return None + interp = interp.lower() + return SHEBANG_LANG.get(interp) or SHEBANG_LANG.get(interp.rstrip("0123456789")) + def numstat_newpath(field): """Resolve a numstat path column to the post-rename path. @@ -355,9 +385,18 @@ def numstat_newpath(field): return field.split(" => ", 1)[1] -def classify_path(field): - """Map a numstat path column to a language name, or None to exclude it.""" +def classify_path(field, present=None, shebang=None): + """Map a numstat path column to a language name, or None to exclude it. + + `present`: when given, the set of paths at HEAD — files absent from it + (deleted since, or renamed away) are excluded so the bar reflects the repo + as it stands, not churn against files that no longer exist. + `shebang`: {path: language} for extensionless/unknown scripts a `#!` line + identified, so they land in their real language instead of "Other". + """ path = numstat_newpath(field.strip().strip('"')).replace("\\", "/") + if present is not None and path not in present: + return None # file no longer exists at HEAD — count only survivors if _VENDOR_RE and _VENDOR_RE.search(path): # Linguist vendored paths return None base = path.rsplit("/", 1)[-1].lower() @@ -368,9 +407,13 @@ def classify_path(field): if base in FILENAME_LANG: # Dockerfile, Makefile, Rakefile, … return FILENAME_LANG[base] dot = base.rfind(".") - if dot <= 0: # no extension, or a dotfile like ".gitignore" - return OTHER_LANG - return EXT_LANG.get(base[dot + 1:], OTHER_LANG) + if dot > 0: + lang = EXT_LANG.get(base[dot + 1:]) + if lang: + return lang + if shebang and path in shebang: # extensionless/unknown but has a #! line + return shebang[path] + return OTHER_LANG def top_languages(langs, limit=6): @@ -423,6 +466,19 @@ def _git_show(path, cwd=None): return "" +def _head_first_line(path, cwd=None): + """First line of `path` at HEAD, decoded leniently, or "". Reads bytes so a + stray binary doesn't crash the utf-8 decode `git(text=True)` would attempt.""" + try: + out = subprocess.run( + ["git", "show", f"HEAD:{path}"], cwd=cwd, capture_output=True + ).stdout + except OSError: + return "" + nl = out.find(b"\n") + return (out if nl < 0 else out[:nl]).decode("utf-8", "replace") + + def detect_frameworks(cwd=None): """Detect frameworks at HEAD from a local repo / bare clone. @@ -550,6 +606,37 @@ def gather(bases, requirements=False): return groups +def head_languages(cwd=None): + """Inputs for the language bar that need the HEAD tree, not the log. + + Returns `(present, shebang)`: + - `present`: every path tracked at HEAD, so `classify_path` can drop churn + against files that no longer exist. + - `shebang`: {path: language} for extensionless/unknown files whose `#!` + line names an interpreter — peeked only for files `classify_path` would + otherwise bucket as "Other", so the read stays cheap. + + Plumbing-only (`ls-tree` + `git show`), so it works on bare clones too. The + remote GraphQL path has no per-file data and skips this entirely. + """ + try: + tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) + except subprocess.CalledProcessError: + return set(), {} + present = {p for p in tree.splitlines() if p} + shebang = {} + for path in present: + # Only extensionless files need a peek: scripts (`bin/deploy`) live here, + # while binaries carry an extension and would just waste a read (and + # choke a text decode). Skip anything classify_path can already name. + if "." in path.rsplit("/", 1)[-1] or classify_path(path) != OTHER_LANG: + continue + lang = shebang_lang(_head_first_line(path, cwd=cwd)) + if lang: + shebang[path] = lang + return present, shebang + + _CLONE_REFRESHED = set() @@ -699,12 +786,16 @@ def collect_local(cwd=None, suppress_current_user=False): pass log = git( + # -c core.quotePath=false: keep non-ASCII paths raw so they match the + # raw paths from head_languages() (both feed classify_path's present set). + "-c", "core.quotePath=false", "log", "--no-merges", "-M", "--format=%H\x1f%s\x1f%aE\x1f%aN\x1f%aI", "--numstat", cwd=cwd, ) commits_meta, line_stats, lang_stats = {}, {}, {} + present, shebang = head_languages(cwd=cwd) cur = None for line in log.splitlines(): if not line: @@ -735,7 +826,7 @@ def collect_local(cwd=None, suppress_current_user=False): line_stats[cur][0] += added line_stats[cur][1] += deleted if len(cols) >= 3: - lang = classify_path(cols[2]) + lang = classify_path(cols[2], present=present, shebang=shebang) if lang: rec = lang_stats.setdefault(cur, {}).setdefault(lang, [0, 0, 0]) rec[0] += added diff --git a/src/repo-intel/techdata.json b/src/repo-intel/techdata.json index 4b3084c..8eb7d82 100644 --- a/src/repo-intel/techdata.json +++ b/src/repo-intel/techdata.json @@ -185,6 +185,41 @@ "config/application.rb", "Rails", "Ruby" + ], + [ + "Dockerfile", + "Docker", + "Tools" + ], + [ + "docker-compose.yml", + "Docker Compose", + "Tools" + ], + [ + "docker-compose.yaml", + "Docker Compose", + "Tools" + ], + [ + "compose.yml", + "Docker Compose", + "Tools" + ], + [ + "compose.yaml", + "Docker Compose", + "Tools" + ], + [ + "Makefile", + "Make", + "Tools" + ], + [ + "GNUmakefile", + "Make", + "Tools" ] ], "lang": { @@ -769,6 +804,7 @@ "Textile": "#ffe7ac", "Thrift": "#D12127", "Toit": "#c2c9fb", + "Tools": "#a371f7", "Tor Config": "#59316b", "Tree-sitter Query": "#8ea64c", "Turing": "#cf142b", diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index 67036b8..924a949 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -202,6 +202,8 @@ .langbar > span { display: block; height: 100%; min-width: 2px; } .lang-legend { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 8px; font-size: 0.74rem; color: var(--text-secondary); } .lang-legend .lang-item { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; } + .lang-legend a.lang-item { color: inherit; text-decoration: none; } + .lang-legend a.lang-item:hover { text-decoration: underline; } .lang-legend .lang-dot { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; } .lang-legend .lang-pct { color: var(--text-muted); font-variant-numeric: tabular-nums; } .lane-popover .langbar { margin-top: 12px; } @@ -209,8 +211,8 @@ /* Technologies section. */ #tech .tech-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; } #tech .tech-bar-label { font-size: 0.78rem; color: var(--text-muted); margin: 0 0 4px; } - #tech .frameworks { display: flex; flex-direction: column; gap: 12px; } - #tech .fw-group { display: grid; grid-template-columns: 130px 1fr; gap: 10px; align-items: baseline; } + #tech .frameworks { display: flex; flex-direction: column; gap: 6px; } + #tech .fw-group { display: grid; grid-template-columns: 130px 1fr; gap: 10px; align-items: center; } #tech .fw-lang { display: inline-flex; align-items: center; gap: 7px; font-size: 0.82rem; color: var(--text-secondary); font-weight: 600; } #tech .fw-lang .lang-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; } #tech .fw-items { display: flex; flex-wrap: wrap; gap: 6px; } @@ -244,8 +246,8 @@

+

Summary

@@ -274,10 +280,6 @@

#Author
-

Overall

@@ -473,17 +475,31 @@

// === COMMIT TIMELINE === function escapeHtml(s) { return String(s).replace(/[&<>"']/g, m => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m])); } +// GitHub code-search URL for a language within a repo, or '' when there's no +// GitHub base (local-only repo) or the bucket isn't a real language ("Other"). +// `base` is like https://github.com/owner/repo; the search lives on the same host. +function langSearchUrl(base, name) { + const m = /^(https?:\/\/[^/]+)\/(.+?)\/?$/.exec(base || ''); + if (!m || name === 'Other') return ''; + return `${m[1]}/search?q=${encodeURIComponent(`repo:${m[2]} language:${name}`)}&type=code`; +} + // Stacked language bar from a [{name, pct, color}] list (Python-precomputed). -function langBarHtml(langs, { legend = true } = {}) { +// `repoBase`, when given, links each legend entry to GitHub code search. +function langBarHtml(langs, { legend = true, repoBase = '' } = {}) { if (!langs || !langs.length) return ''; const segs = langs.map(l => `` ).join(''); let html = `
${segs}
`; if (legend) { - const items = langs.map(l => - `${escapeHtml(l.name)} ${l.pct}%` - ).join(''); + const items = langs.map(l => { + const inner = `${escapeHtml(l.name)} ${l.pct}%`; + const url = langSearchUrl(repoBase, l.name); + return url + ? `${inner}` + : `${inner}`; + }).join(''); html += `
${items}
`; } return html; @@ -502,12 +518,12 @@

const langEl = document.getElementById('techLanguages'); langEl.innerHTML = repoLangs.length ? `
Languages by lines changed
` + - langBarHtml(repoLangs, { legend: true }) + langBarHtml(repoLangs, { legend: true, repoBase: D.githubBaseUrl }) : `
Languages
` + `
Available on local or bare-clone runs — the remote GitHub API can't read per-file data. Run repo-intel inside a clone for the language breakdown.
`; const fwEl = document.getElementById('techFrameworks'); - fwEl.innerHTML = `
Frameworks & libraries
` + ( + fwEl.innerHTML = `
Frameworks & tools
` + ( frameworks.length ? `
` + frameworks.map(g => `
` + diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index f7b2557..43ff095 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n \n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( @@ -281,7 +281,7 @@ def iso_week_label(dt): # build.py inlines the JSON here; when unbuilt we read the sibling file. Used # only on the local + bare-clone paths — the GraphQL remote path lacks per-file # data, so these maps go unused there. -TECHDATA = '{\n "_source": {\n "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml",\n "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml"\n },\n "fw_deps": {\n "Go": {\n "github.com/gin-gonic/gin": "Gin",\n "github.com/go-chi/chi": "chi",\n "github.com/gofiber/fiber": "Fiber",\n "github.com/gorilla/mux": "Gorilla",\n "github.com/labstack/echo": "Echo",\n "github.com/spf13/cobra": "Cobra",\n "google.golang.org/grpc": "gRPC",\n "gorm.io/gorm": "GORM"\n },\n "PHP": {\n "cakephp/cakephp": "CakePHP",\n "laravel/framework": "Laravel",\n "slim/slim": "Slim",\n "symfony/framework-bundle": "Symfony",\n "symfony/symfony": "Symfony",\n "yiisoft/yii2": "Yii"\n },\n "Python": {\n "aiohttp": "aiohttp",\n "celery": "Celery",\n "click": "Click",\n "django": "Django",\n "djangorestframework": "Django REST",\n "fastapi": "FastAPI",\n "flask": "Flask",\n "httpx": "HTTPX",\n "keras": "Keras",\n "matplotlib": "Matplotlib",\n "numpy": "NumPy",\n "pandas": "pandas",\n "pydantic": "Pydantic",\n "pyramid": "Pyramid",\n "pytest": "pytest",\n "requests": "Requests",\n "sanic": "Sanic",\n "scikit-learn": "scikit-learn",\n "scipy": "SciPy",\n "scrapy": "Scrapy",\n "sqlalchemy": "SQLAlchemy",\n "starlette": "Starlette",\n "tensorflow": "TensorFlow",\n "torch": "PyTorch",\n "tornado": "Tornado",\n "transformers": "Transformers",\n "typer": "Typer"\n },\n "Ruby": {\n "devise": "Devise",\n "hanami": "Hanami",\n "puma": "Puma",\n "rails": "Rails",\n "rspec": "RSpec",\n "sidekiq": "Sidekiq",\n "sinatra": "Sinatra"\n },\n "Rust": {\n "actix-web": "Actix Web",\n "axum": "Axum",\n "bevy": "Bevy",\n "clap": "clap",\n "diesel": "Diesel",\n "rocket": "Rocket",\n "serde": "Serde",\n "tauri": "Tauri",\n "tokio": "Tokio",\n "tonic": "Tonic",\n "warp": "warp"\n },\n "npm": {\n "@angular/core": "Angular",\n "@apollo/client": "Apollo",\n "@chakra-ui/react": "Chakra UI",\n "@hapi/hapi": "hapi",\n "@ionic/core": "Ionic",\n "@mui/material": "MUI",\n "@nestjs/core": "NestJS",\n "@playwright/test": "Playwright",\n "@prisma/client": "Prisma",\n "@reduxjs/toolkit": "Redux",\n "@remix-run/react": "Remix",\n "@sveltejs/kit": "SvelteKit",\n "astro": "Astro",\n "bootstrap": "Bootstrap",\n "chart.js": "Chart.js",\n "cypress": "Cypress",\n "d3": "D3",\n "electron": "Electron",\n "esbuild": "esbuild",\n "eslint": "ESLint",\n "expo": "Expo",\n "express": "Express",\n "fastify": "Fastify",\n "gatsby": "Gatsby",\n "jest": "Jest",\n "koa": "Koa",\n "mocha": "Mocha",\n "mongoose": "Mongoose",\n "next": "Next.js",\n "nuxt": "Nuxt",\n "parcel": "Parcel",\n "playwright": "Playwright",\n "preact": "Preact",\n "prettier": "Prettier",\n "prisma": "Prisma",\n "react": "React",\n "react-dom": "React",\n "react-native": "React Native",\n "redux": "Redux",\n "rollup": "Rollup",\n "sequelize": "Sequelize",\n "solid-js": "SolidJS",\n "styled-components": "styled-components",\n "svelte": "Svelte",\n "tailwindcss": "Tailwind CSS",\n "three": "three.js",\n "typeorm": "TypeORM",\n "vite": "Vite",\n "vitest": "Vitest",\n "vue": "Vue",\n "webpack": "webpack",\n "zustand": "Zustand"\n }\n },\n "fw_sentinels_js": [\n [\n "next.config.js",\n "Next.js"\n ],\n [\n "next.config.ts",\n "Next.js"\n ],\n [\n "next.config.mjs",\n "Next.js"\n ],\n [\n "nuxt.config.js",\n "Nuxt"\n ],\n [\n "nuxt.config.ts",\n "Nuxt"\n ],\n [\n "svelte.config.js",\n "Svelte"\n ],\n [\n "astro.config.mjs",\n "Astro"\n ],\n [\n "vue.config.js",\n "Vue"\n ],\n [\n "gatsby-config.js",\n "Gatsby"\n ],\n [\n "angular.json",\n "Angular"\n ]\n ],\n "fw_sentinels_other": [\n [\n "manage.py",\n "Django",\n "Python"\n ],\n [\n "artisan",\n "Laravel",\n "PHP"\n ],\n [\n "config/application.rb",\n "Rails",\n "Ruby"\n ]\n ],\n "lang": {\n "color": {\n "1C Enterprise": "#814CCC",\n "2-Dimensional Array": "#38761D",\n "4D": "#004289",\n "ABAP": "#E8274B",\n "ABAP CDS": "#555e25",\n "AGS Script": "#B9D9FF",\n "AIDL": "#34EB6B",\n "AL": "#3AA2B5",\n "ALGOL": "#D1E0DB",\n "AMPL": "#E6EFBB",\n "ANTLR": "#9DC3FF",\n "API Blueprint": "#2ACCA8",\n "APL": "#5A8164",\n "ASP.NET": "#9400ff",\n "ATS": "#1ac620",\n "ActionScript": "#882B0F",\n "Ada": "#02f88c",\n "Adblock Filter List": "#800000",\n "Adobe Font Metrics": "#fa0f00",\n "Agda": "#315665",\n "Aiken": "#640ff8",\n "Alloy": "#64C800",\n "Alpine Abuild": "#0D597F",\n "Altium Designer": "#A89663",\n "AngelScript": "#C7D7DC",\n "Answer Set Programming": "#A9CC29",\n "Ant Build System": "#A9157E",\n "Antlers": "#ff269e",\n "ApacheConf": "#d12127",\n "Apex": "#1797c0",\n "Apollo Guidance Computer": "#0B3D91",\n "AppleScript": "#101F1F",\n "Arc": "#aa2afe",\n "AsciiDoc": "#73a0c5",\n "AspectJ": "#a957b0",\n "Assembly": "#6E4C13",\n "Astro": "#ff5a03",\n "Asymptote": "#ff0000",\n "Augeas": "#9CC134",\n "AutoHotkey": "#6594b9",\n "AutoIt": "#1C3552",\n "Avro IDL": "#0040FF",\n "Awk": "#c30e9b",\n "B (Formal Method)": "#8aa8c5",\n "B4X": "#00e4ff",\n "BASIC": "#ff0000",\n "BQN": "#2b7067",\n "Ballerina": "#FF5000",\n "Batchfile": "#C1F12E",\n "Beef": "#a52f4e",\n "Berry": "#15A13C",\n "BibTeX": "#778899",\n "Bicep": "#519aba",\n "Bikeshed": "#5562ac",\n "Bison": "#6A463F",\n "BitBake": "#00bce4",\n "Blade": "#f7523f",\n "BlitzBasic": "#00FFAE",\n "BlitzMax": "#cd6400",\n "Bluespec": "#12223c",\n "Bluespec BH": "#12223c",\n "Boo": "#d4bec1",\n "Boogie": "#c80fa0",\n "Brainfuck": "#2F2530",\n "BrighterScript": "#66AABB",\n "Brightscript": "#662D91",\n "Browserslist": "#ffd539",\n "Bru": "#F4AA41",\n "BuildStream": "#006bff",\n "C": "#555555",\n "C#": "#178600",\n "C++": "#f34b7d",\n "C3": "#2563eb",\n "CAP CDS": "#0092d1",\n "CLIPS": "#00A300",\n "CMake": "#DA3434",\n "COLLADA": "#F1A42B",\n "CQL": "#006091",\n "CSON": "#244776",\n "CSS": "#663399",\n "CSV": "#237346",\n "CUE": "#5886E1",\n "CWeb": "#00007a",\n "Cabal Config": "#483465",\n "Caddyfile": "#22b638",\n "Cadence": "#00ef8b",\n "Cairo": "#ff4a48",\n "Cairo Zero": "#ff4a48",\n "CameLIGO": "#3be133",\n "Cangjie": "#00868B",\n "Cap\'n Proto": "#c42727",\n "Carbon": "#222222",\n "Ceylon": "#dfa535",\n "Chapel": "#8dc63f",\n "ChucK": "#3f8000",\n "Circom": "#707575",\n "Cirru": "#ccccff",\n "Clarion": "#db901e",\n "Clarity": "#5546ff",\n "Classic ASP": "#6a40fd",\n "Clean": "#3F85AF",\n "Click": "#E4E6F3",\n "Clojure": "#db5855",\n "Closure Templates": "#0d948f",\n "Cloud Firestore Security Rules": "#FFA000",\n "Clue": "#0009b5",\n "CodeQL": "#140f46",\n "CoffeeScript": "#244776",\n "ColdFusion": "#ed2cd6",\n "ColdFusion CFC": "#ed2cd6",\n "Common Lisp": "#3fb68b",\n "Common Workflow Language": "#B5314C",\n "Component Pascal": "#B0CE4E",\n "Cooklang": "#E15A29",\n "Crystal": "#000100",\n "Csound": "#1a1a1a",\n "Csound Document": "#1a1a1a",\n "Csound Score": "#1a1a1a",\n "Cuda": "#3A4E3A",\n "Curry": "#531242",\n "Cylc": "#00b3fd",\n "Cypher": "#34c0eb",\n "Cython": "#fedf5b",\n "D": "#ba595e",\n "D2": "#526ee8",\n "DM": "#447265",\n "Dafny": "#FFEC25",\n "Darcs Patch": "#8eff23",\n "Dart": "#00B4AB",\n "Daslang": "#d3d3d3",\n "DataWeave": "#003a52",\n "Debian Package Control File": "#D70751",\n "DenizenScript": "#FBEE96",\n "Dhall": "#dfafff",\n "DirectX 3D File": "#aace60",\n "Dockerfile": "#384d54",\n "Dogescript": "#cca760",\n "Dotenv": "#e5d559",\n "Dune": "#89421e",\n "Dylan": "#6c616e",\n "E": "#ccce35",\n "ECL": "#8a1267",\n "ECLiPSe": "#001d9d",\n "EJS": "#a91e50",\n "EQ": "#a78649",\n "Earthly": "#2af0ff",\n "Easybuild": "#069406",\n "Ecere Projects": "#913960",\n "Ecmarkup": "#eb8131",\n "Edge": "#0dffe0",\n "EdgeQL": "#31A7FF",\n "EditorConfig": "#fff1f2",\n "Eiffel": "#4d6977",\n "Elixir": "#6e4a7e",\n "Elm": "#60B5CC",\n "Elvish": "#55BB55",\n "Elvish Transcript": "#55BB55",\n "Emacs Lisp": "#c065db",\n "EmberScript": "#FFF4F3",\n "Erlang": "#B83998",\n "Euphoria": "#FF790B",\n "F#": "#b845fc",\n "F*": "#572e30",\n "FIGlet Font": "#FFDDBB",\n "FIRRTL": "#2f632f",\n "FLUX": "#88ccff",\n "Factor": "#636746",\n "Fancy": "#7b9db4",\n "Fantom": "#14253c",\n "Faust": "#c37240",\n "Fennel": "#fff3d7",\n "Filebench WML": "#F6B900",\n "FlatBuffers": "#ed284a",\n "Flix": "#d44a45",\n "Fluent": "#ffcc33",\n "Forth": "#341708",\n "Fortran": "#4d41b1",\n "Fortran Free Form": "#4d41b1",\n "FreeBASIC": "#141AC9",\n "FreeMarker": "#0050b2",\n "Frege": "#00cafe",\n "Futhark": "#5f021f",\n "G-code": "#D08CF2",\n "GAML": "#FFC766",\n "GAMS": "#f49a22",\n "GAP": "#0000cc",\n "GCC Machine Description": "#FFCFAB",\n "GDScript": "#355570",\n "GDShader": "#478CBF",\n "GEDCOM": "#003058",\n "GLSL": "#5686a5",\n "GSC": "#FF6800",\n "Game Maker Language": "#71b417",\n "Gemfile.lock": "#701516",\n "Gemini": "#ff6900",\n "Genero 4gl": "#63408e",\n "Genero per": "#d8df39",\n "Genie": "#fb855d",\n "Genshi": "#951531",\n "Gentoo Ebuild": "#9400ff",\n "Gentoo Eclass": "#9400ff",\n "Gerber Image": "#d20b00",\n "Gherkin": "#5B2063",\n "Git Attributes": "#F44D27",\n "Git Commit": "#F44D27",\n "Git Config": "#F44D27",\n "Git Revision List": "#F44D27",\n "Gleam": "#ffaff3",\n "Glimmer JS": "#F5835F",\n "Glimmer TS": "#3178c6",\n "Glyph": "#c1ac7f",\n "Gnuplot": "#f0a9f0",\n "Go": "#00ADD8",\n "Go Checksums": "#00ADD8",\n "Go Module": "#00ADD8",\n "Go Template": "#00ADD8",\n "Go Workspace": "#00ADD8",\n "Godot Resource": "#355570",\n "Golo": "#88562A",\n "Gosu": "#82937f",\n "Grace": "#615f8b",\n "Gradle": "#02303a",\n "Gradle Kotlin DSL": "#02303a",\n "Grammatical Framework": "#ff0000",\n "GraphQL": "#e10098",\n "Graphviz (DOT)": "#2596be",\n "Groovy": "#4298b8",\n "Groovy Server Pages": "#4298b8",\n "HAProxy": "#106da9",\n "HCL": "#844FBA",\n "HIP": "#4F3A4F",\n "HLSL": "#aace60",\n "HOCON": "#9ff8ee",\n "HTML": "#e34c26",\n "HTML+ECR": "#2e1052",\n "HTML+EEX": "#6e4a7e",\n "HTML+ERB": "#701516",\n "HTML+PHP": "#4f5d95",\n "HTML+Razor": "#512be4",\n "HTTP": "#005C9C",\n "HXML": "#f68712",\n "Hack": "#878787",\n "Haml": "#ece2a9",\n "Handlebars": "#f7931e",\n "Harbour": "#0e60e3",\n "Hare": "#9d7424",\n "Haskell": "#5e5086",\n "Haxe": "#df7900",\n "HiveQL": "#dce200",\n "HolyC": "#ffefaf",\n "Hosts File": "#308888",\n "Hurl": "#FF0288",\n "Hy": "#7790B2",\n "IDL": "#a3522f",\n "IGOR Pro": "#0000cc",\n "IL Assembly": "#512BD4",\n "INI": "#d1dbe0",\n "ISPC": "#2D68B1",\n "Idris": "#b30000",\n "Ignore List": "#000000",\n "ImageJ Macro": "#99AAFF",\n "Imba": "#16cec6",\n "Inno Setup": "#264b99",\n "Io": "#a9188d",\n "Ioke": "#078193",\n "Isabelle": "#FEFE00",\n "Isabelle ROOT": "#FEFE00",\n "J": "#9EEDFF",\n "JAR Manifest": "#b07219",\n "JCL": "#d90e09",\n "JFlex": "#DBCA00",\n "JSON": "#292929",\n "JSON with Comments": "#292929",\n "JSON5": "#267CB9",\n "JSONLD": "#0c479c",\n "JSONiq": "#40d47e",\n "Jac": "#FC792D",\n "Jai": "#ab8b4b",\n "Janet": "#0886a5",\n "Jasmin": "#d03600",\n "Java": "#b07219",\n "Java Properties": "#2A6277",\n "Java Server Pages": "#2A6277",\n "Java Template Engine": "#2A6277",\n "JavaScript": "#f1e05a",\n "JavaScript+ERB": "#f1e05a",\n "Jest Snapshot": "#15c213",\n "JetBrains MPS": "#21D789",\n "Jinja": "#a52a22",\n "Jison": "#56b3cb",\n "Jison Lex": "#56b3cb",\n "Jolie": "#843179",\n "Jsonnet": "#0064bd",\n "Julia": "#a270ba",\n "Julia REPL": "#a270ba",\n "Jupyter Notebook": "#DA5B0B",\n "Just": "#384d54",\n "KCL": "#7ABABF",\n "KDL": "#ffb3b3",\n "KFramework": "#4195c5",\n "KRL": "#28430A",\n "Kaitai Struct": "#773b37",\n "KakouneScript": "#6f8042",\n "KerboScript": "#41adf0",\n "KiCad Layout": "#2f4aab",\n "KiCad Legacy Layout": "#2f4aab",\n "KiCad Schematic": "#2f4aab",\n "KoLmafia ASH": "#B9D9B9",\n "Koka": "#215166",\n "Kotlin": "#A97BFF",\n "LFE": "#4C3023",\n "LLVM": "#185619",\n "LOLCODE": "#cc9900",\n "LSL": "#3d9970",\n "LabVIEW": "#fede06",\n "Lambdapi": "#8027a3",\n "Langium": "#2c8c87",\n "Lark": "#2980B9",\n "Lasso": "#999999",\n "Latte": "#f2a542",\n "Leo": "#C4FFC2",\n "Less": "#1d365d",\n "Lex": "#DBCA00",\n "LigoLANG": "#0e74ff",\n "LilyPond": "#9ccc7c",\n "Liquid": "#67b8de",\n "Liquidsoap": "#990066",\n "Literate Agda": "#315665",\n "Literate CoffeeScript": "#244776",\n "Literate Haskell": "#5e5086",\n "LiveCode Script": "#0c5ba5",\n "LiveScript": "#499886",\n "Logtalk": "#295b9a",\n "LookML": "#652B81",\n "Lua": "#000080",\n "Luau": "#00A2FF",\n "M3U": "#179C7D",\n "MATLAB": "#e16737",\n "MAXScript": "#00a6a6",\n "MDX": "#fcb32c",\n "MLIR": "#5EC8DB",\n "MQL4": "#62A8D6",\n "MQL5": "#4A76B8",\n "MTML": "#b7e1f4",\n "Macaulay2": "#d8ffff",\n "Makefile": "#427819",\n "Mako": "#7e858d",\n "Markdown": "#083fa1",\n "Marko": "#42bff2",\n "Mask": "#f97732",\n "Mathematical Programming System": "#0530ad",\n "Max": "#c4a79c",\n "MeTTa": "#6a5acd",\n "Mercury": "#ff2b2b",\n "Mermaid": "#ff3670",\n "Meson": "#007800",\n "Metal": "#8f14e9",\n "MiniYAML": "#ff1111",\n "MiniZinc": "#06a9e6",\n "Mint": "#02b046",\n "Mirah": "#c7a938",\n "Modelica": "#de1d31",\n "Modula-2": "#10253f",\n "Modula-3": "#223388",\n "Mojo": "#ff4c1f",\n "Monkey C": "#8D6747",\n "MoonBit": "#b92381",\n "MoonScript": "#ff4585",\n "Motoko": "#fbb03b",\n "Motorola 68K Assembly": "#005daa",\n "Move": "#4a137a",\n "Mustache": "#724b3b",\n "NCL": "#28431f",\n "NMODL": "#00356B",\n "NPM Config": "#cb3837",\n "NWScript": "#111522",\n "Nasal": "#1d2c4e",\n "Nearley": "#990000",\n "Nemerle": "#3d3c6e",\n "NetLinx": "#0aa0ff",\n "NetLinx+ERB": "#747faa",\n "NetLogo": "#ff6375",\n "NewLisp": "#87AED7",\n "Nextflow": "#3ac486",\n "Nginx": "#009639",\n "Nickel": "#E0C3FC",\n "Nim": "#ffc200",\n "Nit": "#009917",\n "Nix": "#7e7eff",\n "Noir": "#2f1f49",\n "Nu": "#c9df40",\n "NumPy": "#9C8AF9",\n "Nunjucks": "#3d8137",\n "Nushell": "#4E9906",\n "OASv2-json": "#85ea2d",\n "OASv2-yaml": "#85ea2d",\n "OASv3-json": "#85ea2d",\n "OASv3-yaml": "#85ea2d",\n "OCaml": "#ef7a08",\n "OMNeT++ MSG": "#a0e0a0",\n "OMNeT++ NED": "#08607c",\n "ObjectScript": "#424893",\n "Objective-C": "#438eff",\n "Objective-C++": "#6866fb",\n "Objective-J": "#ff0c5a",\n "Odin": "#60AFFE",\n "Omgrofl": "#cabbff",\n "Opal": "#f7ede0",\n "Open Policy Agent": "#7d9199",\n "OpenAPI Specification v2": "#85ea2d",\n "OpenAPI Specification v3": "#85ea2d",\n "OpenCL": "#ed2e2d",\n "OpenEdge ABL": "#5ce600",\n "OpenQASM": "#AA70FF",\n "OpenSCAD": "#e5cd45",\n "Option List": "#476732",\n "Org": "#77aa99",\n "OverpassQL": "#cce2aa",\n "Oxygene": "#cdd0e3",\n "Oz": "#fab738",\n "P4": "#7055b5",\n "PDDL": "#0d00ff",\n "PEG.js": "#234d6b",\n "PHP": "#4F5D95",\n "PLSQL": "#dad8d8",\n "PLpgSQL": "#336790",\n "POV-Ray SDL": "#6bac65",\n "Pact": "#F7A8B8",\n "Pan": "#cc0000",\n "Papyrus": "#6600cc",\n "Parrot": "#f3ca0a",\n "Pascal": "#E3F171",\n "Pawn": "#dbb284",\n "Pep8": "#C76F5B",\n "Perl": "#0298c3",\n "PicoLisp": "#6067af",\n "PigLatin": "#fcd7de",\n "Pike": "#005390",\n "Pip Requirements": "#FFD343",\n "Pkl": "#6b9543",\n "PlantUML": "#fbbd16",\n "PogoScript": "#d80074",\n "Polar": "#ae81ff",\n "Portugol": "#f8bd00",\n "PostCSS": "#dc3a0c",\n "PostScript": "#da291c",\n "PowerBuilder": "#8f0f8d",\n "PowerShell": "#012456",\n "Praat": "#c8506d",\n "Prisma": "#0c344b",\n "Processing": "#0096D8",\n "Procfile": "#3B2F63",\n "Prolog": "#74283c",\n "Promela": "#de0000",\n "Propeller Spin": "#7fa2a7",\n "Pug": "#a86454",\n "Puppet": "#302B6D",\n "PureBasic": "#5a6986",\n "PureScript": "#1D222D",\n "Pyret": "#ee1e10",\n "Python": "#3572A5",\n "Python console": "#3572A5",\n "Python traceback": "#3572A5",\n "Q#": "#fed659",\n "QML": "#44a51c",\n "Qt Script": "#00b841",\n "Quake": "#882233",\n "QuakeC": "#975777",\n "QuickBASIC": "#008080",\n "Quint": "#9d6ce5",\n "R": "#198CE7",\n "RAML": "#77d9fb",\n "RAScript": "#2C97FA",\n "RBS": "#701516",\n "RDoc": "#701516",\n "REXX": "#d90e09",\n "RMarkdown": "#198ce7",\n "RON": "#a62c00",\n "ROS Interface": "#22314e",\n "RPGLE": "#2BDE21",\n "RUNOFF": "#665a4e",\n "Racket": "#3c5caa",\n "Ragel": "#9d5200",\n "Raku": "#0000fb",\n "Rascal": "#fffaa0",\n "ReScript": "#ed5051",\n "Reason": "#ff5847",\n "ReasonLIGO": "#ff5847",\n "Rebol": "#358a5b",\n "Record Jar": "#0673ba",\n "Red": "#f50000",\n "Regular Expression": "#009a00",\n "Ren\'Py": "#ff7f7f",\n "Rez": "#FFDAB3",\n "Ring": "#2D54CB",\n "Riot": "#A71E49",\n "RobotFramework": "#00c0b5",\n "Roc": "#7c38f5",\n "Rocq Prover": "#d0b68c",\n "Roff": "#ecdebe",\n "Roff Manpage": "#ecdebe",\n "Rouge": "#cc0088",\n "RouterOS Script": "#DE3941",\n "Ruby": "#701516",\n "Rust": "#dea584",\n "SAS": "#B34936",\n "SCSS": "#c6538c",\n "SPARQL": "#0C4597",\n "SQF": "#3F3F3F",\n "SQL": "#e38c00",\n "SQLPL": "#e38c00",\n "SRecode Template": "#348a34",\n "STL": "#373b5e",\n "SVG": "#ff9900",\n "Sail": "#259dd5",\n "SaltStack": "#646464",\n "Sass": "#a53b70",\n "Scala": "#c22d40",\n "Scaml": "#bd181a",\n "Scenic": "#fdc700",\n "Scheme": "#1e4aec",\n "Scilab": "#ca0f21",\n "Self": "#0579aa",\n "ShaderLab": "#222c37",\n "Shell": "#89e051",\n "ShellCheck Config": "#cecfcb",\n "Shen": "#120F14",\n "Simple File Verification": "#C9BFED",\n "Singularity": "#64E6AD",\n "Slang": "#1fbec9",\n "Slash": "#007eff",\n "Slice": "#003fa2",\n "Slim": "#2b2b2b",\n "Slint": "#2379F4",\n "SmPL": "#c94949",\n "Smalltalk": "#596706",\n "Smarty": "#f0c040",\n "Smithy": "#c44536",\n "Snakemake": "#419179",\n "Solidity": "#AA6746",\n "SourcePawn": "#f69e1d",\n "SpiceDB Schema": "#a5318a",\n "Squirrel": "#800000",\n "Stan": "#b2011d",\n "Standard ML": "#dc566d",\n "Starlark": "#76d275",\n "Stata": "#1a5f91",\n "StringTemplate": "#3fb34f",\n "Stylus": "#ff6347",\n "SubRip Text": "#9e0101",\n "SugarSS": "#2fcc9f",\n "SuperCollider": "#46390b",\n "SurrealQL": "#ff00a0",\n "Survex data": "#ffcc99",\n "Svelte": "#ff3e00",\n "Sway": "#00F58C",\n "Sweave": "#198ce7",\n "Swift": "#F05138",\n "SystemVerilog": "#DAE1C2",\n "TI Program": "#A0AA87",\n "TL-Verilog": "#C40023",\n "TLA": "#4b0079",\n "TMDL": "#f0c913",\n "TOML": "#9c4221",\n "TSQL": "#e38c00",\n "TSV": "#237346",\n "TSX": "#3178c6",\n "TXL": "#0178b8",\n "Tact": "#48b5ff",\n "Talon": "#333333",\n "Tcl": "#e4cc98",\n "TeX": "#3D6117",\n "Teal": "#00B1BC",\n "Terra": "#00004c",\n "Terraform Template": "#7b42bb",\n "TextGrid": "#c8506d",\n "TextMate Properties": "#df66e4",\n "Textile": "#ffe7ac",\n "Thrift": "#D12127",\n "Toit": "#c2c9fb",\n "Tor Config": "#59316b",\n "Tree-sitter Query": "#8ea64c",\n "Turing": "#cf142b",\n "Twig": "#c1d026",\n "TypeScript": "#3178c6",\n "TypeSpec": "#4A3665",\n "Typst": "#239dad",\n "Unified Parallel C": "#4e3617",\n "Unity3D Asset": "#222c37",\n "Uno": "#9933cc",\n "UnrealScript": "#a54c4d",\n "Untyped Plutus Core": "#36adbd",\n "UrWeb": "#ccccee",\n "V": "#4f87c4",\n "VBA": "#867db1",\n "VBScript": "#15dcdc",\n "VCL": "#148AA8",\n "VHDL": "#adb2cb",\n "Vala": "#a56de2",\n "Valve Data Format": "#f26025",\n "Velocity Template Language": "#507cff",\n "Vento": "#ff0080",\n "Verilog": "#b2b7f8",\n "Vim Help File": "#199f4b",\n "Vim Script": "#199f4b",\n "Vim Snippet": "#199f4b",\n "Visual Basic .NET": "#945db7",\n "Visual Basic 6.0": "#2c6353",\n "Volt": "#1F1F1F",\n "Vue": "#41b883",\n "Vyper": "#9F4CF2",\n "WDL": "#42f1f4",\n "WGSL": "#1a5e9a",\n "Web Ontology Language": "#5b70bd",\n "WebAssembly": "#04133b",\n "WebAssembly Interface Type": "#6250e7",\n "Whiley": "#d5c397",\n "Wikitext": "#fc5757",\n "Windows Registry Entries": "#52d5ff",\n "Witcher Script": "#ff0000",\n "Wolfram Language": "#dd1100",\n "Wollok": "#a23738",\n "World of Warcraft Addon Data": "#f7e43f",\n "Wren": "#383838",\n "X10": "#4B6BEF",\n "XC": "#99DA07",\n "XML": "#0060ac",\n "XML Property List": "#0060ac",\n "XQuery": "#5232e7",\n "XSLT": "#EB8CEB",\n "Xmake": "#22a079",\n "Xojo": "#81bd41",\n "Xonsh": "#285EEF",\n "Xtend": "#24255d",\n "YAML": "#cb171e",\n "YARA": "#220000",\n "YASnippet": "#32AB90",\n "Yacc": "#4B6C4B",\n "Yul": "#794932",\n "ZAP": "#0d665e",\n "ZIL": "#dc75e5",\n "ZenScript": "#00BCD1",\n "Zephir": "#118f9e",\n "Zig": "#ec915c",\n "Zimpl": "#d67711",\n "Zmodel": "#ff7100",\n "crontab": "#ead7ac",\n "eC": "#913960",\n "fish": "#4aae47",\n "hoon": "#00b171",\n "iCalendar": "#ec564c",\n "jq": "#c7254e",\n "kvlang": "#1da6e0",\n "mIRC Script": "#3d57c3",\n "mcfunction": "#E22837",\n "mdsvex": "#5f9ea0",\n "mupad": "#244963",\n "nanorc": "#2d004d",\n "nesC": "#94B0C7",\n "ooc": "#b0b77e",\n "q": "#0040cd",\n "reStructuredText": "#141414",\n "sed": "#64b970",\n "templ": "#66D0DD",\n "vCard": "#ee2647",\n "wisp": "#7582D1",\n "xBase": "#403a40"\n },\n "ext": {\n "1": "Roff",\n "1in": "Roff",\n "1m": "Roff",\n "1x": "Roff",\n "2": "Roff",\n "2da": "2-Dimensional Array",\n "3": "Roff",\n "3in": "Roff",\n "3m": "Roff",\n "3p": "Roff",\n "3pm": "Roff",\n "3qt": "Roff",\n "3x": "Roff",\n "4": "Roff",\n "4dform": "JSON",\n "4dm": "4D",\n "4dproject": "JSON",\n "4gl": "Genero 4gl",\n "4th": "Forth",\n "5": "Roff",\n "6": "Roff",\n "6pl": "Raku",\n "6pm": "Raku",\n "7": "Roff",\n "8": "Roff",\n "8xp": "TI Program",\n "8xp.txt": "TI Program",\n "9": "Roff",\n "_coffee": "CoffeeScript",\n "_js": "JavaScript",\n "_ls": "LiveScript",\n "a51": "Assembly",\n "abap": "ABAP",\n "action": "ROS Interface",\n "ada": "Ada",\n "adb": "Ada",\n "adml": "XML",\n "admx": "XML",\n "ado": "Stata",\n "adoc": "AsciiDoc",\n "adp": "Tcl",\n "ads": "Ada",\n "afm": "Adobe Font Metrics",\n "agc": "Assembly",\n "agda": "Agda",\n "ahk": "AutoHotkey",\n "ahkl": "AutoHotkey",\n "aidl": "AIDL",\n "aj": "AspectJ",\n "ak": "Aiken",\n "al": "AL",\n "alg": "ALGOL",\n "als": "Alloy",\n "ampl": "AMPL",\n "angelscript": "AngelScript",\n "anim": "Unity3D Asset",\n "ant": "XML",\n "antlers.html": "Antlers",\n "antlers.php": "Antlers",\n "antlers.xml": "Antlers",\n "apacheconf": "ApacheConf",\n "apex": "Apex",\n "apib": "API Blueprint",\n "apl": "APL",\n "app": "Erlang",\n "app.src": "Erlang",\n "applescript": "AppleScript",\n "arc": "Arc",\n "arr": "Pyret",\n "as": "ActionScript",\n "asax": "ASP.NET",\n "asc": "AGS Script",\n "asciidoc": "AsciiDoc",\n "ascx": "ASP.NET",\n "asd": "Common Lisp",\n "asddls": "ABAP CDS",\n "ash": "KoLmafia ASH",\n "ashx": "ASP.NET",\n "asm": "Assembly",\n "asmx": "ASP.NET",\n "asp": "Classic ASP",\n "aspx": "ASP.NET",\n "asset": "Unity3D Asset",\n "astro": "Astro",\n "asy": "Asymptote",\n "au3": "AutoIt",\n "aug": "Augeas",\n "auk": "Awk",\n "aux": "TeX",\n "avdl": "Avro IDL",\n "avsc": "JSON",\n "aw": "PHP",\n "awk": "Awk",\n "axaml": "XML",\n "axd": "ASP.NET",\n "axi": "NetLinx",\n "axi.erb": "NetLinx+ERB",\n "axml": "XML",\n "axs": "NetLinx",\n "axs.erb": "NetLinx+ERB",\n "b": "Brainfuck",\n "bal": "Ballerina",\n "bas": "B4X",\n "bash": "Shell",\n "bat": "Batchfile",\n "bats": "Shell",\n "bb": "BitBake",\n "bbappend": "BitBake",\n "bbclass": "BitBake",\n "bbx": "TeX",\n "bdy": "PLSQL",\n "be": "Berry",\n "bf": "Beef",\n "bi": "FreeBASIC",\n "bib": "TeX",\n "bibtex": "TeX",\n "bicep": "Bicep",\n "bicepparam": "Bicep",\n "bison": "Yacc",\n "blade": "Blade",\n "blade.php": "Blade",\n "bmx": "BlitzMax",\n "bones": "JavaScript",\n "boo": "Boo",\n "boot": "Clojure",\n "bpl": "Boogie",\n "bqn": "BQN",\n "brd": "KiCad Legacy Layout",\n "brs": "Brightscript",\n "bru": "Bru",\n "bs": "Bluespec",\n "bsl": "1C Enterprise",\n "bst": "BuildStream",\n "bsv": "Bluespec",\n "builder": "Ruby",\n "builds": "XML",\n "bzl": "Starlark",\n "c": "C",\n "c++": "C++",\n "c3": "C3",\n "cabal": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cairo": "Cairo",\n "cake": "C#",\n "capnp": "Cap\'n Proto",\n "carbon": "Carbon",\n "cats": "C",\n "cbx": "TeX",\n "cc": "C++",\n "ccproj": "XML",\n "ccxml": "XML",\n "cdc": "Cadence",\n "cdf": "Wolfram Language",\n "cds": "CAP CDS",\n "ceylon": "Ceylon",\n "cfc": "ColdFusion",\n "cfg": "HAProxy",\n "cfm": "ColdFusion",\n "cfml": "ColdFusion",\n "cgi": "Perl",\n "cginc": "HLSL",\n "ch": "xBase",\n "chpl": "Chapel",\n "circom": "Circom",\n "cirru": "Cirru",\n "cj": "Cangjie",\n "cjs": "JavaScript",\n "cjsx": "CoffeeScript",\n "ck": "ChucK",\n "cl": "C",\n "cl2": "Clojure",\n "clar": "Clarity",\n "click": "Click",\n "clixml": "XML",\n "clj": "Clojure",\n "cljc": "Clojure",\n "cljs": "Clojure",\n "cljs.hl": "Clojure",\n "cljscm": "Clojure",\n "cljx": "Clojure",\n "clp": "CLIPS",\n "cls": "Apex",\n "clue": "Clue",\n "clw": "Clarion",\n "cmake": "CMake",\n "cmake.in": "CMake",\n "cmd": "Batchfile",\n "cmp": "Gerber Image",\n "cnc": "G-code",\n "cnf": "INI",\n "cocci": "SmPL",\n "code-snippets": "JSON",\n "code-workspace": "JSON",\n "coffee": "CoffeeScript",\n "coffee.md": "CoffeeScript",\n "command": "Shell",\n "containerfile": "Dockerfile",\n "cook": "Cooklang",\n "coq": "Rocq Prover",\n "cp": "Component Pascal",\n "cpp": "C++",\n "cppm": "C++",\n "cproject": "XML",\n "cps": "Component Pascal",\n "cql": "CQL",\n "cr": "Crystal",\n "cs": "C#",\n "cs.pp": "C#",\n "csc": "GSC",\n "cscfg": "XML",\n "csd": "Csound Document",\n "csdef": "XML",\n "cshtml": "HTML",\n "csl": "XML",\n "cson": "CSON",\n "csproj": "XML",\n "css": "CSS",\n "csv": "CSV",\n "csx": "C#",\n "ct": "XML",\n "ctl": "Visual Basic 6.0",\n "ctp": "PHP",\n "cts": "TypeScript",\n "cu": "Cuda",\n "cue": "CUE",\n "cuh": "Cuda",\n "curry": "Curry",\n "cwl": "Common Workflow Language",\n "cxx": "C++",\n "cylc": "INI",\n "cyp": "Cypher",\n "cypher": "Cypher",\n "d": "D",\n "d2": "D2",\n "dae": "COLLADA",\n "darcspatch": "Darcs Patch",\n "dart": "Dart",\n "das": "Daslang",\n "dats": "ATS",\n "db2": "SQLPL",\n "dcl": "Clean",\n "ddl": "PLSQL",\n "decls": "BlitzBasic",\n "depproj": "XML",\n "dfm": "Pascal",\n "dfy": "Dafny",\n "dhall": "Dhall",\n "di": "D",\n "dita": "XML",\n "ditamap": "XML",\n "ditaval": "XML",\n "djs": "Dogescript",\n "dll.config": "XML",\n "dlm": "IDL",\n "dm": "DM",\n "do": "Stata",\n "dockerfile": "Dockerfile",\n "dof": "INI",\n "doh": "Stata",\n "dot": "Graphviz (DOT)",\n "dotsettings": "XML",\n "dpatch": "Darcs Patch",\n "dpr": "Pascal",\n "druby": "Mirah",\n "dsc": "DenizenScript",\n "dsp": "Faust",\n "dsr": "Visual Basic 6.0",\n "dtx": "TeX",\n "duby": "Mirah",\n "dwl": "DataWeave",\n "dyalog": "APL",\n "dyl": "Dylan",\n "dylan": "Dylan",\n "e": "E",\n "eb": "Python",\n "ebuild": "Shell",\n "ec": "eC",\n "ecl": "ECL",\n "eclass": "Shell",\n "eclxml": "ECL",\n "ecr": "HTML",\n "ect": "EJS",\n "edge": "Edge",\n "edgeql": "EdgeQL",\n "editorconfig": "INI",\n "eh": "eC",\n "ejs": "EJS",\n "ejs.t": "EJS",\n "el": "Emacs Lisp",\n "eliom": "OCaml",\n "eliomi": "OCaml",\n "elm": "Elm",\n "elv": "Elvish",\n "em": "EmberScript",\n "emacs": "Emacs Lisp",\n "emacs.desktop": "Emacs Lisp",\n "emberscript": "EmberScript",\n "env": "Dotenv",\n "epj": "JavaScript",\n "eps": "PostScript",\n "epsi": "PostScript",\n "eq": "EQ",\n "erb": "HTML",\n "erb.deface": "HTML",\n "erl": "Erlang",\n "es": "Erlang",\n "es6": "JavaScript",\n "escript": "Erlang",\n "esdl": "EdgeQL",\n "ex": "Elixir",\n "exs": "Elixir",\n "eye": "Ruby",\n "f": "Fortran",\n "f03": "Fortran",\n "f08": "Fortran",\n "f77": "Fortran",\n "f90": "Fortran",\n "f95": "Fortran",\n "factor": "Factor",\n "fan": "Fantom",\n "fancypack": "Fancy",\n "fbs": "FlatBuffers",\n "fcgi": "Lua",\n "feature": "Gherkin",\n "filters": "XML",\n "fir": "FIRRTL",\n "fish": "Shell",\n "flex": "Lex",\n "flf": "FIGlet Font",\n "flix": "Flix",\n "flux": "FLUX",\n "fnc": "PLSQL",\n "fnl": "Fennel",\n "for": "Fortran",\n "forth": "Forth",\n "fp": "GLSL",\n "fpp": "Fortran",\n "fr": "Frege",\n "frag": "GLSL",\n "frg": "GLSL",\n "frm": "VBA",\n "frt": "Forth",\n "fs": "F#",\n "fsh": "GLSL",\n "fshader": "GLSL",\n "fsi": "F#",\n "fsproj": "XML",\n "fst": "F*",\n "fsti": "F*",\n "fsx": "F#",\n "fth": "Forth",\n "ftl": "Fluent",\n "ftlh": "FreeMarker",\n "fun": "Standard ML",\n "fut": "Futhark",\n "fx": "FLUX",\n "fxh": "HLSL",\n "fxml": "XML",\n "fy": "Fancy",\n "g": "G-code",\n "g4": "ANTLR",\n "gaml": "GAML",\n "gap": "GAP",\n "gawk": "Awk",\n "gbl": "Gerber Image",\n "gbo": "Gerber Image",\n "gbp": "Gerber Image",\n "gbr": "Gerber Image",\n "gbs": "Gerber Image",\n "gco": "G-code",\n "gcode": "G-code",\n "gd": "GDScript",\n "gdnlib": "Godot Resource",\n "gdns": "Godot Resource",\n "gdshader": "GDShader",\n "gdshaderinc": "GDShader",\n "ged": "GEDCOM",\n "gemspec": "Ruby",\n "geo": "GLSL",\n "geojson": "JSON",\n "geom": "GLSL",\n "gf": "Grammatical Framework",\n "gi": "GAP",\n "gitconfig": "INI",\n "gitignore": "Ignore List",\n "gjs": "JavaScript",\n "gko": "Gerber Image",\n "glade": "XML",\n "gleam": "Gleam",\n "glf": "Glyph",\n "glsl": "GLSL",\n "glslf": "GLSL",\n "glslv": "GLSL",\n "gltf": "JSON",\n "gmi": "Gemini",\n "gml": "Game Maker Language",\n "gms": "GAMS",\n "gmx": "XML",\n "gnu": "Gnuplot",\n "gnuplot": "Gnuplot",\n "go": "Go",\n "god": "Ruby",\n "gohtml": "Go Template",\n "golo": "Golo",\n "gotmpl": "Go Template",\n "gp": "Gnuplot",\n "gpb": "Gerber Image",\n "gpt": "Gerber Image",\n "gpx": "XML",\n "gql": "GraphQL",\n "grace": "Grace",\n "gradle": "Gradle",\n "gradle.kts": "Gradle",\n "graphql": "GraphQL",\n "graphqls": "GraphQL",\n "groovy": "Groovy",\n "grt": "Groovy",\n "grxml": "XML",\n "gs": "Genie",\n "gsc": "GSC",\n "gsh": "GSC",\n "gshader": "GLSL",\n "gsp": "Groovy",\n "gst": "Gosu",\n "gsx": "Gosu",\n "gtl": "Gerber Image",\n "gto": "Gerber Image",\n "gtp": "Gerber Image",\n "gtpl": "Groovy",\n "gts": "TypeScript",\n "gv": "Graphviz (DOT)",\n "gvy": "Groovy",\n "gyp": "Python",\n "gypi": "Python",\n "h": "C",\n "h++": "C++",\n "h.in": "C",\n "ha": "Hare",\n "hack": "Hack",\n "haml": "Haml",\n "haml.deface": "Haml",\n "handlebars": "Handlebars",\n "har": "JSON",\n "hats": "ATS",\n "hb": "Harbour",\n "hbs": "Handlebars",\n "hc": "HolyC",\n "hcl": "HCL",\n "heex": "HTML",\n "hh": "C++",\n "hhi": "Hack",\n "hic": "Clojure",\n "hip": "HIP",\n "hlsl": "HLSL",\n "hlsli": "HLSL",\n "hocon": "HOCON",\n "hoon": "hoon",\n "hpp": "C++",\n "hqf": "SQF",\n "hql": "HiveQL",\n "hrl": "Erlang",\n "hs": "Haskell",\n "hs-boot": "Haskell",\n "hsc": "Haskell",\n "hta": "HTML",\n "htm": "HTML",\n "html": "HTML",\n "html.eex": "HTML",\n "html.hl": "HTML",\n "html.tmpl": "Go Template",\n "http": "HTTP",\n "hurl": "Hurl",\n "hx": "Haxe",\n "hxml": "HXML",\n "hxsl": "Haxe",\n "hxx": "C++",\n "hy": "Hy",\n "hzp": "XML",\n "i": "Assembly",\n "i3": "Modula-3",\n "ical": "iCalendar",\n "ice": "Slice",\n "iced": "CoffeeScript",\n "icl": "Clean",\n "icls": "XML",\n "ics": "iCalendar",\n "idc": "C",\n "idr": "Idris",\n "ig": "Modula-3",\n "ihlp": "Stata",\n "ijm": "ImageJ Macro",\n "ijs": "J",\n "ik": "Ioke",\n "il": "IL Assembly",\n "ily": "LilyPond",\n "imba": "Imba",\n "iml": "XML",\n "inc": "Assembly",\n "ini": "INI",\n "inl": "C++",\n "ino": "C++",\n "ins": "TeX",\n "intr": "Dylan",\n "io": "Io",\n "iol": "Jolie",\n "ipf": "IGOR Pro",\n "ipp": "C++",\n "ipynb": "Jupyter Notebook",\n "isl": "Inno Setup",\n "ispc": "ISPC",\n "iss": "Inno Setup",\n "iuml": "PlantUML",\n "ivy": "XML",\n "ixx": "C++",\n "j": "Jasmin",\n "j2": "Jinja",\n "jac": "Jac",\n "jade": "Pug",\n "jai": "Jai",\n "jake": "JavaScript",\n "janet": "Janet",\n "jav": "Java",\n "java": "Java",\n "javascript": "JavaScript",\n "jbuilder": "Ruby",\n "jcl": "JCL",\n "jelly": "XML",\n "jflex": "Lex",\n "jinja": "Jinja",\n "jinja2": "Jinja",\n "jison": "Yacc",\n "jisonlex": "Lex",\n "jl": "Julia",\n "jq": "JSONiq",\n "js": "JavaScript",\n "js.erb": "JavaScript",\n "jsb": "JavaScript",\n "jscad": "JavaScript",\n "jsfl": "JavaScript",\n "jsh": "Java",\n "jslib": "JavaScript",\n "jsm": "JavaScript",\n "json": "JSON",\n "json-tmlanguage": "JSON",\n "json.example": "JSON",\n "json5": "JSON5",\n "jsonc": "JSON",\n "jsonl": "JSON",\n "jsonld": "JSONLD",\n "jsonnet": "Jsonnet",\n "jsp": "Java",\n "jspre": "JavaScript",\n "jsproj": "XML",\n "jss": "JavaScript",\n "jst": "EJS",\n "jsx": "JavaScript",\n "jte": "Java",\n "just": "Just",\n "k": "KCL",\n "kak": "KakouneScript",\n "kdl": "KDL",\n "kicad_mod": "KiCad Layout",\n "kicad_pcb": "KiCad Layout",\n "kicad_sch": "KiCad Schematic",\n "kicad_sym": "KiCad Schematic",\n "kicad_wks": "KiCad Layout",\n "kid": "Genshi",\n "kk": "Koka",\n "kml": "XML",\n "kojo": "Scala",\n "krl": "KRL",\n "ks": "KerboScript",\n "ksh": "Shell",\n "ksy": "Kaitai Struct",\n "kt": "Kotlin",\n "ktm": "Kotlin",\n "kts": "Kotlin",\n "kv": "kvlang",\n "l": "Common Lisp",\n "lagda": "Agda",\n "langium": "Langium",\n "lark": "Lark",\n "las": "Lasso",\n "lasso": "Lasso",\n "lasso8": "Lasso",\n "lasso9": "Lasso",\n "latte": "Latte",\n "launch": "XML",\n "lbx": "TeX",\n "leex": "HTML",\n "lektorproject": "INI",\n "leo": "Leo",\n "less": "Less",\n "lex": "Lex",\n "lfe": "LFE",\n "lgt": "Logtalk",\n "lhs": "Haskell",\n "libsonnet": "Jsonnet",\n "lid": "Dylan",\n "lidr": "Idris",\n "ligo": "LigoLANG",\n "linq": "C#",\n "liq": "Liquidsoap",\n "liquid": "Liquid",\n "lisp": "Common Lisp",\n "litcoffee": "CoffeeScript",\n "livecodescript": "LiveCode Script",\n "livemd": "Markdown",\n "lkml": "LookML",\n "ll": "LLVM",\n "lmi": "Python",\n "logtalk": "Logtalk",\n "lol": "LOLCODE",\n "lookml": "LookML",\n "lp": "Answer Set Programming",\n "lpr": "Pascal",\n "ls": "LiveScript",\n "lsl": "LSL",\n "lslp": "LSL",\n "lsp": "Common Lisp",\n "ltx": "TeX",\n "lua": "Lua",\n "luau": "Luau",\n "lvclass": "LabVIEW",\n "lvlib": "LabVIEW",\n "lvproj": "LabVIEW",\n "ly": "LilyPond",\n "m": "Objective-C",\n "m2": "Macaulay2",\n "m3": "Modula-3",\n "m3u": "M3U",\n "m3u8": "M3U",\n "ma": "Wolfram Language",\n "mak": "Makefile",\n "make": "Makefile",\n "makefile": "Makefile",\n "mako": "Mako",\n "man": "Roff",\n "mao": "Mako",\n "markdown": "Markdown",\n "marko": "Marko",\n "mask": "Mask",\n "mat": "Unity3D Asset",\n "mata": "Stata",\n "matah": "Stata",\n "mathematica": "Wolfram Language",\n "matlab": "MATLAB",\n "mawk": "Awk",\n "maxhelp": "Max",\n "maxpat": "Max",\n "maxproj": "Max",\n "mbt": "MoonBit",\n "mc": "Monkey C",\n "mcfunction": "mcfunction",\n "mch": "B (Formal Method)",\n "mcmeta": "JSON",\n "mcr": "MAXScript",\n "md": "Markdown",\n "mdoc": "Roff",\n "mdown": "Markdown",\n "mdpolicy": "XML",\n "mdwn": "Markdown",\n "mdx": "MDX",\n "me": "Roff",\n "mediawiki": "Wikitext",\n "mermaid": "Mermaid",\n "meta": "Unity3D Asset",\n "metal": "Metal",\n "metta": "MeTTa",\n "mg": "Modula-3",\n "mint": "Mint",\n "mir": "YAML",\n "mirah": "Mirah",\n "mjml": "XML",\n "mjs": "JavaScript",\n "mk": "Makefile",\n "mkd": "Markdown",\n "mkdn": "Markdown",\n "mkdown": "Markdown",\n "mkfile": "Makefile",\n "mkii": "TeX",\n "mkiv": "TeX",\n "mkvi": "TeX",\n "ml": "OCaml",\n "ml4": "OCaml",\n "mli": "OCaml",\n "mligo": "LigoLANG",\n "mlir": "MLIR",\n "mll": "OCaml",\n "mly": "OCaml",\n "mm": "Objective-C++",\n "mmd": "Mermaid",\n "mo": "Modelica",\n "mod": "Modula-2",\n "mojo": "Mojo",\n "moo": "Mercury",\n "moon": "MoonScript",\n "move": "Move",\n "mpl": "JetBrains MPS",\n "mps": "JetBrains MPS",\n "mq4": "MQL4",\n "mq5": "MQL5",\n "mqh": "MQL4",\n "mrc": "mIRC Script",\n "ms": "MAXScript",\n "msd": "JetBrains MPS",\n "msg": "OMNeT++ MSG",\n "mspec": "Ruby",\n "mt": "Wolfram Language",\n "mtml": "MTML",\n "mts": "TypeScript",\n "mu": "mupad",\n "mud": "ZIL",\n "mustache": "Mustache",\n "mxml": "XML",\n "mxt": "Max",\n "mysql": "SQL",\n "mzn": "MiniZinc",\n "n": "Nemerle",\n "nanorc": "INI",\n "nas": "Nasal",\n "nasm": "Assembly",\n "natvis": "XML",\n "nawk": "Awk",\n "nb": "Wolfram Language",\n "nbp": "Wolfram Language",\n "nc": "nesC",\n "ncl": "NCL",\n "ndproj": "XML",\n "ne": "Nearley",\n "nearley": "Nearley",\n "ned": "OMNeT++ NED",\n "nf": "Nextflow",\n "nginx": "Nginx",\n "nginxconf": "Nginx",\n "nim": "Nim",\n "nim.cfg": "Nim",\n "nimble": "Nim",\n "nimrod": "Nim",\n "nims": "Nim",\n "nit": "Nit",\n "nix": "Nix",\n "njk": "Nunjucks",\n "njs": "JavaScript",\n "nl": "NewLisp",\n "nlogo": "NetLogo",\n "nomad": "HCL",\n "nproj": "XML",\n "nqp": "Raku",\n "nr": "Noir",\n "nse": "Lua",\n "nss": "NWScript",\n "nu": "Nu",\n "numpy": "Python",\n "numpyw": "Python",\n "numsc": "Python",\n "nuspec": "XML",\n "nut": "Squirrel",\n "ny": "Common Lisp",\n "odd": "XML",\n "odin": "Odin",\n "ol": "Jolie",\n "omgrofl": "Omgrofl",\n "ooc": "ooc",\n "opal": "Opal",\n "opencl": "C",\n "orc": "Csound",\n "org": "Org",\n "os": "1C Enterprise",\n "osm": "XML",\n "outjob": "Altium Designer",\n "overpassql": "OverpassQL",\n "owl": "Web Ontology Language",\n "oxygene": "Oxygene",\n "oz": "Oz",\n "p": "OpenEdge ABL",\n "p4": "P4",\n "p6": "Raku",\n "p6l": "Raku",\n "p6m": "Raku",\n "p8": "Lua",\n "pac": "JavaScript",\n "pact": "Pact",\n "pan": "Pan",\n "parrot": "Parrot",\n "pas": "Pascal",\n "pascal": "Pascal",\n "pat": "Max",\n "pb": "PureBasic",\n "pbi": "PureBasic",\n "pbt": "PowerBuilder",\n "pcbdoc": "Altium Designer",\n "pck": "PLSQL",\n "pcss": "CSS",\n "pd_lua": "Lua",\n "pddl": "PDDL",\n "pde": "Processing",\n "peggy": "PEG.js",\n "pegjs": "PEG.js",\n "pep": "Pep8",\n "per": "Genero per",\n "perl": "Perl",\n "pfa": "PostScript",\n "pgsql": "PLpgSQL",\n "ph": "Perl",\n "php": "PHP",\n "php3": "PHP",\n "php4": "PHP",\n "php5": "PHP",\n "phps": "PHP",\n "phpt": "PHP",\n "phtml": "HTML",\n "pig": "PigLatin",\n "pike": "Pike",\n "pkb": "PLSQL",\n "pkgproj": "XML",\n "pkl": "Pkl",\n "pks": "PLSQL",\n "pl": "Perl",\n "pl6": "Raku",\n "plantuml": "PlantUML",\n "plb": "PLSQL",\n "plist": "XML",\n "plot": "Gnuplot",\n "pls": "PLSQL",\n "plsql": "PLSQL",\n "plt": "Gnuplot",\n "pluginspec": "Ruby",\n "plx": "Perl",\n "pm": "Perl",\n "pm6": "Raku",\n "pml": "Promela",\n "pmod": "Pike",\n "podsl": "Common Lisp",\n "podspec": "Ruby",\n "pogo": "PogoScript",\n "polar": "Polar",\n "por": "Portugol",\n "postcss": "CSS",\n "pov": "POV-Ray SDL",\n "pp": "Puppet",\n "pprx": "REXX",\n "praat": "Praat",\n "prawn": "Ruby",\n "prc": "PLSQL",\n "prefab": "Unity3D Asset",\n "prefs": "INI",\n "prg": "xBase",\n "prisma": "Prisma",\n "prjpcb": "Altium Designer",\n "pro": "Prolog",\n "proj": "XML",\n "prolog": "Prolog",\n "properties": "Java Properties",\n "props": "XML",\n "prw": "xBase",\n "ps": "PostScript",\n "ps1": "PowerShell",\n "ps1xml": "XML",\n "psc": "Papyrus",\n "psc1": "XML",\n "psd1": "PowerShell",\n "psgi": "Perl",\n "psm1": "PowerShell",\n "pt": "XML",\n "pubxml": "XML",\n "pug": "Pug",\n "puml": "PlantUML",\n "purs": "PureScript",\n "pwn": "Pawn",\n "pxd": "Cython",\n "pxi": "Cython",\n "py": "Python",\n "py3": "Python",\n "pyde": "Python",\n "pyi": "Python",\n "pyp": "Python",\n "pyt": "Python",\n "pytb": "Python",\n "pyw": "Python",\n "pyx": "Cython",\n "q": "HiveQL",\n "qasm": "OpenQASM",\n "qbs": "QML",\n "qc": "QuakeC",\n "qhelp": "XML",\n "ql": "CodeQL",\n "qll": "CodeQL",\n "qmd": "RMarkdown",\n "qml": "QML",\n "qnt": "Quint",\n "qs": "Q#",\n "r": "R",\n "r2": "Rebol",\n "r3": "Rebol",\n "rabl": "Ruby",\n "rake": "Ruby",\n "raku": "Raku",\n "rakumod": "Raku",\n "raml": "RAML",\n "rascript": "RAScript",\n "razor": "HTML",\n "rb": "Ruby",\n "rbi": "Ruby",\n "rbs": "Ruby",\n "rbuild": "Ruby",\n "rbw": "Ruby",\n "rbx": "Ruby",\n "rbxs": "Lua",\n "rchit": "GLSL",\n "rd": "R",\n "rdf": "XML",\n "rdoc": "RDoc",\n "re": "Reason",\n "reb": "Rebol",\n "rebol": "Rebol",\n "red": "Red",\n "reds": "Red",\n "reek": "YAML",\n "reg": "Windows Registry Entries",\n "regex": "Regular Expression",\n "regexp": "Regular Expression",\n "rego": "Open Policy Agent",\n "rei": "Reason",\n "religo": "LigoLANG",\n "res": "ReScript",\n "resi": "ReScript",\n "resource": "RobotFramework",\n "rest": "reStructuredText",\n "rest.txt": "reStructuredText",\n "resx": "XML",\n "rex": "REXX",\n "rexx": "REXX",\n "rg": "Rouge",\n "rhtml": "HTML",\n "ring": "Ring",\n "riot": "Riot",\n "rkt": "Racket",\n "rktd": "Racket",\n "rktl": "Racket",\n "rl": "Ragel",\n "rmd": "RMarkdown",\n "rmiss": "GLSL",\n "rnh": "RUNOFF",\n "rno": "RUNOFF",\n "rnw": "Sweave",\n "robot": "RobotFramework",\n "roc": "Roc",\n "rockspec": "Lua",\n "roff": "Roff",\n "ron": "RON",\n "ronn": "Markdown",\n "rpgle": "RPGLE",\n "rpy": "Ren\'Py",\n "rq": "SPARQL",\n "rs": "Rust",\n "rs.in": "Rust",\n "rsc": "Rascal",\n "rss": "XML",\n "rst": "reStructuredText",\n "rst.txt": "reStructuredText",\n "rsx": "R",\n "ru": "Ruby",\n "ruby": "Ruby",\n "rviz": "YAML",\n "s": "Assembly",\n "sail": "Sail",\n "sarif": "JSON",\n "sas": "SAS",\n "sass": "Sass",\n "sats": "ATS",\n "sbatch": "Shell",\n "sbt": "Scala",\n "sc": "SuperCollider",\n "scad": "OpenSCAD",\n "scala": "Scala",\n "scaml": "Scaml",\n "scd": "SuperCollider",\n "sce": "Scilab",\n "scenic": "Scenic",\n "sch": "Scheme",\n "schdoc": "Altium Designer",\n "sci": "Scilab",\n "scm": "Scheme",\n "sco": "Csound Score",\n "scpt": "AppleScript",\n "scrbl": "Racket",\n "scss": "SCSS",\n "scxml": "XML",\n "sdc": "Tcl",\n "sed": "sed",\n "self": "Self",\n "sexp": "Common Lisp",\n "sfproj": "XML",\n "sfv": "Checksums",\n "sh": "Shell",\n "sh.in": "Shell",\n "shader": "ShaderLab",\n "shen": "Shen",\n "shproj": "XML",\n "sig": "Standard ML",\n "sj": "Objective-J",\n "sjs": "JavaScript",\n "sl": "Slash",\n "slang": "Slang",\n "sld": "Scheme",\n "slim": "Slim",\n "slint": "Slint",\n "slnx": "XML",\n "sls": "SaltStack",\n "slurm": "Shell",\n "sma": "Pawn",\n "smithy": "Smithy",\n "smk": "Python",\n "sml": "Standard ML",\n "snakefile": "Python",\n "snap": "Jest Snapshot",\n "snip": "Vim Snippet",\n "snippet": "Vim Snippet",\n "snippets": "Vim Snippet",\n "sol": "Solidity",\n "soy": "Closure Templates",\n "sp": "SourcePawn",\n "sparql": "SPARQL",\n "spc": "PLSQL",\n "spec": "Python",\n "spin": "Propeller Spin",\n "sps": "Scheme",\n "sqf": "SQF",\n "sql": "SQL",\n "sqlrpgle": "RPGLE",\n "sra": "PowerBuilder",\n "srdf": "XML",\n "srt": "SRecode Template",\n "sru": "PowerBuilder",\n "srv": "ROS Interface",\n "srw": "PowerBuilder",\n "ss": "Scheme",\n "ssjs": "JavaScript",\n "sss": "SugarSS",\n "st": "Smalltalk",\n "stan": "Stan",\n "star": "Starlark",\n "sthlp": "Stata",\n "stl": "STL",\n "story": "Gherkin",\n "storyboard": "XML",\n "sttheme": "XML",\n "sty": "TeX",\n "styl": "Stylus",\n "sublime-build": "JSON",\n "sublime-color-scheme": "JSON",\n "sublime-commands": "JSON",\n "sublime-completions": "JSON",\n "sublime-keymap": "JSON",\n "sublime-macro": "JSON",\n "sublime-menu": "JSON",\n "sublime-mousemap": "JSON",\n "sublime-project": "JSON",\n "sublime-settings": "JSON",\n "sublime-snippet": "XML",\n "sublime-syntax": "YAML",\n "sublime-theme": "JSON",\n "sublime-workspace": "JSON",\n "sublime_metrics": "JSON",\n "sublime_session": "JSON",\n "surql": "SurrealQL",\n "sv": "SystemVerilog",\n "svelte": "Svelte",\n "svg": "SVG",\n "svh": "SystemVerilog",\n "svx": "mdsvex",\n "sw": "Sway",\n "swift": "Swift",\n "syntax": "YAML",\n "t": "Perl",\n "tab": "SQL",\n "tac": "Python",\n "tact": "Tact",\n "tag": "Java",\n "talon": "Talon",\n "targets": "XML",\n "tcc": "C++",\n "tcl": "Tcl",\n "tcl.in": "Tcl",\n "templ": "templ",\n "tesc": "GLSL",\n "tese": "GLSL",\n "tex": "TeX",\n "textgrid": "TextGrid",\n "textile": "Textile",\n "tf": "HCL",\n "tfstate": "JSON",\n "tfstate.backup": "JSON",\n "tftpl": "HCL",\n "tfvars": "HCL",\n "thor": "Ruby",\n "thrift": "Thrift",\n "thy": "Isabelle",\n "tl": "Teal",\n "tla": "TLA",\n "tlv": "TL-Verilog",\n "tm": "Tcl",\n "tmac": "Roff",\n "tmcommand": "XML",\n "tmdl": "TMDL",\n "tml": "XML",\n "tmlanguage": "XML",\n "tmpl": "Go Template",\n "tmpreferences": "XML",\n "tmsnippet": "XML",\n "tmtheme": "XML",\n "tmux": "Shell",\n "toc": "TeX",\n "tofu": "HCL",\n "toit": "Toit",\n "toml": "TOML",\n "toml.example": "TOML",\n "tool": "Shell",\n "topojson": "JSON",\n "tpb": "PLSQL",\n "tpl": "Smarty",\n "tpp": "C++",\n "tps": "PLSQL",\n "tres": "Godot Resource",\n "trg": "PLSQL",\n "trigger": "Apex",\n "ts": "TypeScript",\n "tscn": "Godot Resource",\n "tsconfig.json": "JSON",\n "tsp": "TypeSpec",\n "tst": "GAP",\n "tsv": "TSV",\n "tsx": "TypeScript",\n "tu": "Turing",\n "twig": "Twig",\n "txl": "TXL",\n "txt": "Adblock Filter List",\n "txx": "C++",\n "typ": "Typst",\n "uc": "UnrealScript",\n "udf": "SQL",\n "udo": "Csound",\n "ui": "XML",\n "unity": "Unity3D Asset",\n "uno": "Uno",\n "upc": "C",\n "uplc": "Untyped Plutus Core",\n "ur": "UrWeb",\n "urdf": "XML",\n "url": "INI",\n "urs": "UrWeb",\n "ux": "XML",\n "v": "Verilog",\n "vala": "Vala",\n "vapi": "Vala",\n "vark": "Gosu",\n "vb": "Visual Basic .NET",\n "vba": "VBA",\n "vbhtml": "Visual Basic .NET",\n "vbproj": "XML",\n "vbs": "VBScript",\n "vcf": "vCard",\n "vcl": "VCL",\n "vcxproj": "XML",\n "vdf": "Valve Data Format",\n "veo": "Verilog",\n "vert": "GLSL",\n "vh": "SystemVerilog",\n "vhd": "VHDL",\n "vhdl": "VHDL",\n "vhf": "VHDL",\n "vhi": "VHDL",\n "vho": "VHDL",\n "vhost": "ApacheConf",\n "vhs": "VHDL",\n "vht": "VHDL",\n "vhw": "VHDL",\n "vim": "Vim Script",\n "vimrc": "Vim Script",\n "viw": "SQL",\n "vmb": "Vim Script",\n "volt": "Volt",\n "vrx": "GLSL",\n "vs": "GLSL",\n "vsh": "GLSL",\n "vshader": "GLSL",\n "vsixmanifest": "XML",\n "vssettings": "XML",\n "vstemplate": "XML",\n "vtl": "Velocity Template Language",\n "vto": "Vento",\n "vue": "Vue",\n "vw": "PLSQL",\n "vxml": "XML",\n "vy": "Vyper",\n "w": "CWeb",\n "wast": "WebAssembly",\n "wat": "WebAssembly",\n "watchr": "Ruby",\n "wdl": "WDL",\n "webapp": "JSON",\n "webmanifest": "JSON",\n "wgsl": "WGSL",\n "whiley": "Whiley",\n "wiki": "Wikitext",\n "wikitext": "Wikitext",\n "wisp": "wisp",\n "wit": "WebAssembly Interface Type",\n "wixproj": "XML",\n "wl": "Wolfram Language",\n "wlk": "Wollok",\n "wls": "Wolfram Language",\n "wlt": "Wolfram Language",\n "wlua": "Lua",\n "workbook": "Markdown",\n "workflow": "HCL",\n "wren": "Wren",\n "ws": "Witcher Script",\n "wsdl": "XML",\n "wsf": "XML",\n "wsgi": "Python",\n "wxi": "XML",\n "wxl": "XML",\n "wxs": "XML",\n "x": "DirectX 3D File",\n "x10": "X10",\n "x3d": "XML",\n "x68": "Assembly",\n "xacro": "XML",\n "xaml": "XML",\n "xc": "XC",\n "xdc": "Tcl",\n "xht": "HTML",\n "xhtml": "HTML",\n "xib": "XML",\n "xlf": "XML",\n "xliff": "XML",\n "xmi": "XML",\n "xml": "XML",\n "xml.dist": "XML",\n "xmp": "XML",\n "xojo_code": "Xojo",\n "xojo_menu": "Xojo",\n "xojo_report": "Xojo",\n "xojo_script": "Xojo",\n "xojo_toolbar": "Xojo",\n "xojo_window": "Xojo",\n "xproj": "XML",\n "xpy": "Python",\n "xq": "XQuery",\n "xql": "XQuery",\n "xqm": "XQuery",\n "xquery": "XQuery",\n "xqy": "XQuery",\n "xrl": "Erlang",\n "xsd": "XML",\n "xsh": "Xonsh",\n "xsjs": "JavaScript",\n "xsjslib": "JavaScript",\n "xsl": "XSLT",\n "xslt": "XSLT",\n "xspec": "XML",\n "xtend": "Xtend",\n "xul": "XML",\n "xzap": "ZAP",\n "y": "Yacc",\n "yacc": "Yacc",\n "yaml": "MiniYAML",\n "yaml-tmlanguage": "YAML",\n "yaml.sed": "YAML",\n "yap": "Prolog",\n "yar": "YARA",\n "yara": "YARA",\n "yasnippet": "YASnippet",\n "yml": "YAML",\n "yml.mysql": "YAML",\n "yrl": "Erlang",\n "yul": "Yul",\n "yy": "Yacc",\n "yyp": "JSON",\n "zap": "ZAP",\n "zcml": "XML",\n "zed": "SpiceDB Schema",\n "zep": "Zephir",\n "zig": "Zig",\n "zig.zon": "Zig",\n "zil": "ZIL",\n "zimpl": "Zimpl",\n "zmodel": "Zmodel",\n "zmpl": "Zimpl",\n "zpl": "Zimpl",\n "zs": "ZenScript",\n "zsh": "Shell",\n "zsh-theme": "Shell"\n },\n "filename": {\n ".abbrev_defs": "Emacs Lisp",\n ".ackrc": "Option List",\n ".all-contributorsrc": "JSON",\n ".arcconfig": "JSON",\n ".atomignore": "Ignore List",\n ".auto-changelog": "JSON",\n ".babelignore": "Ignore List",\n ".babelrc": "JSON",\n ".bash_aliases": "Shell",\n ".bash_functions": "Shell",\n ".bash_history": "Shell",\n ".bash_logout": "Shell",\n ".bash_profile": "Shell",\n ".bashrc": "Shell",\n ".browserslistrc": "Browserslist",\n ".buckconfig": "INI",\n ".bzrignore": "Ignore List",\n ".c8rc": "JSON",\n ".clang-format": "YAML",\n ".clang-tidy": "YAML",\n ".clangd": "YAML",\n ".classpath": "XML",\n ".coffeelintignore": "Ignore List",\n ".coveragerc": "INI",\n ".cproject": "XML",\n ".cshrc": "Shell",\n ".cvsignore": "Ignore List",\n ".devcontainer.json": "JSON",\n ".dockerignore": "Ignore List",\n ".easignore": "Ignore List",\n ".editorconfig": "INI",\n ".eleventyignore": "Ignore List",\n ".emacs": "Emacs Lisp",\n ".emacs.desktop": "Emacs Lisp",\n ".env": "Dotenv",\n ".env.ci": "Dotenv",\n ".env.dev": "Dotenv",\n ".env.development": "Dotenv",\n ".env.development.local": "Dotenv",\n ".env.example": "Dotenv",\n ".env.local": "Dotenv",\n ".env.prod": "Dotenv",\n ".env.production": "Dotenv",\n ".env.sample": "Dotenv",\n ".env.staging": "Dotenv",\n ".env.template": "Dotenv",\n ".env.test": "Dotenv",\n ".env.testing": "Dotenv",\n ".envrc": "Shell",\n ".eslintignore": "Ignore List",\n ".eslintrc.json": "JSON",\n ".exrc": "Vim Script",\n ".factor-boot-rc": "Factor",\n ".factor-rc": "Factor",\n ".flake8": "INI",\n ".flaskenv": "Shell",\n ".gclient": "Python",\n ".gemrc": "YAML",\n ".git-blame-ignore-revs": "Git Revision List",\n ".gitattributes": "Git Attributes",\n ".gitconfig": "INI",\n ".gitignore": "Ignore List",\n ".gitmodules": "INI",\n ".gnus": "Emacs Lisp",\n ".gvimrc": "Vim Script",\n ".htaccess": "ApacheConf",\n ".htmlhintrc": "JSON",\n ".ignore": "Ignore List",\n ".imgbotconfig": "JSON",\n ".irbrc": "Ruby",\n ".jscsrc": "JSON",\n ".jshintrc": "JSON",\n ".jslintrc": "JSON",\n ".justfile": "Just",\n ".kshrc": "Shell",\n ".latexmkrc": "Perl",\n ".login": "Shell",\n ".luacheckrc": "Lua",\n ".markdownlintignore": "Ignore List",\n ".nanorc": "INI",\n ".nodemonignore": "Ignore List",\n ".npmignore": "Ignore List",\n ".npmrc": "INI",\n ".nvimrc": "Vim Script",\n ".nycrc": "JSON",\n ".oxlintrc.json": "JSON",\n ".php": "PHP",\n ".php_cs": "PHP",\n ".php_cs.dist": "PHP",\n ".prettierignore": "Ignore List",\n ".profile": "Shell",\n ".project": "XML",\n ".pryrc": "Ruby",\n ".pylintrc": "INI",\n ".rprofile": "R",\n ".rspec": "Option List",\n ".scalafix.conf": "HOCON",\n ".scalafmt.conf": "HOCON",\n ".shellcheckrc": "ShellCheck Config",\n ".simplecov": "Ruby",\n ".spacemacs": "Emacs Lisp",\n ".stylelintignore": "Ignore List",\n ".swcrc": "JSON",\n ".tern-config": "JSON",\n ".tern-project": "JSON",\n ".tm_properties": "TextMate Properties",\n ".tmux.conf": "Shell",\n ".vercelignore": "Ignore List",\n ".vimrc": "Vim Script",\n ".viper": "Emacs Lisp",\n ".vscodeignore": "Ignore List",\n ".watchmanconfig": "JSON",\n ".xinitrc": "Shell",\n ".xsession": "Shell",\n ".yardopts": "Option List",\n ".zlogin": "Shell",\n ".zlogout": "Shell",\n ".zprofile": "Shell",\n ".zshenv": "Shell",\n ".zshrc": "Shell",\n "9fs": "Shell",\n "_emacs": "Emacs Lisp",\n "_helpers.tpl": "Go Template",\n "_vimrc": "Vim Script",\n "abbrev_defs": "Emacs Lisp",\n "ack": "Perl",\n "ackrc": "Option List",\n "ant.xml": "Ant Build System",\n "apache2.conf": "ApacheConf",\n "api-extractor.json": "JSON",\n "apkbuild": "Shell",\n "app.config": "XML",\n "appraisals": "Ruby",\n "bash_aliases": "Shell",\n "bash_logout": "Shell",\n "bash_profile": "Shell",\n "bashrc": "Shell",\n "berksfile": "Ruby",\n "brewfile": "Ruby",\n "browserslist": "Browserslist",\n "bsdmakefile": "Makefile",\n "buck": "Starlark",\n "build": "Starlark",\n "build.bazel": "Starlark",\n "build.xml": "Ant Build System",\n "buildfile": "Ruby",\n "buildozer.spec": "INI",\n "bun.lock": "JSON",\n "cabal.config": "Cabal Config",\n "cabal.project": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cakefile": "CoffeeScript",\n "capfile": "Ruby",\n "cargo.lock": "TOML",\n "cargo.toml.orig": "TOML",\n "cask": "Emacs Lisp",\n "citation.cff": "YAML",\n "cmakelists.txt": "CMake",\n "commit_editmsg": "Git Commit",\n "composer.lock": "JSON",\n "containerfile": "Dockerfile",\n "contents.lr": "Markdown",\n "cpanfile": "Perl",\n "crontab": "crontab",\n "cshrc": "Shell",\n "dangerfile": "Ruby",\n "deliverfile": "Ruby",\n "deno.lock": "JSON",\n "deps": "Python",\n "dev-requirements.txt": "Pip Requirements",\n "devcontainer.json": "JSON",\n "dockerfile": "Dockerfile",\n "dune-project": "Dune",\n "earthfile": "Earthly",\n "eask": "Emacs Lisp",\n "emakefile": "Erlang",\n "eqnrc": "Roff",\n "expr-dist": "R",\n "fakefile": "Fancy",\n "fastfile": "Ruby",\n "firestore.rules": "Cloud Firestore Security Rules",\n "flake.lock": "JSON",\n "fp-lib-table": "KiCad Layout",\n "gemfile": "Ruby",\n "gemfile.lock": "Gemfile.lock",\n "gitignore-global": "Ignore List",\n "gitignore_global": "Ignore List",\n "glide.lock": "YAML",\n "gnumakefile": "Makefile",\n "go.mod": "Go Module",\n "go.sum": "Go Checksums",\n "go.work": "Go Workspace",\n "go.work.sum": "Go Checksums",\n "gopkg.lock": "TOML",\n "gradlew": "Shell",\n "gradlew.bat": "Batchfile",\n "guardfile": "Ruby",\n "gvimrc": "Vim Script",\n "haproxy.cfg": "HAProxy",\n "hosts": "Hosts File",\n "hosts.txt": "Hosts File",\n "httpd.conf": "ApacheConf",\n "installscript.qs": "Qt Script",\n "jakefile": "JavaScript",\n "jarfile": "Ruby",\n "jenkinsfile": "Groovy",\n "jsconfig.json": "JSON",\n "justfile": "Just",\n "kakrc": "KakouneScript",\n "kbuild": "Makefile",\n "kcl.mod": "KCL",\n "kcl.mod.lock": "KCL",\n "kshrc": "Shell",\n "language-configuration.json": "JSON",\n "language-subtag-registry.txt": "Record Jar",\n "latexmkrc": "Perl",\n "lexer.x": "Lex",\n "login": "Shell",\n "m3makefile": "Quake",\n "m3overrides": "Quake",\n "makefile": "Makefile",\n "makefile.am": "Makefile",\n "makefile.boot": "Makefile",\n "makefile.frag": "Makefile",\n "makefile.in": "Makefile",\n "makefile.inc": "Makefile",\n "makefile.pl": "Perl",\n "makefile.sco": "Makefile",\n "makefile.wat": "Makefile",\n "man": "Shell",\n "manifest.mf": "JAR Manifest",\n "mavenfile": "Ruby",\n "mcmod.info": "JSON",\n "meson.build": "Meson",\n "meson_options.txt": "Meson",\n "mise.local.lock": "TOML",\n "mise.lock": "TOML",\n "mix.lock": "Elixir",\n "mkfile": "Makefile",\n "mmn": "Roff",\n "mmt": "Roff",\n "mocha.opts": "Option List",\n "module.bazel": "Starlark",\n "module.bazel.lock": "JSON",\n "modulefile": "Puppet",\n "mvnw": "Shell",\n "mvnw.cmd": "Batchfile",\n "nanorc": "INI",\n "nextflow.config": "Nextflow",\n "nginx.conf": "Nginx",\n "nim.cfg": "Nim",\n "notebook": "Jupyter Notebook",\n "nuget.config": "XML",\n "nukefile": "Nu",\n "nvimrc": "Vim Script",\n "owh": "Tcl",\n "package.resolved": "JSON",\n "packages.config": "XML",\n "pdm.lock": "TOML",\n "phakefile": "PHP",\n "pipfile": "TOML",\n "pipfile.lock": "JSON",\n "pixi.lock": "YAML",\n "pkgbuild": "Shell",\n "podfile": "Ruby",\n "poetry.lock": "TOML",\n "procfile": "Procfile",\n "profile": "Shell",\n "project.ede": "Emacs Lisp",\n "project.godot": "Godot Resource",\n "puppetfile": "Ruby",\n "pylintrc": "INI",\n "rakefile": "Ruby",\n "rebar.config": "Erlang",\n "rebar.config.lock": "Erlang",\n "rebar.lock": "Erlang",\n "requirements-dev.txt": "Pip Requirements",\n "requirements.lock.txt": "Pip Requirements",\n "requirements.txt": "Pip Requirements",\n "rexfile": "Perl",\n "riemann.config": "Clojure",\n "root": "Isabelle",\n "sconscript": "Python",\n "sconstruct": "Python",\n "settings.stylecop": "XML",\n "singularity": "Singularity",\n "slakefile": "LiveScript",\n "snakefile": "Python",\n "snapfile": "Ruby",\n "starfield": "Tcl",\n "steepfile": "Ruby",\n "suite.rc": "INI",\n "thorfile": "Ruby",\n "tiltfile": "Starlark",\n "tmux.conf": "Shell",\n "toolchain_installscript.qs": "Qt Script",\n "torrc": "Tor Config",\n "troffrc": "Roff",\n "troffrc-end": "Roff",\n "tsconfig.json": "JSON",\n "tslint.json": "JSON",\n "uv.lock": "TOML",\n "vagrantfile": "Ruby",\n "vimrc": "Vim Script",\n "vlcrc": "INI",\n "web.config": "XML",\n "web.debug.config": "XML",\n "web.release.config": "XML",\n "workspace": "Starlark",\n "workspace.bazel": "Starlark",\n "workspace.bzlmod": "Starlark",\n "wscript": "Python",\n "xinitrc": "Shell",\n "xmake.lua": "Xmake",\n "xsession": "Shell",\n "yarn.lock": "YAML",\n "zlogin": "Shell",\n "zlogout": "Shell",\n "zprofile": "Shell",\n "zshenv": "Shell",\n "zshrc": "Shell"\n }\n },\n "vendor": [\n "(^|/)cache/",\n "^[Dd]ependencies/",\n "(^|/)dist/",\n "^deps/",\n "(^|/)configure$",\n "(^|/)config\\\\.guess$",\n "(^|/)config\\\\.sub$",\n "(^|/)aclocal\\\\.m4",\n "(^|/)libtool\\\\.m4",\n "(^|/)ltoptions\\\\.m4",\n "(^|/)ltsugar\\\\.m4",\n "(^|/)ltversion\\\\.m4",\n "(^|/)lt~obsolete\\\\.m4",\n "(^|/)dotnet-install\\\\.(ps1|sh)$",\n "(^|/)cpplint\\\\.py",\n "(^|/)node_modules/",\n "(^|/)\\\\.yarn/releases/",\n "(^|/)\\\\.yarn/plugins/",\n "(^|/)\\\\.yarn/sdks/",\n "(^|/)\\\\.yarn/versions/",\n "(^|/)\\\\.yarn/unplugged/",\n "(^|/)_esy$",\n "(^|/)bower_components/",\n "^rebar$",\n "(^|/)erlang\\\\.mk",\n "(^|/)Godeps/_workspace/",\n "(^|/)testdata/",\n "(^|/)\\\\.indent\\\\.pro",\n "(\\\\.|-)min\\\\.(js|css)$",\n "([^\\\\s]*)import\\\\.(css|less|scss|styl)$",\n "(^|/)bootstrap([^/.]*)(\\\\..*)?\\\\.(js|css|less|scss|styl)$",\n "(^|/)custom\\\\.bootstrap([^\\\\s]*)(js|css|less|scss|styl)$",\n "(^|/)font-?awesome\\\\.(css|less|scss|styl)$",\n "(^|/)font-?awesome/.*\\\\.(css|less|scss|styl)$",\n "(^|/)foundation\\\\.(css|less|scss|styl)$",\n "(^|/)normalize\\\\.(css|less|scss|styl)$",\n "(^|/)skeleton\\\\.(css|less|scss|styl)$",\n "(^|/)[Bb]ourbon/.*\\\\.(css|less|scss|styl)$",\n "(^|/)animate\\\\.(css|less|scss|styl)$",\n "(^|/)materialize\\\\.(css|less|scss|styl|js)$",\n "(^|/)select2/.*\\\\.(css|scss|js)$",\n "(^|/)bulma\\\\.(css|sass|scss)$",\n "(3rd|[Tt]hird)[-_]?[Pp]arty/",\n "(^|/)vendors?/",\n "(^|/)[Ee]xtern(als?)?/",\n "(^|/)[Vv]+endor/",\n "^debian/",\n "(^|/)run\\\\.n$",\n "(^|/)bootstrap-datepicker/",\n "(^|/)jquery([^.]*)\\\\.js$",\n "(^|/)jquery\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)jquery\\\\-ui(\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?)?(\\\\.\\\\w+)?\\\\.(js|css)$",\n "(^|/)jquery\\\\.(ui|effects)\\\\.([^.]*)\\\\.(js|css)$",\n "(^|/)jquery\\\\.fn\\\\.gantt\\\\.js",\n "(^|/)jquery\\\\.fancybox\\\\.(js|css)",\n "(^|/)fuelux\\\\.js",\n "(^|/)jquery\\\\.fileupload(-\\\\w+)?\\\\.js$",\n "(^|/)jquery\\\\.dataTables\\\\.js",\n "(^|/)bootbox\\\\.js",\n "(^|/)pdf\\\\.worker\\\\.js",\n "(^|/)slick\\\\.\\\\w+.js$",\n "(^|/)Leaflet\\\\.Coordinates-\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.src\\\\.js$",\n "(^|/)leaflet\\\\.draw-src\\\\.js",\n "(^|/)leaflet\\\\.draw\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.js",\n "(^|/)leaflet\\\\.spin\\\\.js",\n "(^|/)wicket-leaflet\\\\.js",\n "(^|/)\\\\.sublime-project",\n "(^|/)\\\\.sublime-workspace",\n "(^|/)\\\\.vscode/",\n "(^|/)prototype(.*)\\\\.js$",\n "(^|/)effects\\\\.js$",\n "(^|/)controls\\\\.js$",\n "(^|/)dragdrop\\\\.js$",\n "(.*?)\\\\.d\\\\.ts$",\n "(^|/)mootools([^.]*)\\\\d+\\\\.\\\\d+.\\\\d+([^.]*)\\\\.js$",\n "(^|/)dojo\\\\.js$",\n "(^|/)MochiKit\\\\.js$",\n "(^|/)yahoo-([^.]*)\\\\.js$",\n "(^|/)yui([^.]*)\\\\.js$",\n "(^|/)ckeditor\\\\.js$",\n "(^|/)tiny_mce([^.]*)\\\\.js$",\n "(^|/)tiny_mce/(langs|plugins|themes|utils)",\n "(^|/)ace-builds/",\n "(^|/)fontello(.*?)\\\\.css$",\n "(^|/)MathJax/",\n "(^|/)Chart\\\\.js$",\n "(^|/)[Cc]ode[Mm]irror/(\\\\d+\\\\.\\\\d+/)?(lib|mode|theme|addon|keymap|demo)",\n "(^|/)shBrush([^.]*)\\\\.js$",\n "(^|/)shCore\\\\.js$",\n "(^|/)shLegacy\\\\.js$",\n "(^|/)angular([^.]*)\\\\.js$",\n "(^|\\\\/)d3(\\\\.v\\\\d+)?([^.]*)\\\\.js$",\n "(^|/)react(-[^.]*)?\\\\.js$",\n "(^|/)flow-typed/.*\\\\.js$",\n "(^|/)modernizr\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)modernizr\\\\.custom\\\\.\\\\d+\\\\.js$",\n "(^|/)knockout-(\\\\d+\\\\.){3}(debug\\\\.)?js$",\n "(^|/)docs?/_?(build|themes?|templates?|static)/",\n "(^|/)admin_media/",\n "(^|/)env/",\n "(^|/)fabfile\\\\.py$",\n "(^|/)waf$",\n "(^|/)\\\\.osx$",\n "\\\\.xctemplate/",\n "\\\\.imageset/",\n "(^|/)Carthage/",\n "(^|/)Sparkle/",\n "(^|/)Crashlytics\\\\.framework/",\n "(^|/)Fabric\\\\.framework/",\n "(^|/)BuddyBuildSDK\\\\.framework/",\n "(^|/)Realm\\\\.framework",\n "(^|/)RealmSwift\\\\.framework",\n "(^|/)\\\\.gitattributes$",\n "(^|/)\\\\.gitignore$",\n "(^|/)\\\\.gitmodules$",\n "(^|/)gradlew$",\n "(^|/)gradlew\\\\.bat$",\n "(^|/)gradle/wrapper/",\n "(^|/)mvnw$",\n "(^|/)mvnw\\\\.cmd$",\n "(^|/)\\\\.mvn/wrapper/",\n "-vsdoc\\\\.js$",\n "\\\\.intellisense\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.validate(\\\\.unobtrusive)?\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.unobtrusive\\\\-ajax\\\\.js$",\n "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\\\.debug)?\\\\.js$",\n "(^|/)[Pp]ackages\\\\/.+\\\\.\\\\d+\\\\/",\n "(^|/)extjs/.*?\\\\.js$",\n "(^|/)extjs/.*?\\\\.xml$",\n "(^|/)extjs/.*?\\\\.txt$",\n "(^|/)extjs/.*?\\\\.html$",\n "(^|/)extjs/.*?\\\\.properties$",\n "(^|/)extjs/\\\\.sencha/",\n "(^|/)extjs/docs/",\n "(^|/)extjs/builds/",\n "(^|/)extjs/cmd/",\n "(^|/)extjs/examples/",\n "(^|/)extjs/locale/",\n "(^|/)extjs/packages/",\n "(^|/)extjs/plugins/",\n "(^|/)extjs/resources/",\n "(^|/)extjs/src/",\n "(^|/)extjs/welcome/",\n "(^|/)html5shiv\\\\.js$",\n "(^|/)[Tt]ests?/fixtures/",\n "(^|/)[Ss]pecs?/fixtures/",\n "(^|/)cordova([^.]*)\\\\.js$",\n "(^|/)cordova\\\\-\\\\d\\\\.\\\\d(\\\\.\\\\d)?\\\\.js$",\n "(^|/)foundation(\\\\..*)?\\\\.js$",\n "(^|/)Vagrantfile$",\n "(^|/)\\\\.[Dd][Ss]_[Ss]tore$",\n "(^|/)inst/extdata/",\n "(^|/)octicons\\\\.css",\n "(^|/)sprockets-octicons\\\\.scss",\n "(^|/)activator$",\n "(^|/)activator\\\\.bat$",\n "(^|/)proguard\\\\.pro$",\n "(^|/)proguard-rules\\\\.pro$",\n "(^|/)puphpet/",\n "(^|/)\\\\.google_apis/",\n "(^|/)Jenkinsfile$",\n "(^|/)\\\\.gitpod\\\\.Dockerfile$",\n "(^|/)\\\\.github/",\n "(^|/)\\\\.obsidian/",\n "(^|/)\\\\.teamcity/",\n "(^|/)xvba_modules/"\n ]\n}' +TECHDATA = '{\n "_source": {\n "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml",\n "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml"\n },\n "fw_deps": {\n "Go": {\n "github.com/gin-gonic/gin": "Gin",\n "github.com/go-chi/chi": "chi",\n "github.com/gofiber/fiber": "Fiber",\n "github.com/gorilla/mux": "Gorilla",\n "github.com/labstack/echo": "Echo",\n "github.com/spf13/cobra": "Cobra",\n "google.golang.org/grpc": "gRPC",\n "gorm.io/gorm": "GORM"\n },\n "PHP": {\n "cakephp/cakephp": "CakePHP",\n "laravel/framework": "Laravel",\n "slim/slim": "Slim",\n "symfony/framework-bundle": "Symfony",\n "symfony/symfony": "Symfony",\n "yiisoft/yii2": "Yii"\n },\n "Python": {\n "aiohttp": "aiohttp",\n "celery": "Celery",\n "click": "Click",\n "django": "Django",\n "djangorestframework": "Django REST",\n "fastapi": "FastAPI",\n "flask": "Flask",\n "httpx": "HTTPX",\n "keras": "Keras",\n "matplotlib": "Matplotlib",\n "numpy": "NumPy",\n "pandas": "pandas",\n "pydantic": "Pydantic",\n "pyramid": "Pyramid",\n "pytest": "pytest",\n "requests": "Requests",\n "sanic": "Sanic",\n "scikit-learn": "scikit-learn",\n "scipy": "SciPy",\n "scrapy": "Scrapy",\n "sqlalchemy": "SQLAlchemy",\n "starlette": "Starlette",\n "tensorflow": "TensorFlow",\n "torch": "PyTorch",\n "tornado": "Tornado",\n "transformers": "Transformers",\n "typer": "Typer"\n },\n "Ruby": {\n "devise": "Devise",\n "hanami": "Hanami",\n "puma": "Puma",\n "rails": "Rails",\n "rspec": "RSpec",\n "sidekiq": "Sidekiq",\n "sinatra": "Sinatra"\n },\n "Rust": {\n "actix-web": "Actix Web",\n "axum": "Axum",\n "bevy": "Bevy",\n "clap": "clap",\n "diesel": "Diesel",\n "rocket": "Rocket",\n "serde": "Serde",\n "tauri": "Tauri",\n "tokio": "Tokio",\n "tonic": "Tonic",\n "warp": "warp"\n },\n "npm": {\n "@angular/core": "Angular",\n "@apollo/client": "Apollo",\n "@chakra-ui/react": "Chakra UI",\n "@hapi/hapi": "hapi",\n "@ionic/core": "Ionic",\n "@mui/material": "MUI",\n "@nestjs/core": "NestJS",\n "@playwright/test": "Playwright",\n "@prisma/client": "Prisma",\n "@reduxjs/toolkit": "Redux",\n "@remix-run/react": "Remix",\n "@sveltejs/kit": "SvelteKit",\n "astro": "Astro",\n "bootstrap": "Bootstrap",\n "chart.js": "Chart.js",\n "cypress": "Cypress",\n "d3": "D3",\n "electron": "Electron",\n "esbuild": "esbuild",\n "eslint": "ESLint",\n "expo": "Expo",\n "express": "Express",\n "fastify": "Fastify",\n "gatsby": "Gatsby",\n "jest": "Jest",\n "koa": "Koa",\n "mocha": "Mocha",\n "mongoose": "Mongoose",\n "next": "Next.js",\n "nuxt": "Nuxt",\n "parcel": "Parcel",\n "playwright": "Playwright",\n "preact": "Preact",\n "prettier": "Prettier",\n "prisma": "Prisma",\n "react": "React",\n "react-dom": "React",\n "react-native": "React Native",\n "redux": "Redux",\n "rollup": "Rollup",\n "sequelize": "Sequelize",\n "solid-js": "SolidJS",\n "styled-components": "styled-components",\n "svelte": "Svelte",\n "tailwindcss": "Tailwind CSS",\n "three": "three.js",\n "typeorm": "TypeORM",\n "vite": "Vite",\n "vitest": "Vitest",\n "vue": "Vue",\n "webpack": "webpack",\n "zustand": "Zustand"\n }\n },\n "fw_sentinels_js": [\n [\n "next.config.js",\n "Next.js"\n ],\n [\n "next.config.ts",\n "Next.js"\n ],\n [\n "next.config.mjs",\n "Next.js"\n ],\n [\n "nuxt.config.js",\n "Nuxt"\n ],\n [\n "nuxt.config.ts",\n "Nuxt"\n ],\n [\n "svelte.config.js",\n "Svelte"\n ],\n [\n "astro.config.mjs",\n "Astro"\n ],\n [\n "vue.config.js",\n "Vue"\n ],\n [\n "gatsby-config.js",\n "Gatsby"\n ],\n [\n "angular.json",\n "Angular"\n ]\n ],\n "fw_sentinels_other": [\n [\n "manage.py",\n "Django",\n "Python"\n ],\n [\n "artisan",\n "Laravel",\n "PHP"\n ],\n [\n "config/application.rb",\n "Rails",\n "Ruby"\n ],\n [\n "Dockerfile",\n "Docker",\n "Tools"\n ],\n [\n "docker-compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "docker-compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "Makefile",\n "Make",\n "Tools"\n ],\n [\n "GNUmakefile",\n "Make",\n "Tools"\n ]\n ],\n "lang": {\n "color": {\n "1C Enterprise": "#814CCC",\n "2-Dimensional Array": "#38761D",\n "4D": "#004289",\n "ABAP": "#E8274B",\n "ABAP CDS": "#555e25",\n "AGS Script": "#B9D9FF",\n "AIDL": "#34EB6B",\n "AL": "#3AA2B5",\n "ALGOL": "#D1E0DB",\n "AMPL": "#E6EFBB",\n "ANTLR": "#9DC3FF",\n "API Blueprint": "#2ACCA8",\n "APL": "#5A8164",\n "ASP.NET": "#9400ff",\n "ATS": "#1ac620",\n "ActionScript": "#882B0F",\n "Ada": "#02f88c",\n "Adblock Filter List": "#800000",\n "Adobe Font Metrics": "#fa0f00",\n "Agda": "#315665",\n "Aiken": "#640ff8",\n "Alloy": "#64C800",\n "Alpine Abuild": "#0D597F",\n "Altium Designer": "#A89663",\n "AngelScript": "#C7D7DC",\n "Answer Set Programming": "#A9CC29",\n "Ant Build System": "#A9157E",\n "Antlers": "#ff269e",\n "ApacheConf": "#d12127",\n "Apex": "#1797c0",\n "Apollo Guidance Computer": "#0B3D91",\n "AppleScript": "#101F1F",\n "Arc": "#aa2afe",\n "AsciiDoc": "#73a0c5",\n "AspectJ": "#a957b0",\n "Assembly": "#6E4C13",\n "Astro": "#ff5a03",\n "Asymptote": "#ff0000",\n "Augeas": "#9CC134",\n "AutoHotkey": "#6594b9",\n "AutoIt": "#1C3552",\n "Avro IDL": "#0040FF",\n "Awk": "#c30e9b",\n "B (Formal Method)": "#8aa8c5",\n "B4X": "#00e4ff",\n "BASIC": "#ff0000",\n "BQN": "#2b7067",\n "Ballerina": "#FF5000",\n "Batchfile": "#C1F12E",\n "Beef": "#a52f4e",\n "Berry": "#15A13C",\n "BibTeX": "#778899",\n "Bicep": "#519aba",\n "Bikeshed": "#5562ac",\n "Bison": "#6A463F",\n "BitBake": "#00bce4",\n "Blade": "#f7523f",\n "BlitzBasic": "#00FFAE",\n "BlitzMax": "#cd6400",\n "Bluespec": "#12223c",\n "Bluespec BH": "#12223c",\n "Boo": "#d4bec1",\n "Boogie": "#c80fa0",\n "Brainfuck": "#2F2530",\n "BrighterScript": "#66AABB",\n "Brightscript": "#662D91",\n "Browserslist": "#ffd539",\n "Bru": "#F4AA41",\n "BuildStream": "#006bff",\n "C": "#555555",\n "C#": "#178600",\n "C++": "#f34b7d",\n "C3": "#2563eb",\n "CAP CDS": "#0092d1",\n "CLIPS": "#00A300",\n "CMake": "#DA3434",\n "COLLADA": "#F1A42B",\n "CQL": "#006091",\n "CSON": "#244776",\n "CSS": "#663399",\n "CSV": "#237346",\n "CUE": "#5886E1",\n "CWeb": "#00007a",\n "Cabal Config": "#483465",\n "Caddyfile": "#22b638",\n "Cadence": "#00ef8b",\n "Cairo": "#ff4a48",\n "Cairo Zero": "#ff4a48",\n "CameLIGO": "#3be133",\n "Cangjie": "#00868B",\n "Cap\'n Proto": "#c42727",\n "Carbon": "#222222",\n "Ceylon": "#dfa535",\n "Chapel": "#8dc63f",\n "ChucK": "#3f8000",\n "Circom": "#707575",\n "Cirru": "#ccccff",\n "Clarion": "#db901e",\n "Clarity": "#5546ff",\n "Classic ASP": "#6a40fd",\n "Clean": "#3F85AF",\n "Click": "#E4E6F3",\n "Clojure": "#db5855",\n "Closure Templates": "#0d948f",\n "Cloud Firestore Security Rules": "#FFA000",\n "Clue": "#0009b5",\n "CodeQL": "#140f46",\n "CoffeeScript": "#244776",\n "ColdFusion": "#ed2cd6",\n "ColdFusion CFC": "#ed2cd6",\n "Common Lisp": "#3fb68b",\n "Common Workflow Language": "#B5314C",\n "Component Pascal": "#B0CE4E",\n "Cooklang": "#E15A29",\n "Crystal": "#000100",\n "Csound": "#1a1a1a",\n "Csound Document": "#1a1a1a",\n "Csound Score": "#1a1a1a",\n "Cuda": "#3A4E3A",\n "Curry": "#531242",\n "Cylc": "#00b3fd",\n "Cypher": "#34c0eb",\n "Cython": "#fedf5b",\n "D": "#ba595e",\n "D2": "#526ee8",\n "DM": "#447265",\n "Dafny": "#FFEC25",\n "Darcs Patch": "#8eff23",\n "Dart": "#00B4AB",\n "Daslang": "#d3d3d3",\n "DataWeave": "#003a52",\n "Debian Package Control File": "#D70751",\n "DenizenScript": "#FBEE96",\n "Dhall": "#dfafff",\n "DirectX 3D File": "#aace60",\n "Dockerfile": "#384d54",\n "Dogescript": "#cca760",\n "Dotenv": "#e5d559",\n "Dune": "#89421e",\n "Dylan": "#6c616e",\n "E": "#ccce35",\n "ECL": "#8a1267",\n "ECLiPSe": "#001d9d",\n "EJS": "#a91e50",\n "EQ": "#a78649",\n "Earthly": "#2af0ff",\n "Easybuild": "#069406",\n "Ecere Projects": "#913960",\n "Ecmarkup": "#eb8131",\n "Edge": "#0dffe0",\n "EdgeQL": "#31A7FF",\n "EditorConfig": "#fff1f2",\n "Eiffel": "#4d6977",\n "Elixir": "#6e4a7e",\n "Elm": "#60B5CC",\n "Elvish": "#55BB55",\n "Elvish Transcript": "#55BB55",\n "Emacs Lisp": "#c065db",\n "EmberScript": "#FFF4F3",\n "Erlang": "#B83998",\n "Euphoria": "#FF790B",\n "F#": "#b845fc",\n "F*": "#572e30",\n "FIGlet Font": "#FFDDBB",\n "FIRRTL": "#2f632f",\n "FLUX": "#88ccff",\n "Factor": "#636746",\n "Fancy": "#7b9db4",\n "Fantom": "#14253c",\n "Faust": "#c37240",\n "Fennel": "#fff3d7",\n "Filebench WML": "#F6B900",\n "FlatBuffers": "#ed284a",\n "Flix": "#d44a45",\n "Fluent": "#ffcc33",\n "Forth": "#341708",\n "Fortran": "#4d41b1",\n "Fortran Free Form": "#4d41b1",\n "FreeBASIC": "#141AC9",\n "FreeMarker": "#0050b2",\n "Frege": "#00cafe",\n "Futhark": "#5f021f",\n "G-code": "#D08CF2",\n "GAML": "#FFC766",\n "GAMS": "#f49a22",\n "GAP": "#0000cc",\n "GCC Machine Description": "#FFCFAB",\n "GDScript": "#355570",\n "GDShader": "#478CBF",\n "GEDCOM": "#003058",\n "GLSL": "#5686a5",\n "GSC": "#FF6800",\n "Game Maker Language": "#71b417",\n "Gemfile.lock": "#701516",\n "Gemini": "#ff6900",\n "Genero 4gl": "#63408e",\n "Genero per": "#d8df39",\n "Genie": "#fb855d",\n "Genshi": "#951531",\n "Gentoo Ebuild": "#9400ff",\n "Gentoo Eclass": "#9400ff",\n "Gerber Image": "#d20b00",\n "Gherkin": "#5B2063",\n "Git Attributes": "#F44D27",\n "Git Commit": "#F44D27",\n "Git Config": "#F44D27",\n "Git Revision List": "#F44D27",\n "Gleam": "#ffaff3",\n "Glimmer JS": "#F5835F",\n "Glimmer TS": "#3178c6",\n "Glyph": "#c1ac7f",\n "Gnuplot": "#f0a9f0",\n "Go": "#00ADD8",\n "Go Checksums": "#00ADD8",\n "Go Module": "#00ADD8",\n "Go Template": "#00ADD8",\n "Go Workspace": "#00ADD8",\n "Godot Resource": "#355570",\n "Golo": "#88562A",\n "Gosu": "#82937f",\n "Grace": "#615f8b",\n "Gradle": "#02303a",\n "Gradle Kotlin DSL": "#02303a",\n "Grammatical Framework": "#ff0000",\n "GraphQL": "#e10098",\n "Graphviz (DOT)": "#2596be",\n "Groovy": "#4298b8",\n "Groovy Server Pages": "#4298b8",\n "HAProxy": "#106da9",\n "HCL": "#844FBA",\n "HIP": "#4F3A4F",\n "HLSL": "#aace60",\n "HOCON": "#9ff8ee",\n "HTML": "#e34c26",\n "HTML+ECR": "#2e1052",\n "HTML+EEX": "#6e4a7e",\n "HTML+ERB": "#701516",\n "HTML+PHP": "#4f5d95",\n "HTML+Razor": "#512be4",\n "HTTP": "#005C9C",\n "HXML": "#f68712",\n "Hack": "#878787",\n "Haml": "#ece2a9",\n "Handlebars": "#f7931e",\n "Harbour": "#0e60e3",\n "Hare": "#9d7424",\n "Haskell": "#5e5086",\n "Haxe": "#df7900",\n "HiveQL": "#dce200",\n "HolyC": "#ffefaf",\n "Hosts File": "#308888",\n "Hurl": "#FF0288",\n "Hy": "#7790B2",\n "IDL": "#a3522f",\n "IGOR Pro": "#0000cc",\n "IL Assembly": "#512BD4",\n "INI": "#d1dbe0",\n "ISPC": "#2D68B1",\n "Idris": "#b30000",\n "Ignore List": "#000000",\n "ImageJ Macro": "#99AAFF",\n "Imba": "#16cec6",\n "Inno Setup": "#264b99",\n "Io": "#a9188d",\n "Ioke": "#078193",\n "Isabelle": "#FEFE00",\n "Isabelle ROOT": "#FEFE00",\n "J": "#9EEDFF",\n "JAR Manifest": "#b07219",\n "JCL": "#d90e09",\n "JFlex": "#DBCA00",\n "JSON": "#292929",\n "JSON with Comments": "#292929",\n "JSON5": "#267CB9",\n "JSONLD": "#0c479c",\n "JSONiq": "#40d47e",\n "Jac": "#FC792D",\n "Jai": "#ab8b4b",\n "Janet": "#0886a5",\n "Jasmin": "#d03600",\n "Java": "#b07219",\n "Java Properties": "#2A6277",\n "Java Server Pages": "#2A6277",\n "Java Template Engine": "#2A6277",\n "JavaScript": "#f1e05a",\n "JavaScript+ERB": "#f1e05a",\n "Jest Snapshot": "#15c213",\n "JetBrains MPS": "#21D789",\n "Jinja": "#a52a22",\n "Jison": "#56b3cb",\n "Jison Lex": "#56b3cb",\n "Jolie": "#843179",\n "Jsonnet": "#0064bd",\n "Julia": "#a270ba",\n "Julia REPL": "#a270ba",\n "Jupyter Notebook": "#DA5B0B",\n "Just": "#384d54",\n "KCL": "#7ABABF",\n "KDL": "#ffb3b3",\n "KFramework": "#4195c5",\n "KRL": "#28430A",\n "Kaitai Struct": "#773b37",\n "KakouneScript": "#6f8042",\n "KerboScript": "#41adf0",\n "KiCad Layout": "#2f4aab",\n "KiCad Legacy Layout": "#2f4aab",\n "KiCad Schematic": "#2f4aab",\n "KoLmafia ASH": "#B9D9B9",\n "Koka": "#215166",\n "Kotlin": "#A97BFF",\n "LFE": "#4C3023",\n "LLVM": "#185619",\n "LOLCODE": "#cc9900",\n "LSL": "#3d9970",\n "LabVIEW": "#fede06",\n "Lambdapi": "#8027a3",\n "Langium": "#2c8c87",\n "Lark": "#2980B9",\n "Lasso": "#999999",\n "Latte": "#f2a542",\n "Leo": "#C4FFC2",\n "Less": "#1d365d",\n "Lex": "#DBCA00",\n "LigoLANG": "#0e74ff",\n "LilyPond": "#9ccc7c",\n "Liquid": "#67b8de",\n "Liquidsoap": "#990066",\n "Literate Agda": "#315665",\n "Literate CoffeeScript": "#244776",\n "Literate Haskell": "#5e5086",\n "LiveCode Script": "#0c5ba5",\n "LiveScript": "#499886",\n "Logtalk": "#295b9a",\n "LookML": "#652B81",\n "Lua": "#000080",\n "Luau": "#00A2FF",\n "M3U": "#179C7D",\n "MATLAB": "#e16737",\n "MAXScript": "#00a6a6",\n "MDX": "#fcb32c",\n "MLIR": "#5EC8DB",\n "MQL4": "#62A8D6",\n "MQL5": "#4A76B8",\n "MTML": "#b7e1f4",\n "Macaulay2": "#d8ffff",\n "Makefile": "#427819",\n "Mako": "#7e858d",\n "Markdown": "#083fa1",\n "Marko": "#42bff2",\n "Mask": "#f97732",\n "Mathematical Programming System": "#0530ad",\n "Max": "#c4a79c",\n "MeTTa": "#6a5acd",\n "Mercury": "#ff2b2b",\n "Mermaid": "#ff3670",\n "Meson": "#007800",\n "Metal": "#8f14e9",\n "MiniYAML": "#ff1111",\n "MiniZinc": "#06a9e6",\n "Mint": "#02b046",\n "Mirah": "#c7a938",\n "Modelica": "#de1d31",\n "Modula-2": "#10253f",\n "Modula-3": "#223388",\n "Mojo": "#ff4c1f",\n "Monkey C": "#8D6747",\n "MoonBit": "#b92381",\n "MoonScript": "#ff4585",\n "Motoko": "#fbb03b",\n "Motorola 68K Assembly": "#005daa",\n "Move": "#4a137a",\n "Mustache": "#724b3b",\n "NCL": "#28431f",\n "NMODL": "#00356B",\n "NPM Config": "#cb3837",\n "NWScript": "#111522",\n "Nasal": "#1d2c4e",\n "Nearley": "#990000",\n "Nemerle": "#3d3c6e",\n "NetLinx": "#0aa0ff",\n "NetLinx+ERB": "#747faa",\n "NetLogo": "#ff6375",\n "NewLisp": "#87AED7",\n "Nextflow": "#3ac486",\n "Nginx": "#009639",\n "Nickel": "#E0C3FC",\n "Nim": "#ffc200",\n "Nit": "#009917",\n "Nix": "#7e7eff",\n "Noir": "#2f1f49",\n "Nu": "#c9df40",\n "NumPy": "#9C8AF9",\n "Nunjucks": "#3d8137",\n "Nushell": "#4E9906",\n "OASv2-json": "#85ea2d",\n "OASv2-yaml": "#85ea2d",\n "OASv3-json": "#85ea2d",\n "OASv3-yaml": "#85ea2d",\n "OCaml": "#ef7a08",\n "OMNeT++ MSG": "#a0e0a0",\n "OMNeT++ NED": "#08607c",\n "ObjectScript": "#424893",\n "Objective-C": "#438eff",\n "Objective-C++": "#6866fb",\n "Objective-J": "#ff0c5a",\n "Odin": "#60AFFE",\n "Omgrofl": "#cabbff",\n "Opal": "#f7ede0",\n "Open Policy Agent": "#7d9199",\n "OpenAPI Specification v2": "#85ea2d",\n "OpenAPI Specification v3": "#85ea2d",\n "OpenCL": "#ed2e2d",\n "OpenEdge ABL": "#5ce600",\n "OpenQASM": "#AA70FF",\n "OpenSCAD": "#e5cd45",\n "Option List": "#476732",\n "Org": "#77aa99",\n "OverpassQL": "#cce2aa",\n "Oxygene": "#cdd0e3",\n "Oz": "#fab738",\n "P4": "#7055b5",\n "PDDL": "#0d00ff",\n "PEG.js": "#234d6b",\n "PHP": "#4F5D95",\n "PLSQL": "#dad8d8",\n "PLpgSQL": "#336790",\n "POV-Ray SDL": "#6bac65",\n "Pact": "#F7A8B8",\n "Pan": "#cc0000",\n "Papyrus": "#6600cc",\n "Parrot": "#f3ca0a",\n "Pascal": "#E3F171",\n "Pawn": "#dbb284",\n "Pep8": "#C76F5B",\n "Perl": "#0298c3",\n "PicoLisp": "#6067af",\n "PigLatin": "#fcd7de",\n "Pike": "#005390",\n "Pip Requirements": "#FFD343",\n "Pkl": "#6b9543",\n "PlantUML": "#fbbd16",\n "PogoScript": "#d80074",\n "Polar": "#ae81ff",\n "Portugol": "#f8bd00",\n "PostCSS": "#dc3a0c",\n "PostScript": "#da291c",\n "PowerBuilder": "#8f0f8d",\n "PowerShell": "#012456",\n "Praat": "#c8506d",\n "Prisma": "#0c344b",\n "Processing": "#0096D8",\n "Procfile": "#3B2F63",\n "Prolog": "#74283c",\n "Promela": "#de0000",\n "Propeller Spin": "#7fa2a7",\n "Pug": "#a86454",\n "Puppet": "#302B6D",\n "PureBasic": "#5a6986",\n "PureScript": "#1D222D",\n "Pyret": "#ee1e10",\n "Python": "#3572A5",\n "Python console": "#3572A5",\n "Python traceback": "#3572A5",\n "Q#": "#fed659",\n "QML": "#44a51c",\n "Qt Script": "#00b841",\n "Quake": "#882233",\n "QuakeC": "#975777",\n "QuickBASIC": "#008080",\n "Quint": "#9d6ce5",\n "R": "#198CE7",\n "RAML": "#77d9fb",\n "RAScript": "#2C97FA",\n "RBS": "#701516",\n "RDoc": "#701516",\n "REXX": "#d90e09",\n "RMarkdown": "#198ce7",\n "RON": "#a62c00",\n "ROS Interface": "#22314e",\n "RPGLE": "#2BDE21",\n "RUNOFF": "#665a4e",\n "Racket": "#3c5caa",\n "Ragel": "#9d5200",\n "Raku": "#0000fb",\n "Rascal": "#fffaa0",\n "ReScript": "#ed5051",\n "Reason": "#ff5847",\n "ReasonLIGO": "#ff5847",\n "Rebol": "#358a5b",\n "Record Jar": "#0673ba",\n "Red": "#f50000",\n "Regular Expression": "#009a00",\n "Ren\'Py": "#ff7f7f",\n "Rez": "#FFDAB3",\n "Ring": "#2D54CB",\n "Riot": "#A71E49",\n "RobotFramework": "#00c0b5",\n "Roc": "#7c38f5",\n "Rocq Prover": "#d0b68c",\n "Roff": "#ecdebe",\n "Roff Manpage": "#ecdebe",\n "Rouge": "#cc0088",\n "RouterOS Script": "#DE3941",\n "Ruby": "#701516",\n "Rust": "#dea584",\n "SAS": "#B34936",\n "SCSS": "#c6538c",\n "SPARQL": "#0C4597",\n "SQF": "#3F3F3F",\n "SQL": "#e38c00",\n "SQLPL": "#e38c00",\n "SRecode Template": "#348a34",\n "STL": "#373b5e",\n "SVG": "#ff9900",\n "Sail": "#259dd5",\n "SaltStack": "#646464",\n "Sass": "#a53b70",\n "Scala": "#c22d40",\n "Scaml": "#bd181a",\n "Scenic": "#fdc700",\n "Scheme": "#1e4aec",\n "Scilab": "#ca0f21",\n "Self": "#0579aa",\n "ShaderLab": "#222c37",\n "Shell": "#89e051",\n "ShellCheck Config": "#cecfcb",\n "Shen": "#120F14",\n "Simple File Verification": "#C9BFED",\n "Singularity": "#64E6AD",\n "Slang": "#1fbec9",\n "Slash": "#007eff",\n "Slice": "#003fa2",\n "Slim": "#2b2b2b",\n "Slint": "#2379F4",\n "SmPL": "#c94949",\n "Smalltalk": "#596706",\n "Smarty": "#f0c040",\n "Smithy": "#c44536",\n "Snakemake": "#419179",\n "Solidity": "#AA6746",\n "SourcePawn": "#f69e1d",\n "SpiceDB Schema": "#a5318a",\n "Squirrel": "#800000",\n "Stan": "#b2011d",\n "Standard ML": "#dc566d",\n "Starlark": "#76d275",\n "Stata": "#1a5f91",\n "StringTemplate": "#3fb34f",\n "Stylus": "#ff6347",\n "SubRip Text": "#9e0101",\n "SugarSS": "#2fcc9f",\n "SuperCollider": "#46390b",\n "SurrealQL": "#ff00a0",\n "Survex data": "#ffcc99",\n "Svelte": "#ff3e00",\n "Sway": "#00F58C",\n "Sweave": "#198ce7",\n "Swift": "#F05138",\n "SystemVerilog": "#DAE1C2",\n "TI Program": "#A0AA87",\n "TL-Verilog": "#C40023",\n "TLA": "#4b0079",\n "TMDL": "#f0c913",\n "TOML": "#9c4221",\n "TSQL": "#e38c00",\n "TSV": "#237346",\n "TSX": "#3178c6",\n "TXL": "#0178b8",\n "Tact": "#48b5ff",\n "Talon": "#333333",\n "Tcl": "#e4cc98",\n "TeX": "#3D6117",\n "Teal": "#00B1BC",\n "Terra": "#00004c",\n "Terraform Template": "#7b42bb",\n "TextGrid": "#c8506d",\n "TextMate Properties": "#df66e4",\n "Textile": "#ffe7ac",\n "Thrift": "#D12127",\n "Toit": "#c2c9fb",\n "Tools": "#a371f7",\n "Tor Config": "#59316b",\n "Tree-sitter Query": "#8ea64c",\n "Turing": "#cf142b",\n "Twig": "#c1d026",\n "TypeScript": "#3178c6",\n "TypeSpec": "#4A3665",\n "Typst": "#239dad",\n "Unified Parallel C": "#4e3617",\n "Unity3D Asset": "#222c37",\n "Uno": "#9933cc",\n "UnrealScript": "#a54c4d",\n "Untyped Plutus Core": "#36adbd",\n "UrWeb": "#ccccee",\n "V": "#4f87c4",\n "VBA": "#867db1",\n "VBScript": "#15dcdc",\n "VCL": "#148AA8",\n "VHDL": "#adb2cb",\n "Vala": "#a56de2",\n "Valve Data Format": "#f26025",\n "Velocity Template Language": "#507cff",\n "Vento": "#ff0080",\n "Verilog": "#b2b7f8",\n "Vim Help File": "#199f4b",\n "Vim Script": "#199f4b",\n "Vim Snippet": "#199f4b",\n "Visual Basic .NET": "#945db7",\n "Visual Basic 6.0": "#2c6353",\n "Volt": "#1F1F1F",\n "Vue": "#41b883",\n "Vyper": "#9F4CF2",\n "WDL": "#42f1f4",\n "WGSL": "#1a5e9a",\n "Web Ontology Language": "#5b70bd",\n "WebAssembly": "#04133b",\n "WebAssembly Interface Type": "#6250e7",\n "Whiley": "#d5c397",\n "Wikitext": "#fc5757",\n "Windows Registry Entries": "#52d5ff",\n "Witcher Script": "#ff0000",\n "Wolfram Language": "#dd1100",\n "Wollok": "#a23738",\n "World of Warcraft Addon Data": "#f7e43f",\n "Wren": "#383838",\n "X10": "#4B6BEF",\n "XC": "#99DA07",\n "XML": "#0060ac",\n "XML Property List": "#0060ac",\n "XQuery": "#5232e7",\n "XSLT": "#EB8CEB",\n "Xmake": "#22a079",\n "Xojo": "#81bd41",\n "Xonsh": "#285EEF",\n "Xtend": "#24255d",\n "YAML": "#cb171e",\n "YARA": "#220000",\n "YASnippet": "#32AB90",\n "Yacc": "#4B6C4B",\n "Yul": "#794932",\n "ZAP": "#0d665e",\n "ZIL": "#dc75e5",\n "ZenScript": "#00BCD1",\n "Zephir": "#118f9e",\n "Zig": "#ec915c",\n "Zimpl": "#d67711",\n "Zmodel": "#ff7100",\n "crontab": "#ead7ac",\n "eC": "#913960",\n "fish": "#4aae47",\n "hoon": "#00b171",\n "iCalendar": "#ec564c",\n "jq": "#c7254e",\n "kvlang": "#1da6e0",\n "mIRC Script": "#3d57c3",\n "mcfunction": "#E22837",\n "mdsvex": "#5f9ea0",\n "mupad": "#244963",\n "nanorc": "#2d004d",\n "nesC": "#94B0C7",\n "ooc": "#b0b77e",\n "q": "#0040cd",\n "reStructuredText": "#141414",\n "sed": "#64b970",\n "templ": "#66D0DD",\n "vCard": "#ee2647",\n "wisp": "#7582D1",\n "xBase": "#403a40"\n },\n "ext": {\n "1": "Roff",\n "1in": "Roff",\n "1m": "Roff",\n "1x": "Roff",\n "2": "Roff",\n "2da": "2-Dimensional Array",\n "3": "Roff",\n "3in": "Roff",\n "3m": "Roff",\n "3p": "Roff",\n "3pm": "Roff",\n "3qt": "Roff",\n "3x": "Roff",\n "4": "Roff",\n "4dform": "JSON",\n "4dm": "4D",\n "4dproject": "JSON",\n "4gl": "Genero 4gl",\n "4th": "Forth",\n "5": "Roff",\n "6": "Roff",\n "6pl": "Raku",\n "6pm": "Raku",\n "7": "Roff",\n "8": "Roff",\n "8xp": "TI Program",\n "8xp.txt": "TI Program",\n "9": "Roff",\n "_coffee": "CoffeeScript",\n "_js": "JavaScript",\n "_ls": "LiveScript",\n "a51": "Assembly",\n "abap": "ABAP",\n "action": "ROS Interface",\n "ada": "Ada",\n "adb": "Ada",\n "adml": "XML",\n "admx": "XML",\n "ado": "Stata",\n "adoc": "AsciiDoc",\n "adp": "Tcl",\n "ads": "Ada",\n "afm": "Adobe Font Metrics",\n "agc": "Assembly",\n "agda": "Agda",\n "ahk": "AutoHotkey",\n "ahkl": "AutoHotkey",\n "aidl": "AIDL",\n "aj": "AspectJ",\n "ak": "Aiken",\n "al": "AL",\n "alg": "ALGOL",\n "als": "Alloy",\n "ampl": "AMPL",\n "angelscript": "AngelScript",\n "anim": "Unity3D Asset",\n "ant": "XML",\n "antlers.html": "Antlers",\n "antlers.php": "Antlers",\n "antlers.xml": "Antlers",\n "apacheconf": "ApacheConf",\n "apex": "Apex",\n "apib": "API Blueprint",\n "apl": "APL",\n "app": "Erlang",\n "app.src": "Erlang",\n "applescript": "AppleScript",\n "arc": "Arc",\n "arr": "Pyret",\n "as": "ActionScript",\n "asax": "ASP.NET",\n "asc": "AGS Script",\n "asciidoc": "AsciiDoc",\n "ascx": "ASP.NET",\n "asd": "Common Lisp",\n "asddls": "ABAP CDS",\n "ash": "KoLmafia ASH",\n "ashx": "ASP.NET",\n "asm": "Assembly",\n "asmx": "ASP.NET",\n "asp": "Classic ASP",\n "aspx": "ASP.NET",\n "asset": "Unity3D Asset",\n "astro": "Astro",\n "asy": "Asymptote",\n "au3": "AutoIt",\n "aug": "Augeas",\n "auk": "Awk",\n "aux": "TeX",\n "avdl": "Avro IDL",\n "avsc": "JSON",\n "aw": "PHP",\n "awk": "Awk",\n "axaml": "XML",\n "axd": "ASP.NET",\n "axi": "NetLinx",\n "axi.erb": "NetLinx+ERB",\n "axml": "XML",\n "axs": "NetLinx",\n "axs.erb": "NetLinx+ERB",\n "b": "Brainfuck",\n "bal": "Ballerina",\n "bas": "B4X",\n "bash": "Shell",\n "bat": "Batchfile",\n "bats": "Shell",\n "bb": "BitBake",\n "bbappend": "BitBake",\n "bbclass": "BitBake",\n "bbx": "TeX",\n "bdy": "PLSQL",\n "be": "Berry",\n "bf": "Beef",\n "bi": "FreeBASIC",\n "bib": "TeX",\n "bibtex": "TeX",\n "bicep": "Bicep",\n "bicepparam": "Bicep",\n "bison": "Yacc",\n "blade": "Blade",\n "blade.php": "Blade",\n "bmx": "BlitzMax",\n "bones": "JavaScript",\n "boo": "Boo",\n "boot": "Clojure",\n "bpl": "Boogie",\n "bqn": "BQN",\n "brd": "KiCad Legacy Layout",\n "brs": "Brightscript",\n "bru": "Bru",\n "bs": "Bluespec",\n "bsl": "1C Enterprise",\n "bst": "BuildStream",\n "bsv": "Bluespec",\n "builder": "Ruby",\n "builds": "XML",\n "bzl": "Starlark",\n "c": "C",\n "c++": "C++",\n "c3": "C3",\n "cabal": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cairo": "Cairo",\n "cake": "C#",\n "capnp": "Cap\'n Proto",\n "carbon": "Carbon",\n "cats": "C",\n "cbx": "TeX",\n "cc": "C++",\n "ccproj": "XML",\n "ccxml": "XML",\n "cdc": "Cadence",\n "cdf": "Wolfram Language",\n "cds": "CAP CDS",\n "ceylon": "Ceylon",\n "cfc": "ColdFusion",\n "cfg": "HAProxy",\n "cfm": "ColdFusion",\n "cfml": "ColdFusion",\n "cgi": "Perl",\n "cginc": "HLSL",\n "ch": "xBase",\n "chpl": "Chapel",\n "circom": "Circom",\n "cirru": "Cirru",\n "cj": "Cangjie",\n "cjs": "JavaScript",\n "cjsx": "CoffeeScript",\n "ck": "ChucK",\n "cl": "C",\n "cl2": "Clojure",\n "clar": "Clarity",\n "click": "Click",\n "clixml": "XML",\n "clj": "Clojure",\n "cljc": "Clojure",\n "cljs": "Clojure",\n "cljs.hl": "Clojure",\n "cljscm": "Clojure",\n "cljx": "Clojure",\n "clp": "CLIPS",\n "cls": "Apex",\n "clue": "Clue",\n "clw": "Clarion",\n "cmake": "CMake",\n "cmake.in": "CMake",\n "cmd": "Batchfile",\n "cmp": "Gerber Image",\n "cnc": "G-code",\n "cnf": "INI",\n "cocci": "SmPL",\n "code-snippets": "JSON",\n "code-workspace": "JSON",\n "coffee": "CoffeeScript",\n "coffee.md": "CoffeeScript",\n "command": "Shell",\n "containerfile": "Dockerfile",\n "cook": "Cooklang",\n "coq": "Rocq Prover",\n "cp": "Component Pascal",\n "cpp": "C++",\n "cppm": "C++",\n "cproject": "XML",\n "cps": "Component Pascal",\n "cql": "CQL",\n "cr": "Crystal",\n "cs": "C#",\n "cs.pp": "C#",\n "csc": "GSC",\n "cscfg": "XML",\n "csd": "Csound Document",\n "csdef": "XML",\n "cshtml": "HTML",\n "csl": "XML",\n "cson": "CSON",\n "csproj": "XML",\n "css": "CSS",\n "csv": "CSV",\n "csx": "C#",\n "ct": "XML",\n "ctl": "Visual Basic 6.0",\n "ctp": "PHP",\n "cts": "TypeScript",\n "cu": "Cuda",\n "cue": "CUE",\n "cuh": "Cuda",\n "curry": "Curry",\n "cwl": "Common Workflow Language",\n "cxx": "C++",\n "cylc": "INI",\n "cyp": "Cypher",\n "cypher": "Cypher",\n "d": "D",\n "d2": "D2",\n "dae": "COLLADA",\n "darcspatch": "Darcs Patch",\n "dart": "Dart",\n "das": "Daslang",\n "dats": "ATS",\n "db2": "SQLPL",\n "dcl": "Clean",\n "ddl": "PLSQL",\n "decls": "BlitzBasic",\n "depproj": "XML",\n "dfm": "Pascal",\n "dfy": "Dafny",\n "dhall": "Dhall",\n "di": "D",\n "dita": "XML",\n "ditamap": "XML",\n "ditaval": "XML",\n "djs": "Dogescript",\n "dll.config": "XML",\n "dlm": "IDL",\n "dm": "DM",\n "do": "Stata",\n "dockerfile": "Dockerfile",\n "dof": "INI",\n "doh": "Stata",\n "dot": "Graphviz (DOT)",\n "dotsettings": "XML",\n "dpatch": "Darcs Patch",\n "dpr": "Pascal",\n "druby": "Mirah",\n "dsc": "DenizenScript",\n "dsp": "Faust",\n "dsr": "Visual Basic 6.0",\n "dtx": "TeX",\n "duby": "Mirah",\n "dwl": "DataWeave",\n "dyalog": "APL",\n "dyl": "Dylan",\n "dylan": "Dylan",\n "e": "E",\n "eb": "Python",\n "ebuild": "Shell",\n "ec": "eC",\n "ecl": "ECL",\n "eclass": "Shell",\n "eclxml": "ECL",\n "ecr": "HTML",\n "ect": "EJS",\n "edge": "Edge",\n "edgeql": "EdgeQL",\n "editorconfig": "INI",\n "eh": "eC",\n "ejs": "EJS",\n "ejs.t": "EJS",\n "el": "Emacs Lisp",\n "eliom": "OCaml",\n "eliomi": "OCaml",\n "elm": "Elm",\n "elv": "Elvish",\n "em": "EmberScript",\n "emacs": "Emacs Lisp",\n "emacs.desktop": "Emacs Lisp",\n "emberscript": "EmberScript",\n "env": "Dotenv",\n "epj": "JavaScript",\n "eps": "PostScript",\n "epsi": "PostScript",\n "eq": "EQ",\n "erb": "HTML",\n "erb.deface": "HTML",\n "erl": "Erlang",\n "es": "Erlang",\n "es6": "JavaScript",\n "escript": "Erlang",\n "esdl": "EdgeQL",\n "ex": "Elixir",\n "exs": "Elixir",\n "eye": "Ruby",\n "f": "Fortran",\n "f03": "Fortran",\n "f08": "Fortran",\n "f77": "Fortran",\n "f90": "Fortran",\n "f95": "Fortran",\n "factor": "Factor",\n "fan": "Fantom",\n "fancypack": "Fancy",\n "fbs": "FlatBuffers",\n "fcgi": "Lua",\n "feature": "Gherkin",\n "filters": "XML",\n "fir": "FIRRTL",\n "fish": "Shell",\n "flex": "Lex",\n "flf": "FIGlet Font",\n "flix": "Flix",\n "flux": "FLUX",\n "fnc": "PLSQL",\n "fnl": "Fennel",\n "for": "Fortran",\n "forth": "Forth",\n "fp": "GLSL",\n "fpp": "Fortran",\n "fr": "Frege",\n "frag": "GLSL",\n "frg": "GLSL",\n "frm": "VBA",\n "frt": "Forth",\n "fs": "F#",\n "fsh": "GLSL",\n "fshader": "GLSL",\n "fsi": "F#",\n "fsproj": "XML",\n "fst": "F*",\n "fsti": "F*",\n "fsx": "F#",\n "fth": "Forth",\n "ftl": "Fluent",\n "ftlh": "FreeMarker",\n "fun": "Standard ML",\n "fut": "Futhark",\n "fx": "FLUX",\n "fxh": "HLSL",\n "fxml": "XML",\n "fy": "Fancy",\n "g": "G-code",\n "g4": "ANTLR",\n "gaml": "GAML",\n "gap": "GAP",\n "gawk": "Awk",\n "gbl": "Gerber Image",\n "gbo": "Gerber Image",\n "gbp": "Gerber Image",\n "gbr": "Gerber Image",\n "gbs": "Gerber Image",\n "gco": "G-code",\n "gcode": "G-code",\n "gd": "GDScript",\n "gdnlib": "Godot Resource",\n "gdns": "Godot Resource",\n "gdshader": "GDShader",\n "gdshaderinc": "GDShader",\n "ged": "GEDCOM",\n "gemspec": "Ruby",\n "geo": "GLSL",\n "geojson": "JSON",\n "geom": "GLSL",\n "gf": "Grammatical Framework",\n "gi": "GAP",\n "gitconfig": "INI",\n "gitignore": "Ignore List",\n "gjs": "JavaScript",\n "gko": "Gerber Image",\n "glade": "XML",\n "gleam": "Gleam",\n "glf": "Glyph",\n "glsl": "GLSL",\n "glslf": "GLSL",\n "glslv": "GLSL",\n "gltf": "JSON",\n "gmi": "Gemini",\n "gml": "Game Maker Language",\n "gms": "GAMS",\n "gmx": "XML",\n "gnu": "Gnuplot",\n "gnuplot": "Gnuplot",\n "go": "Go",\n "god": "Ruby",\n "gohtml": "Go Template",\n "golo": "Golo",\n "gotmpl": "Go Template",\n "gp": "Gnuplot",\n "gpb": "Gerber Image",\n "gpt": "Gerber Image",\n "gpx": "XML",\n "gql": "GraphQL",\n "grace": "Grace",\n "gradle": "Gradle",\n "gradle.kts": "Gradle",\n "graphql": "GraphQL",\n "graphqls": "GraphQL",\n "groovy": "Groovy",\n "grt": "Groovy",\n "grxml": "XML",\n "gs": "Genie",\n "gsc": "GSC",\n "gsh": "GSC",\n "gshader": "GLSL",\n "gsp": "Groovy",\n "gst": "Gosu",\n "gsx": "Gosu",\n "gtl": "Gerber Image",\n "gto": "Gerber Image",\n "gtp": "Gerber Image",\n "gtpl": "Groovy",\n "gts": "TypeScript",\n "gv": "Graphviz (DOT)",\n "gvy": "Groovy",\n "gyp": "Python",\n "gypi": "Python",\n "h": "C",\n "h++": "C++",\n "h.in": "C",\n "ha": "Hare",\n "hack": "Hack",\n "haml": "Haml",\n "haml.deface": "Haml",\n "handlebars": "Handlebars",\n "har": "JSON",\n "hats": "ATS",\n "hb": "Harbour",\n "hbs": "Handlebars",\n "hc": "HolyC",\n "hcl": "HCL",\n "heex": "HTML",\n "hh": "C++",\n "hhi": "Hack",\n "hic": "Clojure",\n "hip": "HIP",\n "hlsl": "HLSL",\n "hlsli": "HLSL",\n "hocon": "HOCON",\n "hoon": "hoon",\n "hpp": "C++",\n "hqf": "SQF",\n "hql": "HiveQL",\n "hrl": "Erlang",\n "hs": "Haskell",\n "hs-boot": "Haskell",\n "hsc": "Haskell",\n "hta": "HTML",\n "htm": "HTML",\n "html": "HTML",\n "html.eex": "HTML",\n "html.hl": "HTML",\n "html.tmpl": "Go Template",\n "http": "HTTP",\n "hurl": "Hurl",\n "hx": "Haxe",\n "hxml": "HXML",\n "hxsl": "Haxe",\n "hxx": "C++",\n "hy": "Hy",\n "hzp": "XML",\n "i": "Assembly",\n "i3": "Modula-3",\n "ical": "iCalendar",\n "ice": "Slice",\n "iced": "CoffeeScript",\n "icl": "Clean",\n "icls": "XML",\n "ics": "iCalendar",\n "idc": "C",\n "idr": "Idris",\n "ig": "Modula-3",\n "ihlp": "Stata",\n "ijm": "ImageJ Macro",\n "ijs": "J",\n "ik": "Ioke",\n "il": "IL Assembly",\n "ily": "LilyPond",\n "imba": "Imba",\n "iml": "XML",\n "inc": "Assembly",\n "ini": "INI",\n "inl": "C++",\n "ino": "C++",\n "ins": "TeX",\n "intr": "Dylan",\n "io": "Io",\n "iol": "Jolie",\n "ipf": "IGOR Pro",\n "ipp": "C++",\n "ipynb": "Jupyter Notebook",\n "isl": "Inno Setup",\n "ispc": "ISPC",\n "iss": "Inno Setup",\n "iuml": "PlantUML",\n "ivy": "XML",\n "ixx": "C++",\n "j": "Jasmin",\n "j2": "Jinja",\n "jac": "Jac",\n "jade": "Pug",\n "jai": "Jai",\n "jake": "JavaScript",\n "janet": "Janet",\n "jav": "Java",\n "java": "Java",\n "javascript": "JavaScript",\n "jbuilder": "Ruby",\n "jcl": "JCL",\n "jelly": "XML",\n "jflex": "Lex",\n "jinja": "Jinja",\n "jinja2": "Jinja",\n "jison": "Yacc",\n "jisonlex": "Lex",\n "jl": "Julia",\n "jq": "JSONiq",\n "js": "JavaScript",\n "js.erb": "JavaScript",\n "jsb": "JavaScript",\n "jscad": "JavaScript",\n "jsfl": "JavaScript",\n "jsh": "Java",\n "jslib": "JavaScript",\n "jsm": "JavaScript",\n "json": "JSON",\n "json-tmlanguage": "JSON",\n "json.example": "JSON",\n "json5": "JSON5",\n "jsonc": "JSON",\n "jsonl": "JSON",\n "jsonld": "JSONLD",\n "jsonnet": "Jsonnet",\n "jsp": "Java",\n "jspre": "JavaScript",\n "jsproj": "XML",\n "jss": "JavaScript",\n "jst": "EJS",\n "jsx": "JavaScript",\n "jte": "Java",\n "just": "Just",\n "k": "KCL",\n "kak": "KakouneScript",\n "kdl": "KDL",\n "kicad_mod": "KiCad Layout",\n "kicad_pcb": "KiCad Layout",\n "kicad_sch": "KiCad Schematic",\n "kicad_sym": "KiCad Schematic",\n "kicad_wks": "KiCad Layout",\n "kid": "Genshi",\n "kk": "Koka",\n "kml": "XML",\n "kojo": "Scala",\n "krl": "KRL",\n "ks": "KerboScript",\n "ksh": "Shell",\n "ksy": "Kaitai Struct",\n "kt": "Kotlin",\n "ktm": "Kotlin",\n "kts": "Kotlin",\n "kv": "kvlang",\n "l": "Common Lisp",\n "lagda": "Agda",\n "langium": "Langium",\n "lark": "Lark",\n "las": "Lasso",\n "lasso": "Lasso",\n "lasso8": "Lasso",\n "lasso9": "Lasso",\n "latte": "Latte",\n "launch": "XML",\n "lbx": "TeX",\n "leex": "HTML",\n "lektorproject": "INI",\n "leo": "Leo",\n "less": "Less",\n "lex": "Lex",\n "lfe": "LFE",\n "lgt": "Logtalk",\n "lhs": "Haskell",\n "libsonnet": "Jsonnet",\n "lid": "Dylan",\n "lidr": "Idris",\n "ligo": "LigoLANG",\n "linq": "C#",\n "liq": "Liquidsoap",\n "liquid": "Liquid",\n "lisp": "Common Lisp",\n "litcoffee": "CoffeeScript",\n "livecodescript": "LiveCode Script",\n "livemd": "Markdown",\n "lkml": "LookML",\n "ll": "LLVM",\n "lmi": "Python",\n "logtalk": "Logtalk",\n "lol": "LOLCODE",\n "lookml": "LookML",\n "lp": "Answer Set Programming",\n "lpr": "Pascal",\n "ls": "LiveScript",\n "lsl": "LSL",\n "lslp": "LSL",\n "lsp": "Common Lisp",\n "ltx": "TeX",\n "lua": "Lua",\n "luau": "Luau",\n "lvclass": "LabVIEW",\n "lvlib": "LabVIEW",\n "lvproj": "LabVIEW",\n "ly": "LilyPond",\n "m": "Objective-C",\n "m2": "Macaulay2",\n "m3": "Modula-3",\n "m3u": "M3U",\n "m3u8": "M3U",\n "ma": "Wolfram Language",\n "mak": "Makefile",\n "make": "Makefile",\n "makefile": "Makefile",\n "mako": "Mako",\n "man": "Roff",\n "mao": "Mako",\n "markdown": "Markdown",\n "marko": "Marko",\n "mask": "Mask",\n "mat": "Unity3D Asset",\n "mata": "Stata",\n "matah": "Stata",\n "mathematica": "Wolfram Language",\n "matlab": "MATLAB",\n "mawk": "Awk",\n "maxhelp": "Max",\n "maxpat": "Max",\n "maxproj": "Max",\n "mbt": "MoonBit",\n "mc": "Monkey C",\n "mcfunction": "mcfunction",\n "mch": "B (Formal Method)",\n "mcmeta": "JSON",\n "mcr": "MAXScript",\n "md": "Markdown",\n "mdoc": "Roff",\n "mdown": "Markdown",\n "mdpolicy": "XML",\n "mdwn": "Markdown",\n "mdx": "MDX",\n "me": "Roff",\n "mediawiki": "Wikitext",\n "mermaid": "Mermaid",\n "meta": "Unity3D Asset",\n "metal": "Metal",\n "metta": "MeTTa",\n "mg": "Modula-3",\n "mint": "Mint",\n "mir": "YAML",\n "mirah": "Mirah",\n "mjml": "XML",\n "mjs": "JavaScript",\n "mk": "Makefile",\n "mkd": "Markdown",\n "mkdn": "Markdown",\n "mkdown": "Markdown",\n "mkfile": "Makefile",\n "mkii": "TeX",\n "mkiv": "TeX",\n "mkvi": "TeX",\n "ml": "OCaml",\n "ml4": "OCaml",\n "mli": "OCaml",\n "mligo": "LigoLANG",\n "mlir": "MLIR",\n "mll": "OCaml",\n "mly": "OCaml",\n "mm": "Objective-C++",\n "mmd": "Mermaid",\n "mo": "Modelica",\n "mod": "Modula-2",\n "mojo": "Mojo",\n "moo": "Mercury",\n "moon": "MoonScript",\n "move": "Move",\n "mpl": "JetBrains MPS",\n "mps": "JetBrains MPS",\n "mq4": "MQL4",\n "mq5": "MQL5",\n "mqh": "MQL4",\n "mrc": "mIRC Script",\n "ms": "MAXScript",\n "msd": "JetBrains MPS",\n "msg": "OMNeT++ MSG",\n "mspec": "Ruby",\n "mt": "Wolfram Language",\n "mtml": "MTML",\n "mts": "TypeScript",\n "mu": "mupad",\n "mud": "ZIL",\n "mustache": "Mustache",\n "mxml": "XML",\n "mxt": "Max",\n "mysql": "SQL",\n "mzn": "MiniZinc",\n "n": "Nemerle",\n "nanorc": "INI",\n "nas": "Nasal",\n "nasm": "Assembly",\n "natvis": "XML",\n "nawk": "Awk",\n "nb": "Wolfram Language",\n "nbp": "Wolfram Language",\n "nc": "nesC",\n "ncl": "NCL",\n "ndproj": "XML",\n "ne": "Nearley",\n "nearley": "Nearley",\n "ned": "OMNeT++ NED",\n "nf": "Nextflow",\n "nginx": "Nginx",\n "nginxconf": "Nginx",\n "nim": "Nim",\n "nim.cfg": "Nim",\n "nimble": "Nim",\n "nimrod": "Nim",\n "nims": "Nim",\n "nit": "Nit",\n "nix": "Nix",\n "njk": "Nunjucks",\n "njs": "JavaScript",\n "nl": "NewLisp",\n "nlogo": "NetLogo",\n "nomad": "HCL",\n "nproj": "XML",\n "nqp": "Raku",\n "nr": "Noir",\n "nse": "Lua",\n "nss": "NWScript",\n "nu": "Nu",\n "numpy": "Python",\n "numpyw": "Python",\n "numsc": "Python",\n "nuspec": "XML",\n "nut": "Squirrel",\n "ny": "Common Lisp",\n "odd": "XML",\n "odin": "Odin",\n "ol": "Jolie",\n "omgrofl": "Omgrofl",\n "ooc": "ooc",\n "opal": "Opal",\n "opencl": "C",\n "orc": "Csound",\n "org": "Org",\n "os": "1C Enterprise",\n "osm": "XML",\n "outjob": "Altium Designer",\n "overpassql": "OverpassQL",\n "owl": "Web Ontology Language",\n "oxygene": "Oxygene",\n "oz": "Oz",\n "p": "OpenEdge ABL",\n "p4": "P4",\n "p6": "Raku",\n "p6l": "Raku",\n "p6m": "Raku",\n "p8": "Lua",\n "pac": "JavaScript",\n "pact": "Pact",\n "pan": "Pan",\n "parrot": "Parrot",\n "pas": "Pascal",\n "pascal": "Pascal",\n "pat": "Max",\n "pb": "PureBasic",\n "pbi": "PureBasic",\n "pbt": "PowerBuilder",\n "pcbdoc": "Altium Designer",\n "pck": "PLSQL",\n "pcss": "CSS",\n "pd_lua": "Lua",\n "pddl": "PDDL",\n "pde": "Processing",\n "peggy": "PEG.js",\n "pegjs": "PEG.js",\n "pep": "Pep8",\n "per": "Genero per",\n "perl": "Perl",\n "pfa": "PostScript",\n "pgsql": "PLpgSQL",\n "ph": "Perl",\n "php": "PHP",\n "php3": "PHP",\n "php4": "PHP",\n "php5": "PHP",\n "phps": "PHP",\n "phpt": "PHP",\n "phtml": "HTML",\n "pig": "PigLatin",\n "pike": "Pike",\n "pkb": "PLSQL",\n "pkgproj": "XML",\n "pkl": "Pkl",\n "pks": "PLSQL",\n "pl": "Perl",\n "pl6": "Raku",\n "plantuml": "PlantUML",\n "plb": "PLSQL",\n "plist": "XML",\n "plot": "Gnuplot",\n "pls": "PLSQL",\n "plsql": "PLSQL",\n "plt": "Gnuplot",\n "pluginspec": "Ruby",\n "plx": "Perl",\n "pm": "Perl",\n "pm6": "Raku",\n "pml": "Promela",\n "pmod": "Pike",\n "podsl": "Common Lisp",\n "podspec": "Ruby",\n "pogo": "PogoScript",\n "polar": "Polar",\n "por": "Portugol",\n "postcss": "CSS",\n "pov": "POV-Ray SDL",\n "pp": "Puppet",\n "pprx": "REXX",\n "praat": "Praat",\n "prawn": "Ruby",\n "prc": "PLSQL",\n "prefab": "Unity3D Asset",\n "prefs": "INI",\n "prg": "xBase",\n "prisma": "Prisma",\n "prjpcb": "Altium Designer",\n "pro": "Prolog",\n "proj": "XML",\n "prolog": "Prolog",\n "properties": "Java Properties",\n "props": "XML",\n "prw": "xBase",\n "ps": "PostScript",\n "ps1": "PowerShell",\n "ps1xml": "XML",\n "psc": "Papyrus",\n "psc1": "XML",\n "psd1": "PowerShell",\n "psgi": "Perl",\n "psm1": "PowerShell",\n "pt": "XML",\n "pubxml": "XML",\n "pug": "Pug",\n "puml": "PlantUML",\n "purs": "PureScript",\n "pwn": "Pawn",\n "pxd": "Cython",\n "pxi": "Cython",\n "py": "Python",\n "py3": "Python",\n "pyde": "Python",\n "pyi": "Python",\n "pyp": "Python",\n "pyt": "Python",\n "pytb": "Python",\n "pyw": "Python",\n "pyx": "Cython",\n "q": "HiveQL",\n "qasm": "OpenQASM",\n "qbs": "QML",\n "qc": "QuakeC",\n "qhelp": "XML",\n "ql": "CodeQL",\n "qll": "CodeQL",\n "qmd": "RMarkdown",\n "qml": "QML",\n "qnt": "Quint",\n "qs": "Q#",\n "r": "R",\n "r2": "Rebol",\n "r3": "Rebol",\n "rabl": "Ruby",\n "rake": "Ruby",\n "raku": "Raku",\n "rakumod": "Raku",\n "raml": "RAML",\n "rascript": "RAScript",\n "razor": "HTML",\n "rb": "Ruby",\n "rbi": "Ruby",\n "rbs": "Ruby",\n "rbuild": "Ruby",\n "rbw": "Ruby",\n "rbx": "Ruby",\n "rbxs": "Lua",\n "rchit": "GLSL",\n "rd": "R",\n "rdf": "XML",\n "rdoc": "RDoc",\n "re": "Reason",\n "reb": "Rebol",\n "rebol": "Rebol",\n "red": "Red",\n "reds": "Red",\n "reek": "YAML",\n "reg": "Windows Registry Entries",\n "regex": "Regular Expression",\n "regexp": "Regular Expression",\n "rego": "Open Policy Agent",\n "rei": "Reason",\n "religo": "LigoLANG",\n "res": "ReScript",\n "resi": "ReScript",\n "resource": "RobotFramework",\n "rest": "reStructuredText",\n "rest.txt": "reStructuredText",\n "resx": "XML",\n "rex": "REXX",\n "rexx": "REXX",\n "rg": "Rouge",\n "rhtml": "HTML",\n "ring": "Ring",\n "riot": "Riot",\n "rkt": "Racket",\n "rktd": "Racket",\n "rktl": "Racket",\n "rl": "Ragel",\n "rmd": "RMarkdown",\n "rmiss": "GLSL",\n "rnh": "RUNOFF",\n "rno": "RUNOFF",\n "rnw": "Sweave",\n "robot": "RobotFramework",\n "roc": "Roc",\n "rockspec": "Lua",\n "roff": "Roff",\n "ron": "RON",\n "ronn": "Markdown",\n "rpgle": "RPGLE",\n "rpy": "Ren\'Py",\n "rq": "SPARQL",\n "rs": "Rust",\n "rs.in": "Rust",\n "rsc": "Rascal",\n "rss": "XML",\n "rst": "reStructuredText",\n "rst.txt": "reStructuredText",\n "rsx": "R",\n "ru": "Ruby",\n "ruby": "Ruby",\n "rviz": "YAML",\n "s": "Assembly",\n "sail": "Sail",\n "sarif": "JSON",\n "sas": "SAS",\n "sass": "Sass",\n "sats": "ATS",\n "sbatch": "Shell",\n "sbt": "Scala",\n "sc": "SuperCollider",\n "scad": "OpenSCAD",\n "scala": "Scala",\n "scaml": "Scaml",\n "scd": "SuperCollider",\n "sce": "Scilab",\n "scenic": "Scenic",\n "sch": "Scheme",\n "schdoc": "Altium Designer",\n "sci": "Scilab",\n "scm": "Scheme",\n "sco": "Csound Score",\n "scpt": "AppleScript",\n "scrbl": "Racket",\n "scss": "SCSS",\n "scxml": "XML",\n "sdc": "Tcl",\n "sed": "sed",\n "self": "Self",\n "sexp": "Common Lisp",\n "sfproj": "XML",\n "sfv": "Checksums",\n "sh": "Shell",\n "sh.in": "Shell",\n "shader": "ShaderLab",\n "shen": "Shen",\n "shproj": "XML",\n "sig": "Standard ML",\n "sj": "Objective-J",\n "sjs": "JavaScript",\n "sl": "Slash",\n "slang": "Slang",\n "sld": "Scheme",\n "slim": "Slim",\n "slint": "Slint",\n "slnx": "XML",\n "sls": "SaltStack",\n "slurm": "Shell",\n "sma": "Pawn",\n "smithy": "Smithy",\n "smk": "Python",\n "sml": "Standard ML",\n "snakefile": "Python",\n "snap": "Jest Snapshot",\n "snip": "Vim Snippet",\n "snippet": "Vim Snippet",\n "snippets": "Vim Snippet",\n "sol": "Solidity",\n "soy": "Closure Templates",\n "sp": "SourcePawn",\n "sparql": "SPARQL",\n "spc": "PLSQL",\n "spec": "Python",\n "spin": "Propeller Spin",\n "sps": "Scheme",\n "sqf": "SQF",\n "sql": "SQL",\n "sqlrpgle": "RPGLE",\n "sra": "PowerBuilder",\n "srdf": "XML",\n "srt": "SRecode Template",\n "sru": "PowerBuilder",\n "srv": "ROS Interface",\n "srw": "PowerBuilder",\n "ss": "Scheme",\n "ssjs": "JavaScript",\n "sss": "SugarSS",\n "st": "Smalltalk",\n "stan": "Stan",\n "star": "Starlark",\n "sthlp": "Stata",\n "stl": "STL",\n "story": "Gherkin",\n "storyboard": "XML",\n "sttheme": "XML",\n "sty": "TeX",\n "styl": "Stylus",\n "sublime-build": "JSON",\n "sublime-color-scheme": "JSON",\n "sublime-commands": "JSON",\n "sublime-completions": "JSON",\n "sublime-keymap": "JSON",\n "sublime-macro": "JSON",\n "sublime-menu": "JSON",\n "sublime-mousemap": "JSON",\n "sublime-project": "JSON",\n "sublime-settings": "JSON",\n "sublime-snippet": "XML",\n "sublime-syntax": "YAML",\n "sublime-theme": "JSON",\n "sublime-workspace": "JSON",\n "sublime_metrics": "JSON",\n "sublime_session": "JSON",\n "surql": "SurrealQL",\n "sv": "SystemVerilog",\n "svelte": "Svelte",\n "svg": "SVG",\n "svh": "SystemVerilog",\n "svx": "mdsvex",\n "sw": "Sway",\n "swift": "Swift",\n "syntax": "YAML",\n "t": "Perl",\n "tab": "SQL",\n "tac": "Python",\n "tact": "Tact",\n "tag": "Java",\n "talon": "Talon",\n "targets": "XML",\n "tcc": "C++",\n "tcl": "Tcl",\n "tcl.in": "Tcl",\n "templ": "templ",\n "tesc": "GLSL",\n "tese": "GLSL",\n "tex": "TeX",\n "textgrid": "TextGrid",\n "textile": "Textile",\n "tf": "HCL",\n "tfstate": "JSON",\n "tfstate.backup": "JSON",\n "tftpl": "HCL",\n "tfvars": "HCL",\n "thor": "Ruby",\n "thrift": "Thrift",\n "thy": "Isabelle",\n "tl": "Teal",\n "tla": "TLA",\n "tlv": "TL-Verilog",\n "tm": "Tcl",\n "tmac": "Roff",\n "tmcommand": "XML",\n "tmdl": "TMDL",\n "tml": "XML",\n "tmlanguage": "XML",\n "tmpl": "Go Template",\n "tmpreferences": "XML",\n "tmsnippet": "XML",\n "tmtheme": "XML",\n "tmux": "Shell",\n "toc": "TeX",\n "tofu": "HCL",\n "toit": "Toit",\n "toml": "TOML",\n "toml.example": "TOML",\n "tool": "Shell",\n "topojson": "JSON",\n "tpb": "PLSQL",\n "tpl": "Smarty",\n "tpp": "C++",\n "tps": "PLSQL",\n "tres": "Godot Resource",\n "trg": "PLSQL",\n "trigger": "Apex",\n "ts": "TypeScript",\n "tscn": "Godot Resource",\n "tsconfig.json": "JSON",\n "tsp": "TypeSpec",\n "tst": "GAP",\n "tsv": "TSV",\n "tsx": "TypeScript",\n "tu": "Turing",\n "twig": "Twig",\n "txl": "TXL",\n "txt": "Adblock Filter List",\n "txx": "C++",\n "typ": "Typst",\n "uc": "UnrealScript",\n "udf": "SQL",\n "udo": "Csound",\n "ui": "XML",\n "unity": "Unity3D Asset",\n "uno": "Uno",\n "upc": "C",\n "uplc": "Untyped Plutus Core",\n "ur": "UrWeb",\n "urdf": "XML",\n "url": "INI",\n "urs": "UrWeb",\n "ux": "XML",\n "v": "Verilog",\n "vala": "Vala",\n "vapi": "Vala",\n "vark": "Gosu",\n "vb": "Visual Basic .NET",\n "vba": "VBA",\n "vbhtml": "Visual Basic .NET",\n "vbproj": "XML",\n "vbs": "VBScript",\n "vcf": "vCard",\n "vcl": "VCL",\n "vcxproj": "XML",\n "vdf": "Valve Data Format",\n "veo": "Verilog",\n "vert": "GLSL",\n "vh": "SystemVerilog",\n "vhd": "VHDL",\n "vhdl": "VHDL",\n "vhf": "VHDL",\n "vhi": "VHDL",\n "vho": "VHDL",\n "vhost": "ApacheConf",\n "vhs": "VHDL",\n "vht": "VHDL",\n "vhw": "VHDL",\n "vim": "Vim Script",\n "vimrc": "Vim Script",\n "viw": "SQL",\n "vmb": "Vim Script",\n "volt": "Volt",\n "vrx": "GLSL",\n "vs": "GLSL",\n "vsh": "GLSL",\n "vshader": "GLSL",\n "vsixmanifest": "XML",\n "vssettings": "XML",\n "vstemplate": "XML",\n "vtl": "Velocity Template Language",\n "vto": "Vento",\n "vue": "Vue",\n "vw": "PLSQL",\n "vxml": "XML",\n "vy": "Vyper",\n "w": "CWeb",\n "wast": "WebAssembly",\n "wat": "WebAssembly",\n "watchr": "Ruby",\n "wdl": "WDL",\n "webapp": "JSON",\n "webmanifest": "JSON",\n "wgsl": "WGSL",\n "whiley": "Whiley",\n "wiki": "Wikitext",\n "wikitext": "Wikitext",\n "wisp": "wisp",\n "wit": "WebAssembly Interface Type",\n "wixproj": "XML",\n "wl": "Wolfram Language",\n "wlk": "Wollok",\n "wls": "Wolfram Language",\n "wlt": "Wolfram Language",\n "wlua": "Lua",\n "workbook": "Markdown",\n "workflow": "HCL",\n "wren": "Wren",\n "ws": "Witcher Script",\n "wsdl": "XML",\n "wsf": "XML",\n "wsgi": "Python",\n "wxi": "XML",\n "wxl": "XML",\n "wxs": "XML",\n "x": "DirectX 3D File",\n "x10": "X10",\n "x3d": "XML",\n "x68": "Assembly",\n "xacro": "XML",\n "xaml": "XML",\n "xc": "XC",\n "xdc": "Tcl",\n "xht": "HTML",\n "xhtml": "HTML",\n "xib": "XML",\n "xlf": "XML",\n "xliff": "XML",\n "xmi": "XML",\n "xml": "XML",\n "xml.dist": "XML",\n "xmp": "XML",\n "xojo_code": "Xojo",\n "xojo_menu": "Xojo",\n "xojo_report": "Xojo",\n "xojo_script": "Xojo",\n "xojo_toolbar": "Xojo",\n "xojo_window": "Xojo",\n "xproj": "XML",\n "xpy": "Python",\n "xq": "XQuery",\n "xql": "XQuery",\n "xqm": "XQuery",\n "xquery": "XQuery",\n "xqy": "XQuery",\n "xrl": "Erlang",\n "xsd": "XML",\n "xsh": "Xonsh",\n "xsjs": "JavaScript",\n "xsjslib": "JavaScript",\n "xsl": "XSLT",\n "xslt": "XSLT",\n "xspec": "XML",\n "xtend": "Xtend",\n "xul": "XML",\n "xzap": "ZAP",\n "y": "Yacc",\n "yacc": "Yacc",\n "yaml": "MiniYAML",\n "yaml-tmlanguage": "YAML",\n "yaml.sed": "YAML",\n "yap": "Prolog",\n "yar": "YARA",\n "yara": "YARA",\n "yasnippet": "YASnippet",\n "yml": "YAML",\n "yml.mysql": "YAML",\n "yrl": "Erlang",\n "yul": "Yul",\n "yy": "Yacc",\n "yyp": "JSON",\n "zap": "ZAP",\n "zcml": "XML",\n "zed": "SpiceDB Schema",\n "zep": "Zephir",\n "zig": "Zig",\n "zig.zon": "Zig",\n "zil": "ZIL",\n "zimpl": "Zimpl",\n "zmodel": "Zmodel",\n "zmpl": "Zimpl",\n "zpl": "Zimpl",\n "zs": "ZenScript",\n "zsh": "Shell",\n "zsh-theme": "Shell"\n },\n "filename": {\n ".abbrev_defs": "Emacs Lisp",\n ".ackrc": "Option List",\n ".all-contributorsrc": "JSON",\n ".arcconfig": "JSON",\n ".atomignore": "Ignore List",\n ".auto-changelog": "JSON",\n ".babelignore": "Ignore List",\n ".babelrc": "JSON",\n ".bash_aliases": "Shell",\n ".bash_functions": "Shell",\n ".bash_history": "Shell",\n ".bash_logout": "Shell",\n ".bash_profile": "Shell",\n ".bashrc": "Shell",\n ".browserslistrc": "Browserslist",\n ".buckconfig": "INI",\n ".bzrignore": "Ignore List",\n ".c8rc": "JSON",\n ".clang-format": "YAML",\n ".clang-tidy": "YAML",\n ".clangd": "YAML",\n ".classpath": "XML",\n ".coffeelintignore": "Ignore List",\n ".coveragerc": "INI",\n ".cproject": "XML",\n ".cshrc": "Shell",\n ".cvsignore": "Ignore List",\n ".devcontainer.json": "JSON",\n ".dockerignore": "Ignore List",\n ".easignore": "Ignore List",\n ".editorconfig": "INI",\n ".eleventyignore": "Ignore List",\n ".emacs": "Emacs Lisp",\n ".emacs.desktop": "Emacs Lisp",\n ".env": "Dotenv",\n ".env.ci": "Dotenv",\n ".env.dev": "Dotenv",\n ".env.development": "Dotenv",\n ".env.development.local": "Dotenv",\n ".env.example": "Dotenv",\n ".env.local": "Dotenv",\n ".env.prod": "Dotenv",\n ".env.production": "Dotenv",\n ".env.sample": "Dotenv",\n ".env.staging": "Dotenv",\n ".env.template": "Dotenv",\n ".env.test": "Dotenv",\n ".env.testing": "Dotenv",\n ".envrc": "Shell",\n ".eslintignore": "Ignore List",\n ".eslintrc.json": "JSON",\n ".exrc": "Vim Script",\n ".factor-boot-rc": "Factor",\n ".factor-rc": "Factor",\n ".flake8": "INI",\n ".flaskenv": "Shell",\n ".gclient": "Python",\n ".gemrc": "YAML",\n ".git-blame-ignore-revs": "Git Revision List",\n ".gitattributes": "Git Attributes",\n ".gitconfig": "INI",\n ".gitignore": "Ignore List",\n ".gitmodules": "INI",\n ".gnus": "Emacs Lisp",\n ".gvimrc": "Vim Script",\n ".htaccess": "ApacheConf",\n ".htmlhintrc": "JSON",\n ".ignore": "Ignore List",\n ".imgbotconfig": "JSON",\n ".irbrc": "Ruby",\n ".jscsrc": "JSON",\n ".jshintrc": "JSON",\n ".jslintrc": "JSON",\n ".justfile": "Just",\n ".kshrc": "Shell",\n ".latexmkrc": "Perl",\n ".login": "Shell",\n ".luacheckrc": "Lua",\n ".markdownlintignore": "Ignore List",\n ".nanorc": "INI",\n ".nodemonignore": "Ignore List",\n ".npmignore": "Ignore List",\n ".npmrc": "INI",\n ".nvimrc": "Vim Script",\n ".nycrc": "JSON",\n ".oxlintrc.json": "JSON",\n ".php": "PHP",\n ".php_cs": "PHP",\n ".php_cs.dist": "PHP",\n ".prettierignore": "Ignore List",\n ".profile": "Shell",\n ".project": "XML",\n ".pryrc": "Ruby",\n ".pylintrc": "INI",\n ".rprofile": "R",\n ".rspec": "Option List",\n ".scalafix.conf": "HOCON",\n ".scalafmt.conf": "HOCON",\n ".shellcheckrc": "ShellCheck Config",\n ".simplecov": "Ruby",\n ".spacemacs": "Emacs Lisp",\n ".stylelintignore": "Ignore List",\n ".swcrc": "JSON",\n ".tern-config": "JSON",\n ".tern-project": "JSON",\n ".tm_properties": "TextMate Properties",\n ".tmux.conf": "Shell",\n ".vercelignore": "Ignore List",\n ".vimrc": "Vim Script",\n ".viper": "Emacs Lisp",\n ".vscodeignore": "Ignore List",\n ".watchmanconfig": "JSON",\n ".xinitrc": "Shell",\n ".xsession": "Shell",\n ".yardopts": "Option List",\n ".zlogin": "Shell",\n ".zlogout": "Shell",\n ".zprofile": "Shell",\n ".zshenv": "Shell",\n ".zshrc": "Shell",\n "9fs": "Shell",\n "_emacs": "Emacs Lisp",\n "_helpers.tpl": "Go Template",\n "_vimrc": "Vim Script",\n "abbrev_defs": "Emacs Lisp",\n "ack": "Perl",\n "ackrc": "Option List",\n "ant.xml": "Ant Build System",\n "apache2.conf": "ApacheConf",\n "api-extractor.json": "JSON",\n "apkbuild": "Shell",\n "app.config": "XML",\n "appraisals": "Ruby",\n "bash_aliases": "Shell",\n "bash_logout": "Shell",\n "bash_profile": "Shell",\n "bashrc": "Shell",\n "berksfile": "Ruby",\n "brewfile": "Ruby",\n "browserslist": "Browserslist",\n "bsdmakefile": "Makefile",\n "buck": "Starlark",\n "build": "Starlark",\n "build.bazel": "Starlark",\n "build.xml": "Ant Build System",\n "buildfile": "Ruby",\n "buildozer.spec": "INI",\n "bun.lock": "JSON",\n "cabal.config": "Cabal Config",\n "cabal.project": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cakefile": "CoffeeScript",\n "capfile": "Ruby",\n "cargo.lock": "TOML",\n "cargo.toml.orig": "TOML",\n "cask": "Emacs Lisp",\n "citation.cff": "YAML",\n "cmakelists.txt": "CMake",\n "commit_editmsg": "Git Commit",\n "composer.lock": "JSON",\n "containerfile": "Dockerfile",\n "contents.lr": "Markdown",\n "cpanfile": "Perl",\n "crontab": "crontab",\n "cshrc": "Shell",\n "dangerfile": "Ruby",\n "deliverfile": "Ruby",\n "deno.lock": "JSON",\n "deps": "Python",\n "dev-requirements.txt": "Pip Requirements",\n "devcontainer.json": "JSON",\n "dockerfile": "Dockerfile",\n "dune-project": "Dune",\n "earthfile": "Earthly",\n "eask": "Emacs Lisp",\n "emakefile": "Erlang",\n "eqnrc": "Roff",\n "expr-dist": "R",\n "fakefile": "Fancy",\n "fastfile": "Ruby",\n "firestore.rules": "Cloud Firestore Security Rules",\n "flake.lock": "JSON",\n "fp-lib-table": "KiCad Layout",\n "gemfile": "Ruby",\n "gemfile.lock": "Gemfile.lock",\n "gitignore-global": "Ignore List",\n "gitignore_global": "Ignore List",\n "glide.lock": "YAML",\n "gnumakefile": "Makefile",\n "go.mod": "Go Module",\n "go.sum": "Go Checksums",\n "go.work": "Go Workspace",\n "go.work.sum": "Go Checksums",\n "gopkg.lock": "TOML",\n "gradlew": "Shell",\n "gradlew.bat": "Batchfile",\n "guardfile": "Ruby",\n "gvimrc": "Vim Script",\n "haproxy.cfg": "HAProxy",\n "hosts": "Hosts File",\n "hosts.txt": "Hosts File",\n "httpd.conf": "ApacheConf",\n "installscript.qs": "Qt Script",\n "jakefile": "JavaScript",\n "jarfile": "Ruby",\n "jenkinsfile": "Groovy",\n "jsconfig.json": "JSON",\n "justfile": "Just",\n "kakrc": "KakouneScript",\n "kbuild": "Makefile",\n "kcl.mod": "KCL",\n "kcl.mod.lock": "KCL",\n "kshrc": "Shell",\n "language-configuration.json": "JSON",\n "language-subtag-registry.txt": "Record Jar",\n "latexmkrc": "Perl",\n "lexer.x": "Lex",\n "login": "Shell",\n "m3makefile": "Quake",\n "m3overrides": "Quake",\n "makefile": "Makefile",\n "makefile.am": "Makefile",\n "makefile.boot": "Makefile",\n "makefile.frag": "Makefile",\n "makefile.in": "Makefile",\n "makefile.inc": "Makefile",\n "makefile.pl": "Perl",\n "makefile.sco": "Makefile",\n "makefile.wat": "Makefile",\n "man": "Shell",\n "manifest.mf": "JAR Manifest",\n "mavenfile": "Ruby",\n "mcmod.info": "JSON",\n "meson.build": "Meson",\n "meson_options.txt": "Meson",\n "mise.local.lock": "TOML",\n "mise.lock": "TOML",\n "mix.lock": "Elixir",\n "mkfile": "Makefile",\n "mmn": "Roff",\n "mmt": "Roff",\n "mocha.opts": "Option List",\n "module.bazel": "Starlark",\n "module.bazel.lock": "JSON",\n "modulefile": "Puppet",\n "mvnw": "Shell",\n "mvnw.cmd": "Batchfile",\n "nanorc": "INI",\n "nextflow.config": "Nextflow",\n "nginx.conf": "Nginx",\n "nim.cfg": "Nim",\n "notebook": "Jupyter Notebook",\n "nuget.config": "XML",\n "nukefile": "Nu",\n "nvimrc": "Vim Script",\n "owh": "Tcl",\n "package.resolved": "JSON",\n "packages.config": "XML",\n "pdm.lock": "TOML",\n "phakefile": "PHP",\n "pipfile": "TOML",\n "pipfile.lock": "JSON",\n "pixi.lock": "YAML",\n "pkgbuild": "Shell",\n "podfile": "Ruby",\n "poetry.lock": "TOML",\n "procfile": "Procfile",\n "profile": "Shell",\n "project.ede": "Emacs Lisp",\n "project.godot": "Godot Resource",\n "puppetfile": "Ruby",\n "pylintrc": "INI",\n "rakefile": "Ruby",\n "rebar.config": "Erlang",\n "rebar.config.lock": "Erlang",\n "rebar.lock": "Erlang",\n "requirements-dev.txt": "Pip Requirements",\n "requirements.lock.txt": "Pip Requirements",\n "requirements.txt": "Pip Requirements",\n "rexfile": "Perl",\n "riemann.config": "Clojure",\n "root": "Isabelle",\n "sconscript": "Python",\n "sconstruct": "Python",\n "settings.stylecop": "XML",\n "singularity": "Singularity",\n "slakefile": "LiveScript",\n "snakefile": "Python",\n "snapfile": "Ruby",\n "starfield": "Tcl",\n "steepfile": "Ruby",\n "suite.rc": "INI",\n "thorfile": "Ruby",\n "tiltfile": "Starlark",\n "tmux.conf": "Shell",\n "toolchain_installscript.qs": "Qt Script",\n "torrc": "Tor Config",\n "troffrc": "Roff",\n "troffrc-end": "Roff",\n "tsconfig.json": "JSON",\n "tslint.json": "JSON",\n "uv.lock": "TOML",\n "vagrantfile": "Ruby",\n "vimrc": "Vim Script",\n "vlcrc": "INI",\n "web.config": "XML",\n "web.debug.config": "XML",\n "web.release.config": "XML",\n "workspace": "Starlark",\n "workspace.bazel": "Starlark",\n "workspace.bzlmod": "Starlark",\n "wscript": "Python",\n "xinitrc": "Shell",\n "xmake.lua": "Xmake",\n "xsession": "Shell",\n "yarn.lock": "YAML",\n "zlogin": "Shell",\n "zlogout": "Shell",\n "zprofile": "Shell",\n "zshenv": "Shell",\n "zshrc": "Shell"\n }\n },\n "vendor": [\n "(^|/)cache/",\n "^[Dd]ependencies/",\n "(^|/)dist/",\n "^deps/",\n "(^|/)configure$",\n "(^|/)config\\\\.guess$",\n "(^|/)config\\\\.sub$",\n "(^|/)aclocal\\\\.m4",\n "(^|/)libtool\\\\.m4",\n "(^|/)ltoptions\\\\.m4",\n "(^|/)ltsugar\\\\.m4",\n "(^|/)ltversion\\\\.m4",\n "(^|/)lt~obsolete\\\\.m4",\n "(^|/)dotnet-install\\\\.(ps1|sh)$",\n "(^|/)cpplint\\\\.py",\n "(^|/)node_modules/",\n "(^|/)\\\\.yarn/releases/",\n "(^|/)\\\\.yarn/plugins/",\n "(^|/)\\\\.yarn/sdks/",\n "(^|/)\\\\.yarn/versions/",\n "(^|/)\\\\.yarn/unplugged/",\n "(^|/)_esy$",\n "(^|/)bower_components/",\n "^rebar$",\n "(^|/)erlang\\\\.mk",\n "(^|/)Godeps/_workspace/",\n "(^|/)testdata/",\n "(^|/)\\\\.indent\\\\.pro",\n "(\\\\.|-)min\\\\.(js|css)$",\n "([^\\\\s]*)import\\\\.(css|less|scss|styl)$",\n "(^|/)bootstrap([^/.]*)(\\\\..*)?\\\\.(js|css|less|scss|styl)$",\n "(^|/)custom\\\\.bootstrap([^\\\\s]*)(js|css|less|scss|styl)$",\n "(^|/)font-?awesome\\\\.(css|less|scss|styl)$",\n "(^|/)font-?awesome/.*\\\\.(css|less|scss|styl)$",\n "(^|/)foundation\\\\.(css|less|scss|styl)$",\n "(^|/)normalize\\\\.(css|less|scss|styl)$",\n "(^|/)skeleton\\\\.(css|less|scss|styl)$",\n "(^|/)[Bb]ourbon/.*\\\\.(css|less|scss|styl)$",\n "(^|/)animate\\\\.(css|less|scss|styl)$",\n "(^|/)materialize\\\\.(css|less|scss|styl|js)$",\n "(^|/)select2/.*\\\\.(css|scss|js)$",\n "(^|/)bulma\\\\.(css|sass|scss)$",\n "(3rd|[Tt]hird)[-_]?[Pp]arty/",\n "(^|/)vendors?/",\n "(^|/)[Ee]xtern(als?)?/",\n "(^|/)[Vv]+endor/",\n "^debian/",\n "(^|/)run\\\\.n$",\n "(^|/)bootstrap-datepicker/",\n "(^|/)jquery([^.]*)\\\\.js$",\n "(^|/)jquery\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)jquery\\\\-ui(\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?)?(\\\\.\\\\w+)?\\\\.(js|css)$",\n "(^|/)jquery\\\\.(ui|effects)\\\\.([^.]*)\\\\.(js|css)$",\n "(^|/)jquery\\\\.fn\\\\.gantt\\\\.js",\n "(^|/)jquery\\\\.fancybox\\\\.(js|css)",\n "(^|/)fuelux\\\\.js",\n "(^|/)jquery\\\\.fileupload(-\\\\w+)?\\\\.js$",\n "(^|/)jquery\\\\.dataTables\\\\.js",\n "(^|/)bootbox\\\\.js",\n "(^|/)pdf\\\\.worker\\\\.js",\n "(^|/)slick\\\\.\\\\w+.js$",\n "(^|/)Leaflet\\\\.Coordinates-\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.src\\\\.js$",\n "(^|/)leaflet\\\\.draw-src\\\\.js",\n "(^|/)leaflet\\\\.draw\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.js",\n "(^|/)leaflet\\\\.spin\\\\.js",\n "(^|/)wicket-leaflet\\\\.js",\n "(^|/)\\\\.sublime-project",\n "(^|/)\\\\.sublime-workspace",\n "(^|/)\\\\.vscode/",\n "(^|/)prototype(.*)\\\\.js$",\n "(^|/)effects\\\\.js$",\n "(^|/)controls\\\\.js$",\n "(^|/)dragdrop\\\\.js$",\n "(.*?)\\\\.d\\\\.ts$",\n "(^|/)mootools([^.]*)\\\\d+\\\\.\\\\d+.\\\\d+([^.]*)\\\\.js$",\n "(^|/)dojo\\\\.js$",\n "(^|/)MochiKit\\\\.js$",\n "(^|/)yahoo-([^.]*)\\\\.js$",\n "(^|/)yui([^.]*)\\\\.js$",\n "(^|/)ckeditor\\\\.js$",\n "(^|/)tiny_mce([^.]*)\\\\.js$",\n "(^|/)tiny_mce/(langs|plugins|themes|utils)",\n "(^|/)ace-builds/",\n "(^|/)fontello(.*?)\\\\.css$",\n "(^|/)MathJax/",\n "(^|/)Chart\\\\.js$",\n "(^|/)[Cc]ode[Mm]irror/(\\\\d+\\\\.\\\\d+/)?(lib|mode|theme|addon|keymap|demo)",\n "(^|/)shBrush([^.]*)\\\\.js$",\n "(^|/)shCore\\\\.js$",\n "(^|/)shLegacy\\\\.js$",\n "(^|/)angular([^.]*)\\\\.js$",\n "(^|\\\\/)d3(\\\\.v\\\\d+)?([^.]*)\\\\.js$",\n "(^|/)react(-[^.]*)?\\\\.js$",\n "(^|/)flow-typed/.*\\\\.js$",\n "(^|/)modernizr\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)modernizr\\\\.custom\\\\.\\\\d+\\\\.js$",\n "(^|/)knockout-(\\\\d+\\\\.){3}(debug\\\\.)?js$",\n "(^|/)docs?/_?(build|themes?|templates?|static)/",\n "(^|/)admin_media/",\n "(^|/)env/",\n "(^|/)fabfile\\\\.py$",\n "(^|/)waf$",\n "(^|/)\\\\.osx$",\n "\\\\.xctemplate/",\n "\\\\.imageset/",\n "(^|/)Carthage/",\n "(^|/)Sparkle/",\n "(^|/)Crashlytics\\\\.framework/",\n "(^|/)Fabric\\\\.framework/",\n "(^|/)BuddyBuildSDK\\\\.framework/",\n "(^|/)Realm\\\\.framework",\n "(^|/)RealmSwift\\\\.framework",\n "(^|/)\\\\.gitattributes$",\n "(^|/)\\\\.gitignore$",\n "(^|/)\\\\.gitmodules$",\n "(^|/)gradlew$",\n "(^|/)gradlew\\\\.bat$",\n "(^|/)gradle/wrapper/",\n "(^|/)mvnw$",\n "(^|/)mvnw\\\\.cmd$",\n "(^|/)\\\\.mvn/wrapper/",\n "-vsdoc\\\\.js$",\n "\\\\.intellisense\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.validate(\\\\.unobtrusive)?\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.unobtrusive\\\\-ajax\\\\.js$",\n "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\\\.debug)?\\\\.js$",\n "(^|/)[Pp]ackages\\\\/.+\\\\.\\\\d+\\\\/",\n "(^|/)extjs/.*?\\\\.js$",\n "(^|/)extjs/.*?\\\\.xml$",\n "(^|/)extjs/.*?\\\\.txt$",\n "(^|/)extjs/.*?\\\\.html$",\n "(^|/)extjs/.*?\\\\.properties$",\n "(^|/)extjs/\\\\.sencha/",\n "(^|/)extjs/docs/",\n "(^|/)extjs/builds/",\n "(^|/)extjs/cmd/",\n "(^|/)extjs/examples/",\n "(^|/)extjs/locale/",\n "(^|/)extjs/packages/",\n "(^|/)extjs/plugins/",\n "(^|/)extjs/resources/",\n "(^|/)extjs/src/",\n "(^|/)extjs/welcome/",\n "(^|/)html5shiv\\\\.js$",\n "(^|/)[Tt]ests?/fixtures/",\n "(^|/)[Ss]pecs?/fixtures/",\n "(^|/)cordova([^.]*)\\\\.js$",\n "(^|/)cordova\\\\-\\\\d\\\\.\\\\d(\\\\.\\\\d)?\\\\.js$",\n "(^|/)foundation(\\\\..*)?\\\\.js$",\n "(^|/)Vagrantfile$",\n "(^|/)\\\\.[Dd][Ss]_[Ss]tore$",\n "(^|/)inst/extdata/",\n "(^|/)octicons\\\\.css",\n "(^|/)sprockets-octicons\\\\.scss",\n "(^|/)activator$",\n "(^|/)activator\\\\.bat$",\n "(^|/)proguard\\\\.pro$",\n "(^|/)proguard-rules\\\\.pro$",\n "(^|/)puphpet/",\n "(^|/)\\\\.google_apis/",\n "(^|/)Jenkinsfile$",\n "(^|/)\\\\.gitpod\\\\.Dockerfile$",\n "(^|/)\\\\.github/",\n "(^|/)\\\\.obsidian/",\n "(^|/)\\\\.teamcity/",\n "(^|/)xvba_modules/"\n ]\n}' OTHER_LANG = "Other" OTHER_COLOR = "#8b949e" @@ -338,6 +338,36 @@ NOISE_BASENAMES = frozenset({ "pdm.lock", "uv.lock", "flake.lock", }) +# Shebang interpreter → language, for extensionless scripts Linguist can't name +# from a path alone (e.g. `bin/deploy` with `#!/usr/bin/env bash`). A small +# curated map mirroring Linguist's `interpreters:`; trailing version digits are +# stripped (`python3` → `python`) before lookup. Names must be real Linguist +# languages so they pick up a color. +SHEBANG_LANG = { + "sh": "Shell", "bash": "Shell", "zsh": "Shell", "dash": "Shell", + "ksh": "Shell", "fish": "fish", "python": "Python", "ruby": "Ruby", + "node": "JavaScript", "perl": "Perl", "awk": "Awk", "gawk": "Awk", + "lua": "Lua", "php": "PHP", "rscript": "R", "tclsh": "Tcl", + "groovy": "Groovy", "osascript": "AppleScript", +} + + +def shebang_lang(first_line): + """Language for a `#!…` first line, or None. Resolves `env interp` and pins + `python3`→Python by stripping trailing version digits from the interpreter.""" + if not first_line.startswith("#!"): + return None + interp = None + for tok in first_line[2:].split(): + name = tok.rsplit("/", 1)[-1] + if name != "env": # skip the `env` in `#!/usr/bin/env python3` + interp = name + break + if not interp: + return None + interp = interp.lower() + return SHEBANG_LANG.get(interp) or SHEBANG_LANG.get(interp.rstrip("0123456789")) + def numstat_newpath(field): """Resolve a numstat path column to the post-rename path. @@ -355,9 +385,18 @@ def numstat_newpath(field): return field.split(" => ", 1)[1] -def classify_path(field): - """Map a numstat path column to a language name, or None to exclude it.""" +def classify_path(field, present=None, shebang=None): + """Map a numstat path column to a language name, or None to exclude it. + + `present`: when given, the set of paths at HEAD — files absent from it + (deleted since, or renamed away) are excluded so the bar reflects the repo + as it stands, not churn against files that no longer exist. + `shebang`: {path: language} for extensionless/unknown scripts a `#!` line + identified, so they land in their real language instead of "Other". + """ path = numstat_newpath(field.strip().strip('"')).replace("\\", "/") + if present is not None and path not in present: + return None # file no longer exists at HEAD — count only survivors if _VENDOR_RE and _VENDOR_RE.search(path): # Linguist vendored paths return None base = path.rsplit("/", 1)[-1].lower() @@ -368,9 +407,13 @@ def classify_path(field): if base in FILENAME_LANG: # Dockerfile, Makefile, Rakefile, … return FILENAME_LANG[base] dot = base.rfind(".") - if dot <= 0: # no extension, or a dotfile like ".gitignore" - return OTHER_LANG - return EXT_LANG.get(base[dot + 1:], OTHER_LANG) + if dot > 0: + lang = EXT_LANG.get(base[dot + 1:]) + if lang: + return lang + if shebang and path in shebang: # extensionless/unknown but has a #! line + return shebang[path] + return OTHER_LANG def top_languages(langs, limit=6): @@ -423,6 +466,19 @@ def _git_show(path, cwd=None): return "" +def _head_first_line(path, cwd=None): + """First line of `path` at HEAD, decoded leniently, or "". Reads bytes so a + stray binary doesn't crash the utf-8 decode `git(text=True)` would attempt.""" + try: + out = subprocess.run( + ["git", "show", f"HEAD:{path}"], cwd=cwd, capture_output=True + ).stdout + except OSError: + return "" + nl = out.find(b"\n") + return (out if nl < 0 else out[:nl]).decode("utf-8", "replace") + + def detect_frameworks(cwd=None): """Detect frameworks at HEAD from a local repo / bare clone. @@ -550,6 +606,37 @@ def _frameworks_from_files(paths, read_file): return groups +def head_languages(cwd=None): + """Inputs for the language bar that need the HEAD tree, not the log. + + Returns `(present, shebang)`: + - `present`: every path tracked at HEAD, so `classify_path` can drop churn + against files that no longer exist. + - `shebang`: {path: language} for extensionless/unknown files whose `#!` + line names an interpreter — peeked only for files `classify_path` would + otherwise bucket as "Other", so the read stays cheap. + + Plumbing-only (`ls-tree` + `git show`), so it works on bare clones too. The + remote GraphQL path has no per-file data and skips this entirely. + """ + try: + tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) + except subprocess.CalledProcessError: + return set(), {} + present = {p for p in tree.splitlines() if p} + shebang = {} + for path in present: + # Only extensionless files need a peek: scripts (`bin/deploy`) live here, + # while binaries carry an extension and would just waste a read (and + # choke a text decode). Skip anything classify_path can already name. + if "." in path.rsplit("/", 1)[-1] or classify_path(path) != OTHER_LANG: + continue + lang = shebang_lang(_head_first_line(path, cwd=cwd)) + if lang: + shebang[path] = lang + return present, shebang + + _CLONE_REFRESHED = set() @@ -699,12 +786,16 @@ def collect_local(cwd=None, suppress_current_user=False): pass log = git( + # -c core.quotePath=false: keep non-ASCII paths raw so they match the + # raw paths from head_languages() (both feed classify_path's present set). + "-c", "core.quotePath=false", "log", "--no-merges", "-M", "--format=%H\x1f%s\x1f%aE\x1f%aN\x1f%aI", "--numstat", cwd=cwd, ) commits_meta, line_stats, lang_stats = {}, {}, {} + present, shebang = head_languages(cwd=cwd) cur = None for line in log.splitlines(): if not line: @@ -735,7 +826,7 @@ def collect_local(cwd=None, suppress_current_user=False): line_stats[cur][0] += added line_stats[cur][1] += deleted if len(cols) >= 3: - lang = classify_path(cols[2]) + lang = classify_path(cols[2], present=present, shebang=shebang) if lang: rec = lang_stats.setdefault(cur, {}).setdefault(lang, [0, 0, 0]) rec[0] += added From f7252706ed6da092da5faca7a37b61a464e73b6b Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 19:35:20 +0100 Subject: [PATCH 03/14] Mark weekends in repo-intel contributions heatmap Overlay a faint orange tint on Sat/Sun cells, matching the weekend bands in the commit timeline. --- src/repo-intel/template.html | 2 +- stow/bin/repo-intel | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index 924a949..e3a6d26 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -408,7 +408,7 @@

const baseUrl = D.githubBaseUrl; const branchPath = (D.defaultBranch || 'main').split('/').map(encodeURIComponent).join('/'); let gridHtml = '
'; - weeksArr.forEach((week, wi) => { gridHtml += '
'; if (wi === 0 && week[0].dow > 0) for (let i = 0; i < week[0].dow; i++) gridHtml += ''; week.forEach(day => { const bg = cellColor(day.count); const href = baseUrl ? `${baseUrl}/commits/${branchPath}?after=&since=${day.key}&until=${day.key}` : '#'; gridHtml += ``; }); if (wi === weeksArr.length - 1 && week[week.length - 1].dow < 6) for (let i = week[week.length - 1].dow + 1; i <= 6; i++) gridHtml += ''; gridHtml += '
'; }); + weeksArr.forEach((week, wi) => { gridHtml += '
'; if (wi === 0 && week[0].dow > 0) for (let i = 0; i < week[0].dow; i++) gridHtml += ''; week.forEach(day => { const bg = cellColor(day.count); const cellBg = day.dow >= 5 ? `linear-gradient(rgba(240,170,90,0.05),rgba(240,170,90,0.05)),${bg}` : bg; const href = baseUrl ? `${baseUrl}/commits/${branchPath}?after=&since=${day.key}&until=${day.key}` : '#'; gridHtml += ``; }); if (wi === weeksArr.length - 1 && week[week.length - 1].dow < 6) for (let i = week[week.length - 1].dow + 1; i <= 6; i++) gridHtml += ''; gridHtml += '
'; }); gridHtml += '
'; const legendHtml = `
Less
More
`; container.innerHTML = `
${monthHtml}
${dayLabelsHtml}${gridHtml}
${legendHtml}
`; diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 43ff095..3f2c772 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( From 8db038be3995b2cd28180ac173e631077a237b81 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 19:38:43 +0100 Subject: [PATCH 04/14] Dedup HEAD tree listing and cache path classification in repo-intel The local path listed `git ls-tree -r HEAD` twice (head_languages + detect_frameworks) and re-ran the Linguist vendor regex for every numstat row, re-scanning the same paths across thousands of commits. - List the HEAD tree once in collect_local; pass the path set into both helpers. Rename head_languages -> head_shebangs (no longer owns the tree). - Cache classify_path per unique numstat field (present/shebang are fixed per run), turning per-row work into per-unique-path work. - Extract the duplicated fetch_failed bail-out into a bail_partial closure. --- src/repo-intel/repo-intel.py | 87 ++++++++++++++++++------------------ stow/bin/repo-intel | 87 ++++++++++++++++++------------------ 2 files changed, 86 insertions(+), 88 deletions(-) diff --git a/src/repo-intel/repo-intel.py b/src/repo-intel/repo-intel.py index 46eb139..8423b82 100755 --- a/src/repo-intel/repo-intel.py +++ b/src/repo-intel/repo-intel.py @@ -479,20 +479,15 @@ def _head_first_line(path, cwd=None): return (out if nl < 0 else out[:nl]).decode("utf-8", "replace") -def detect_frameworks(cwd=None): +def detect_frameworks(paths, cwd=None): """Detect frameworks at HEAD from a local repo / bare clone. + `paths`: the HEAD tree (repo-relative), already listed by the caller. Returns a list grouped by language, ordered by framework count: [{"language": "TypeScript", "color": "#3178c6", "names": [...]}, ...] Best-effort and local-only — the GraphQL remote path skips this. """ - try: - tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) - except subprocess.CalledProcessError: - return [] - return _frameworks_from_files( - [p for p in tree.splitlines() if p], lambda p: _git_show(p, cwd) - ) + return _frameworks_from_files(paths, lambda p: _git_show(p, cwd)) def _frameworks_from_files(paths, read_file): @@ -606,24 +601,15 @@ def gather(bases, requirements=False): return groups -def head_languages(cwd=None): - """Inputs for the language bar that need the HEAD tree, not the log. - - Returns `(present, shebang)`: - - `present`: every path tracked at HEAD, so `classify_path` can drop churn - against files that no longer exist. - - `shebang`: {path: language} for extensionless/unknown files whose `#!` - line names an interpreter — peeked only for files `classify_path` would - otherwise bucket as "Other", so the read stays cheap. +def head_shebangs(present, cwd=None): + """Shebang map for the language bar: {path: language}. - Plumbing-only (`ls-tree` + `git show`), so it works on bare clones too. The - remote GraphQL path has no per-file data and skips this entirely. + `present`: the HEAD tree (repo-relative). Returns the subset of + extensionless/unknown files whose `#!` line names an interpreter — peeked + only for files `classify_path` would otherwise bucket as "Other", so the + read stays cheap. Plumbing-only (`git show`), so it works on bare clones; + the remote GraphQL path has no per-file data and skips this entirely. """ - try: - tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) - except subprocess.CalledProcessError: - return set(), {} - present = {p for p in tree.splitlines() if p} shebang = {} for path in present: # Only extensionless files need a peek: scripts (`bin/deploy`) live here, @@ -634,7 +620,7 @@ def head_languages(cwd=None): lang = shebang_lang(_head_first_line(path, cwd=cwd)) if lang: shebang[path] = lang - return present, shebang + return shebang _CLONE_REFRESHED = set() @@ -786,8 +772,8 @@ def collect_local(cwd=None, suppress_current_user=False): pass log = git( - # -c core.quotePath=false: keep non-ASCII paths raw so they match the - # raw paths from head_languages() (both feed classify_path's present set). + # -c core.quotePath=false: keep non-ASCII paths raw so log paths match + # the `present` set from the HEAD tree below (both feed classify_path). "-c", "core.quotePath=false", "log", "--no-merges", "-M", "--format=%H\x1f%s\x1f%aE\x1f%aN\x1f%aI", @@ -795,7 +781,16 @@ def collect_local(cwd=None, suppress_current_user=False): cwd=cwd, ) commits_meta, line_stats, lang_stats = {}, {}, {} - present, shebang = head_languages(cwd=cwd) + try: + tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) + present = {p for p in tree.splitlines() if p} + except subprocess.CalledProcessError: + present = set() + shebang = head_shebangs(present, cwd=cwd) + # classify_path scans the vendor regex per path; the same paths recur across + # thousands of commits, so cache per unique numstat field (present/shebang + # are fixed for the run). + lang_cache = {} cur = None for line in log.splitlines(): if not line: @@ -826,7 +821,12 @@ def collect_local(cwd=None, suppress_current_user=False): line_stats[cur][0] += added line_stats[cur][1] += deleted if len(cols) >= 3: - lang = classify_path(cols[2], present=present, shebang=shebang) + field = cols[2] + if field in lang_cache: + lang = lang_cache[field] + else: + lang = classify_path(field, present=present, shebang=shebang) + lang_cache[field] = lang if lang: rec = lang_stats.setdefault(cur, {}).setdefault(lang, [0, 0, 0]) rec[0] += added @@ -834,7 +834,7 @@ def collect_local(cwd=None, suppress_current_user=False): rec[2] += 1 default_branch = detect_default_branch(cwd=cwd) - extras = {"lang_stats": lang_stats, "frameworks": detect_frameworks(cwd=cwd)} + extras = {"lang_stats": lang_stats, "frameworks": detect_frameworks(present, cwd=cwd)} return ( repo_name, github_base, @@ -1355,6 +1355,17 @@ def top_fetch_page(cursor): repo_meta["branch"] = branch_ref.get("name") or repo_meta["branch"] return branch_ref["target"]["history"] + def bail_partial(nodes): + """Persist a contiguous partial run after a fetch failure, then exit so + the next run resumes from its tail. Saved as incomplete on purpose.""" + if not no_cache and nodes: + save_cache(slug, nodes, False) + print( + f" cached {len(nodes)} commits so far — re-run to resume", + file=sys.stderr, + ) + sys.exit("error: GitHub fetch failed after repeated retries; aborting.") + new_nodes, top_reason = _paginate_history( top_fetch_page, cached_oids, last_n, since, have_count_baseline=len(cached_nodes), label="new", @@ -1364,13 +1375,7 @@ def top_fetch_page(cursor): # new_nodes is a contiguous run from HEAD. We never reached the old # cache, so merging would leave a gap — persist just the fresh prefix # (the next run resumes its tail via the older-fetch) and bail out. - if not no_cache and new_nodes: - save_cache(slug, new_nodes, False) - print( - f" cached {len(new_nodes)} commits so far — re-run to resume", - file=sys.stderr, - ) - sys.exit("error: GitHub fetch failed after repeated retries; aborting.") + bail_partial(new_nodes) if top_reason == "page_end" and cached_oids: print( @@ -1431,13 +1436,7 @@ def bottom_fetch_page(cursor): if bottom_reason == "fetch_failed": # new + cached + older are contiguous, so the partial run is a valid # prefix to persist; the next run extends from its tail. - if not no_cache and nodes: - save_cache(slug, nodes, False) - print( - f" cached {len(nodes)} commits so far — re-run to resume", - file=sys.stderr, - ) - sys.exit("error: GitHub fetch failed after repeated retries; aborting.") + bail_partial(nodes) if bottom_reason is None: new_complete = top_reason == "page_end" or loaded_complete else: diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 3f2c772..1944301 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -479,20 +479,15 @@ def _head_first_line(path, cwd=None): return (out if nl < 0 else out[:nl]).decode("utf-8", "replace") -def detect_frameworks(cwd=None): +def detect_frameworks(paths, cwd=None): """Detect frameworks at HEAD from a local repo / bare clone. + `paths`: the HEAD tree (repo-relative), already listed by the caller. Returns a list grouped by language, ordered by framework count: [{"language": "TypeScript", "color": "#3178c6", "names": [...]}, ...] Best-effort and local-only — the GraphQL remote path skips this. """ - try: - tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) - except subprocess.CalledProcessError: - return [] - return _frameworks_from_files( - [p for p in tree.splitlines() if p], lambda p: _git_show(p, cwd) - ) + return _frameworks_from_files(paths, lambda p: _git_show(p, cwd)) def _frameworks_from_files(paths, read_file): @@ -606,24 +601,15 @@ def _frameworks_from_files(paths, read_file): return groups -def head_languages(cwd=None): - """Inputs for the language bar that need the HEAD tree, not the log. - - Returns `(present, shebang)`: - - `present`: every path tracked at HEAD, so `classify_path` can drop churn - against files that no longer exist. - - `shebang`: {path: language} for extensionless/unknown files whose `#!` - line names an interpreter — peeked only for files `classify_path` would - otherwise bucket as "Other", so the read stays cheap. +def head_shebangs(present, cwd=None): + """Shebang map for the language bar: {path: language}. - Plumbing-only (`ls-tree` + `git show`), so it works on bare clones too. The - remote GraphQL path has no per-file data and skips this entirely. + `present`: the HEAD tree (repo-relative). Returns the subset of + extensionless/unknown files whose `#!` line names an interpreter — peeked + only for files `classify_path` would otherwise bucket as "Other", so the + read stays cheap. Plumbing-only (`git show`), so it works on bare clones; + the remote GraphQL path has no per-file data and skips this entirely. """ - try: - tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) - except subprocess.CalledProcessError: - return set(), {} - present = {p for p in tree.splitlines() if p} shebang = {} for path in present: # Only extensionless files need a peek: scripts (`bin/deploy`) live here, @@ -634,7 +620,7 @@ def head_languages(cwd=None): lang = shebang_lang(_head_first_line(path, cwd=cwd)) if lang: shebang[path] = lang - return present, shebang + return shebang _CLONE_REFRESHED = set() @@ -786,8 +772,8 @@ def collect_local(cwd=None, suppress_current_user=False): pass log = git( - # -c core.quotePath=false: keep non-ASCII paths raw so they match the - # raw paths from head_languages() (both feed classify_path's present set). + # -c core.quotePath=false: keep non-ASCII paths raw so log paths match + # the `present` set from the HEAD tree below (both feed classify_path). "-c", "core.quotePath=false", "log", "--no-merges", "-M", "--format=%H\x1f%s\x1f%aE\x1f%aN\x1f%aI", @@ -795,7 +781,16 @@ def collect_local(cwd=None, suppress_current_user=False): cwd=cwd, ) commits_meta, line_stats, lang_stats = {}, {}, {} - present, shebang = head_languages(cwd=cwd) + try: + tree = git("ls-tree", "-r", "HEAD", "--name-only", cwd=cwd) + present = {p for p in tree.splitlines() if p} + except subprocess.CalledProcessError: + present = set() + shebang = head_shebangs(present, cwd=cwd) + # classify_path scans the vendor regex per path; the same paths recur across + # thousands of commits, so cache per unique numstat field (present/shebang + # are fixed for the run). + lang_cache = {} cur = None for line in log.splitlines(): if not line: @@ -826,7 +821,12 @@ def collect_local(cwd=None, suppress_current_user=False): line_stats[cur][0] += added line_stats[cur][1] += deleted if len(cols) >= 3: - lang = classify_path(cols[2], present=present, shebang=shebang) + field = cols[2] + if field in lang_cache: + lang = lang_cache[field] + else: + lang = classify_path(field, present=present, shebang=shebang) + lang_cache[field] = lang if lang: rec = lang_stats.setdefault(cur, {}).setdefault(lang, [0, 0, 0]) rec[0] += added @@ -834,7 +834,7 @@ def collect_local(cwd=None, suppress_current_user=False): rec[2] += 1 default_branch = detect_default_branch(cwd=cwd) - extras = {"lang_stats": lang_stats, "frameworks": detect_frameworks(cwd=cwd)} + extras = {"lang_stats": lang_stats, "frameworks": detect_frameworks(present, cwd=cwd)} return ( repo_name, github_base, @@ -1355,6 +1355,17 @@ query($owner: String!, $repo: String!, $oid: GitObjectID!, $cursor: String, $pag repo_meta["branch"] = branch_ref.get("name") or repo_meta["branch"] return branch_ref["target"]["history"] + def bail_partial(nodes): + """Persist a contiguous partial run after a fetch failure, then exit so + the next run resumes from its tail. Saved as incomplete on purpose.""" + if not no_cache and nodes: + save_cache(slug, nodes, False) + print( + f" cached {len(nodes)} commits so far — re-run to resume", + file=sys.stderr, + ) + sys.exit("error: GitHub fetch failed after repeated retries; aborting.") + new_nodes, top_reason = _paginate_history( top_fetch_page, cached_oids, last_n, since, have_count_baseline=len(cached_nodes), label="new", @@ -1364,13 +1375,7 @@ query($owner: String!, $repo: String!, $oid: GitObjectID!, $cursor: String, $pag # new_nodes is a contiguous run from HEAD. We never reached the old # cache, so merging would leave a gap — persist just the fresh prefix # (the next run resumes its tail via the older-fetch) and bail out. - if not no_cache and new_nodes: - save_cache(slug, new_nodes, False) - print( - f" cached {len(new_nodes)} commits so far — re-run to resume", - file=sys.stderr, - ) - sys.exit("error: GitHub fetch failed after repeated retries; aborting.") + bail_partial(new_nodes) if top_reason == "page_end" and cached_oids: print( @@ -1431,13 +1436,7 @@ query($owner: String!, $repo: String!, $oid: GitObjectID!, $cursor: String, $pag if bottom_reason == "fetch_failed": # new + cached + older are contiguous, so the partial run is a valid # prefix to persist; the next run extends from its tail. - if not no_cache and nodes: - save_cache(slug, nodes, False) - print( - f" cached {len(nodes)} commits so far — re-run to resume", - file=sys.stderr, - ) - sys.exit("error: GitHub fetch failed after repeated retries; aborting.") + bail_partial(nodes) if bottom_reason is None: new_complete = top_reason == "page_end" or loaded_complete else: From 337092a4a077e255624f496be1c1ec4ad7b1c860 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 20:04:32 +0100 Subject: [PATCH 05/14] Add years bar to repo-intel commit timeline Render a per-year band between the tags strip and the histogram, with centered labels that stay on-screen at any zoom and contrasting alternating fills. Year-boundary verticals now run uninterrupted from the lanes through the tag strip into the bar (inter-row margins removed, lines drawn on each surface). Drop the redundant year suffix from axis labels and the TAGS label, and prefix the tag popover with "TAG". --- src/repo-intel/template.html | 120 +++++++++++++++++++++++++++-------- stow/bin/repo-intel | 2 +- 2 files changed, 93 insertions(+), 29 deletions(-) diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index e3a6d26..515b13e 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -141,9 +141,12 @@ .timeline-axis .timeline-tick { transform: none; top: 0; bottom: 0; width: 1px; background: rgba(255,255,255,0.06); pointer-events: none; } .timeline-canvas { display: block; position: sticky; left: 0; max-height: none; } .timeline-histogram { margin-top: 10px; opacity: 1; cursor: pointer; touch-action: none; } - .timeline-tags { margin-top: 6px; touch-action: none; } + .timeline-tags { touch-action: none; } + .timeline-years { position: relative; font-size: 0.68rem; color: var(--text-muted); font-variant-numeric: tabular-nums; } + .timeline-years .year-seg { position: absolute; top: 0; bottom: 0; border-left: 1px solid rgba(255,255,255,0.14); background: rgba(255,255,255,0.035); } + .timeline-years .year-seg.odd { background: rgba(255,255,255,0.085); } + .timeline-years .year-label { position: absolute; top: 0; line-height: 18px; transform: translateX(-50%); white-space: nowrap; pointer-events: none; } .timeline-labels .histogram-label { display: flex; align-items: center; justify-content: center; font-size: 0.7rem; color: var(--text-muted); margin-top: 10px; } - .timeline-labels .tags-label { display: flex; align-items: center; justify-content: flex-end; font-size: 0.65rem; color: var(--text-muted); margin-top: 6px; padding-right: 2px; letter-spacing: 0.04em; text-transform: uppercase; } .timeline-tooltip { position: fixed; z-index: 100; pointer-events: none; background: rgba(13,17,23,0.96); color: var(--text-primary); font-size: 0.75rem; @@ -164,6 +167,7 @@ .timeline-tooltip .tt-bundle-item:first-child { padding-top: 0; border-top: none; } .timeline-tooltip .tt-bundle-subject { color: var(--text-primary); word-break: break-word; } .timeline-tooltip .tt-bundle-meta { color: var(--text-muted); font-size: 0.7rem; margin-top: 2px; } + .timeline-tooltip .tt-tag-kicker { font-size: 0.62rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-muted); margin-right: 6px; } .timeline-tooltip .tt-tag-name { font-family: ui-monospace, SFMono-Regular, monospace; font-weight: 600; color: var(--text-primary); } .timeline-tooltip .tt-tag-icon { display: inline-block; width: 8px; height: 8px; border-radius: 50%; border: 1px solid rgba(255,255,255,0.9); margin-right: 6px; vertical-align: middle; } .timeline-labels .lane-label:hover { color: var(--text-primary); } @@ -665,6 +669,7 @@

const tagHitPad = 4; const histTagStripH = hasTags ? 6 : 0; const histHeight = histBarsHeight + histTagStripH; + const yearsBarHeight = 18; const height = contributors.length * laneHeight; const viewportWidth0 = Math.max(600, scrollDiv.clientWidth || 800); @@ -678,8 +683,9 @@

labelsHtml += `${escapeHtml(c.name)}`; }); if (hasTags) { - labelsHtml += `
Tags
`; + labelsHtml += `
`; } + labelsHtml += `
`; labelsHtml += `
`; labelsDiv.innerHTML = labelsHtml; @@ -745,6 +751,11 @@

innerDiv.appendChild(tagCanvas); } + const yearsBar = document.createElement('div'); + yearsBar.className = 'timeline-years'; + yearsBar.style.height = yearsBarHeight + 'px'; + innerDiv.appendChild(yearsBar); + const histCanvas = document.createElement('canvas'); histCanvas.className = 'timeline-canvas timeline-histogram'; const hctx = histCanvas.getContext('2d'); @@ -772,6 +783,7 @@

currentWidth = Math.max(canvasViewW, Math.floor(totalDays * currentPxPerDay)); innerDiv.style.width = currentWidth + 'px'; rebuildAxis(true); + rebuildYears(); } let resetAnimId = null; function stopResetAnim() { @@ -878,19 +890,6 @@

else if (mode === 'year') { cur.setDate(1); cur.setMonth(0); } } - let prevYear; - { - const prev = new Date(cur); - if (mode === 'hour') prev.setHours(prev.getHours() - hourStep); - else if (mode === 'day') prev.setDate(prev.getDate() - 1); - else if (mode === 'week') prev.setDate(prev.getDate() - 7); - else if (mode === 'month') prev.setMonth(prev.getMonth() - 1); - else if (mode === 'quarter') prev.setMonth(prev.getMonth() - 3); - else if (mode === 'half') prev.setMonth(prev.getMonth() - 6); - else prev.setFullYear(prev.getFullYear() - 1); - prevYear = prev.getFullYear(); - } - const fmtHour = h => { if (h === 0) return '12 AM'; if (h === 12) return '12 PM'; @@ -911,13 +910,11 @@

const nextX = ((nextCur - start) / totalMs) * width; const labelX = mode === 'hour' ? x : (x + nextX) / 2; const yr = cur.getFullYear(); - const showYear = prevYear !== yr; if (labelX >= -60 && labelX <= width + 60) { let label, cls = ''; if (mode === 'hour') { if (cur.getHours() === 0) { - const base = cur.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' }); - label = showYear ? `${base} ${yr}` : base; + label = cur.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' }); } else { label = fmtHour(cur.getHours()); cls = ' class="axis-hour"'; @@ -925,15 +922,13 @@

} else if (mode === 'year') { label = yr; } else if (mode === 'day' || mode === 'week') { - const base = cur.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' }); - label = showYear ? `${base} ${yr}` : base; + // Year is shown in the years bar below, so it's omitted here. + label = cur.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' }); } else { - const base = cur.toLocaleDateString('en-GB', { month: 'short' }); - label = showYear ? `${base} ${yr}` : base; + label = cur.toLocaleDateString('en-GB', { month: 'short' }); } html += `${label}`; } - prevYear = yr; if (mode === 'hour') cur.setHours(cur.getHours() + hourStep); else if (mode === 'day') cur.setDate(cur.getDate() + 1); else if (mode === 'week') cur.setDate(cur.getDate() + 7); @@ -976,6 +971,48 @@

rebuildHistogram(); } + function buildYearsInner(width) { + const firstYear = start.getFullYear(); + const lastYear = end.getFullYear(); + let html = ''; + for (let y = firstYear; y <= lastYear; y++) { + const segStart = Math.max(startT, new Date(y, 0, 1).getTime()); + const segEnd = Math.min(end.getTime(), new Date(y + 1, 0, 1).getTime()); + if (segEnd <= segStart) continue; + const x0 = ((segStart - startT) / totalMs) * width; + const x1 = ((segEnd - startT) / totalMs) * width; + const cls = (y % 2 === 0) ? 'year-seg' : 'year-seg odd'; + html += ``; + // The label is repositioned each scroll frame by positionYearLabels to + // pin it to the viewport's left edge while its band is in view (CSS + // position:sticky can't be used — .timeline-inner has overflow:clip). + html += `${y}`; + } + return html; + } + + function positionYearLabels() { + const sl = scrollDiv.scrollLeft; + const vw = canvasViewW || viewportW(); + const labels = yearsBar.querySelectorAll('.year-label'); + for (const lab of labels) { + const x0 = +lab.dataset.x0, x1 = +lab.dataset.x1; + // Centre the label within the band's currently-visible portion, so it + // stays centred and on-screen at any zoom. Runs every scroll frame, so + // the motion is smooth rather than jumping. + const visLo = Math.max(x0, sl), visHi = Math.min(x1, sl + vw); + if (visHi <= visLo) { lab.style.display = 'none'; continue; } + lab.style.display = ''; + lab.style.left = (visLo + visHi) / 2 + 'px'; + } + } + + function rebuildYears() { + yearsBar.style.width = currentWidth + 'px'; + yearsBar.innerHTML = buildYearsInner(currentWidth); + positionYearLabels(); + } + let lastAxisSL = -Infinity; function rebuildAxis(force) { const sl = scrollDiv.scrollLeft; @@ -1037,6 +1074,33 @@

} } + // Year-boundary verticals, drawn on both the lane canvas and the tag strip so + // they line up with the years-bar dividers below and read as one continuous + // line connecting the timeline to the years bar. + function drawYearLines(c, h) { + const sl = scrollDiv.scrollLeft; + const visEndMs = ((sl + canvasViewW) / currentWidth) * totalMs; + const cursor = new Date(startT + (sl / currentWidth) * totalMs); + cursor.setMonth(0, 1); + cursor.setHours(0, 0, 0, 0); + c.strokeStyle = 'rgba(255,255,255,0.14)'; + c.lineWidth = 1; + c.beginPath(); + let drawn = 0; + while (drawn < 200) { + const tMs = cursor.getTime() - startT; + if (tMs > visEndMs) break; + const x = (tMs / totalMs) * currentWidth - sl; + if (x >= -1 && x <= canvasViewW + 1) { + c.moveTo(Math.round(x) + 0.5, 0); + c.lineTo(Math.round(x) + 0.5, h); + } + cursor.setFullYear(cursor.getFullYear() + 1); + drawn++; + } + c.stroke(); + } + function drawCanvas() { const sl = scrollDiv.scrollLeft; ctx.setTransform(1, 0, 0, 1, 0, 0); @@ -1051,9 +1115,6 @@

} if (currentPxPerDay > 6) drawWeekendBands(); - if (currentPxPerDay < 1.5) { - drawGridLines(d => { d.setMonth(0); d.setDate(1); d.setHours(0, 0, 0, 0); }, d => d.setFullYear(d.getFullYear() + 1), 'rgba(255,255,255,0.08)'); - } if (currentPxPerDay >= 1.5 && currentPxPerDay <= 25) { drawGridLines(d => { d.setDate(1); d.setHours(0, 0, 0, 0); }, d => d.setMonth(d.getMonth() + 1), 'rgba(255,255,255,0.06)'); } @@ -1066,6 +1127,7 @@

if (currentPxPerDay > 80) { drawGridLines(d => d.setHours(12, 0, 0, 0), d => d.setDate(d.getDate() + 1), 'rgba(255,255,255,0.05)', [3, 4]); } + drawYearLines(ctx, height); if (hoveredTagIdx != null && tags[hoveredTagIdx]) { const tMs = tagMsList[hoveredTagIdx]; @@ -1143,6 +1205,7 @@

drawHistogram(); updateRangeText(); updateResetBtn(); + positionYearLabels(); } function drawTags() { @@ -1150,6 +1213,7 @@

tagctx.setTransform(1, 0, 0, 1, 0, 0); tagctx.scale(dpr, dpr); tagctx.clearRect(0, 0, canvasViewW, tagHeight); + drawYearLines(tagctx, tagHeight); const sl = scrollDiv.scrollLeft; const cy = tagHeight / 2; tagctx.lineWidth = 1; @@ -1565,7 +1629,7 @@

const msg = (t.message || '').trim(); const showMsg = msg && msg !== (t.name || '').trim(); tooltip.innerHTML = - `
${escapeHtml(t.name || '')}
` + + `
TAG${escapeHtml(t.name || '')}
` + (showMsg ? `
${escapeHtml(msg)}
` : '') + `
${escapeHtml(dateStr || t.date || '')}${timeStr ? ' ' + escapeHtml(timeStr) : ''}${oidShort ? ' · ' + escapeHtml(oidShort) + '' : ''}
`; tooltipHash = null; diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 1944301..c841888 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( From b4567565665eebfec17d6a7ca6db4e770666d1cf Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 20:20:36 +0100 Subject: [PATCH 06/14] Add drag-to-zoom rubber band to repo-intel commit timeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the timeline is fully zoomed out (nothing to pan), dragging the main view now draws a selection rectangle and zooms to that time window on release, with a crosshair cursor — mirroring the histogram minimap's select-zoom. Once zoomed in, dragging pans as before. Rebuilds stow/bin/repo-intel from the template. --- src/repo-intel/template.html | 59 +++++++++++++++++++++++++++++++++++- stow/bin/repo-intel | 2 +- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index 515b13e..b46f02a 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -134,6 +134,7 @@ .timeline-scroll { flex: 1; overflow-x: auto; cursor: grab; -webkit-user-select: none; user-select: none; min-width: 0; padding-bottom: 0; scrollbar-width: none; } .timeline-scroll::-webkit-scrollbar { display: none; width: 0; height: 0; } .timeline-scroll.dragging { cursor: grabbing; scroll-behavior: auto; } + .timeline-scroll.zoom-mode { cursor: crosshair; } .timeline-inner { position: relative; overflow-x: clip; } .timeline-axis { position: relative; font-size: 0.65rem; color: var(--text-muted); } .timeline-axis span { position: absolute; transform: translateX(-50%); top: 0; white-space: nowrap; } @@ -260,7 +261,7 @@

Contributions

Commit timeline

-
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
+
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
@@ -772,6 +773,8 @@

let positions = []; let hoveredHash = null; let hoveredTagIdx = null; + // Drag-to-zoom selection state (read by drawCanvas, so declared before its first call). + let selecting = false, selStartX = 0, selCurX = 0, selMoved = false; const resetBtn = document.getElementById('timelineReset'); let lastRangeText = ''; @@ -1201,10 +1204,20 @@

} } + if (selecting && selMoved) { + const xa = Math.min(selStartX, selCurX), xb = Math.max(selStartX, selCurX); + ctx.fillStyle = 'rgba(88,166,255,0.22)'; + ctx.fillRect(xa, 0, xb - xa, height); + ctx.strokeStyle = 'rgba(88,166,255,0.95)'; + ctx.lineWidth = 1; + ctx.strokeRect(xa + 0.5, 0.5, Math.max(1, xb - xa - 1), height - 1); + } + drawTags(); drawHistogram(); updateRangeText(); updateResetBtn(); + updateZoomCursor(); positionYearLabels(); } @@ -1481,6 +1494,8 @@

}); let isDown = false, startX, scrollLeft, lastX, lastTime, velocity = 0, animId = null; let suppressClickUntil = 0; + const SEL_THRESHOLD = 4; // mirrors MM_SEL_THRESHOLD; selection state declared above (TDZ-safe for drawCanvas) + canvas.addEventListener('click', e => { if (Date.now() < suppressClickUntil || !D.githubBaseUrl) return; const rect = canvas.getBoundingClientRect(); @@ -1493,6 +1508,15 @@

scrollDiv.addEventListener('mousedown', e => { stopInertia(); stopResetAnim(); + if (isZoomedOut()) { + // Nothing to pan when fully zoomed out — drag draws a zoom window instead. + selecting = true; dragging = true; + const rect = scrollDiv.getBoundingClientRect(); + selStartX = Math.max(0, Math.min(canvasViewW, e.clientX - rect.left)); + selCurX = selStartX; selMoved = false; + tooltip.classList.remove('visible'); + return; + } isDown = true; dragging = true; scrollDiv.classList.add('dragging'); startX = e.pageX - scrollDiv.offsetLeft; @@ -1500,6 +1524,14 @@

lastX = e.pageX; lastTime = Date.now(); velocity = 0; }); scrollDiv.addEventListener('mousemove', e => { + if (selecting) { + e.preventDefault(); + const rect = scrollDiv.getBoundingClientRect(); + selCurX = Math.max(0, Math.min(canvasViewW, e.clientX - rect.left)); + if (!selMoved && Math.abs(selCurX - selStartX) >= SEL_THRESHOLD) selMoved = true; + if (selMoved) drawCanvas(); + return; + } if (!isDown) return; e.preventDefault(); const x = e.pageX - scrollDiv.offsetLeft; @@ -1508,6 +1540,29 @@

if (dt > 0) { velocity = (e.pageX - lastX) / dt * 16; lastX = e.pageX; lastTime = now; } }); function release(e) { + if (selecting) { + selecting = false; dragging = false; + const moved = selMoved; selMoved = false; + if (moved) { + const sl = scrollDiv.scrollLeft; + const xa = Math.min(selStartX, selCurX), xb = Math.max(selStartX, selCurX); + const sl1 = Math.max(0, Math.min(currentWidth, sl + xa)); + const sl2 = Math.max(0, Math.min(currentWidth, sl + xb)); + if (sl2 - sl1 >= 1 && currentWidth > 0 && canvasViewW > 0) { + const daysSpan = Math.max(1e-6, (sl2 - sl1) / currentPxPerDay); + const newPxPerDay = Math.max(minPxPerDay, Math.min(maxPxPerDay, canvasViewW / daysSpan)); + const frac = sl1 / currentWidth; + currentPxPerDay = newPxPerDay; + applyLayout(); + scrollDiv.scrollLeft = clampSL(frac * currentWidth); + drawCanvas(); + } + suppressClickUntil = Date.now() + 250; + } else { + drawCanvas(); + } + return; + } if (!isDown) return; const moved = Math.abs((e ? e.pageX : lastX) - (startX + scrollDiv.offsetLeft)); isDown = false; @@ -1522,6 +1577,8 @@

function clampSL(sl) { return Math.max(0, Math.min(currentWidth - canvasViewW, sl)); } + function isZoomedOut() { return currentPxPerDay <= minPxPerDay + 1e-4; } + function updateZoomCursor() { scrollDiv.classList.toggle('zoom-mode', isZoomedOut()); } function mmWindowAtX(x) { const { left, right } = getMinimapWindow(); return x >= left && x <= right; diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index c841888..40d9f24 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag canvas to pan · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( From cc3fb0278befe08eea30e6fead51e1dc9b511f10 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 20:30:38 +0100 Subject: [PATCH 07/14] Restyle repo-intel framework list as comma-separated rows Replace per-framework pill chips with comma-separated names in divider-separated per-language rows, a calmer layout for the Technologies section. Rebuild the bundled artifact to match. --- src/repo-intel/template.html | 10 +++++----- stow/bin/repo-intel | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index b46f02a..00b79be 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -216,12 +216,12 @@ /* Technologies section. */ #tech .tech-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; } #tech .tech-bar-label { font-size: 0.78rem; color: var(--text-muted); margin: 0 0 4px; } - #tech .frameworks { display: flex; flex-direction: column; gap: 6px; } - #tech .fw-group { display: grid; grid-template-columns: 130px 1fr; gap: 10px; align-items: center; } + #tech .frameworks { display: flex; flex-direction: column; } + #tech .fw-group { display: grid; grid-template-columns: 130px 1fr; gap: 10px; align-items: baseline; padding: 9px 0; border-top: 1px solid var(--border-default); } + #tech .fw-group:first-child { border-top: none; } #tech .fw-lang { display: inline-flex; align-items: center; gap: 7px; font-size: 0.82rem; color: var(--text-secondary); font-weight: 600; } #tech .fw-lang .lang-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; } - #tech .fw-items { display: flex; flex-wrap: wrap; gap: 6px; } - #tech .fw-chip { background: var(--bg-badge); border: 1px solid var(--border-default); border-radius: 999px; padding: 2px 10px; font-size: 0.76rem; color: var(--text-secondary); white-space: nowrap; } + #tech .fw-items { font-size: 0.82rem; color: var(--text-secondary); line-height: 1.5; } #tech .tech-empty { color: var(--text-muted); font-size: 0.8rem; font-style: italic; } .timeline-tooltip .tt-ftypes { display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 5px; } .timeline-tooltip .tt-ftype { display: inline-flex; align-items: center; gap: 5px; font-size: 0.7rem; color: var(--text-secondary); } @@ -533,7 +533,7 @@

? `
` + frameworks.map(g => `
` + `${escapeHtml(g.language)}` + - `${g.names.map(n => `${escapeHtml(n)}`).join('')}` + + `${g.names.map(escapeHtml).join(', ')}` + `
` ).join('') + `
` : `
No known frameworks detected in the repo's dependency manifests.
` diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 40d9f24..cda583f 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( From 087017303d8a2a486501f8de901a11af986306f0 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 20:35:16 +0100 Subject: [PATCH 08/14] Clean up repo-intel: unify framework detection, reuse helpers - Collapse the four near-identical Python/Ruby/Go/Rust framework blocks into one config-driven loop in _frameworks_from_files - Reuse encodeBranch() in the heatmap instead of inlining the same split - Cache the .year-label NodeList in rebuildYears rather than re-querying the DOM every scroll frame in positionYearLabels - Trim two comments that narrated what the code does Rebuild stow/bin/repo-intel artifact. --- src/repo-intel/repo-intel.py | 35 +++++++++++++++++----------------- src/repo-intel/template.html | 13 ++++++------- stow/bin/repo-intel | 37 ++++++++++++++++++------------------ 3 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/repo-intel/repo-intel.py b/src/repo-intel/repo-intel.py index 8423b82..8bc5ce5 100755 --- a/src/repo-intel/repo-intel.py +++ b/src/repo-intel/repo-intel.py @@ -548,24 +548,23 @@ def gather(bases, requirements=False): add(js_lang, fw) # Text-matched ecosystems — concatenate the relevant manifests and look for - # whole-word dependency names. - py_text = gather({"pyproject.toml", "pipfile", "setup.py", "setup.cfg"}, - requirements=True).lower() - for dep, fw in FW_DEPS.get("Python", {}).items(): - if present(dep, py_text): - add("Python", fw) - rb_text = gather({"gemfile", "gemfile.lock"}).lower() - for dep, fw in FW_DEPS.get("Ruby", {}).items(): - if present(dep, rb_text): - add("Ruby", fw) - go_text = gather({"go.mod", "go.sum"}) # module paths, case-sensitive - for dep, fw in FW_DEPS.get("Go", {}).items(): - if dep in go_text: - add("Go", fw) - rs_text = gather({"cargo.toml"}).lower() - for dep, fw in FW_DEPS.get("Rust", {}).items(): - if present(dep, rs_text): - add("Rust", fw) + # dependency names. Go matches case-sensitive substrings (deps are full + # module paths like `github.com/gin-gonic/gin`); the rest fold to lowercase + # and match on whole words. Python also pulls in requirements*.txt. + text_ecosystems = ( + # (language, manifest basenames, requirements*.txt?, case-sensitive substring?) + ("Python", {"pyproject.toml", "pipfile", "setup.py", "setup.cfg"}, True, False), + ("Ruby", {"gemfile", "gemfile.lock"}, False, False), + ("Go", {"go.mod", "go.sum"}, False, True), + ("Rust", {"cargo.toml"}, False, False), + ) + for lang, bases, requirements, case_sensitive in text_ecosystems: + text = gather(bases, requirements=requirements) + if not case_sensitive: + text = text.lower() + for dep, fw in FW_DEPS.get(lang, {}).items(): + if (dep in text) if case_sensitive else present(dep, text): + add(lang, fw) # PHP — composer.json require sections (JSON). php_map = FW_DEPS.get("PHP", {}) diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index 00b79be..db94afa 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -411,7 +411,7 @@

let monthHtml = '
'; monthSpans.forEach(ms => { monthHtml += `${ms.label}`; }); monthHtml += '
'; let dayLabelsHtml = '
'; ['Mon','','Wed','','Fri','',''].forEach(l => { dayLabelsHtml += `${l}`; }); dayLabelsHtml += '
'; const baseUrl = D.githubBaseUrl; - const branchPath = (D.defaultBranch || 'main').split('/').map(encodeURIComponent).join('/'); + const branchPath = encodeBranch(D.defaultBranch); let gridHtml = '
'; weeksArr.forEach((week, wi) => { gridHtml += '
'; if (wi === 0 && week[0].dow > 0) for (let i = 0; i < week[0].dow; i++) gridHtml += ''; week.forEach(day => { const bg = cellColor(day.count); const cellBg = day.dow >= 5 ? `linear-gradient(rgba(240,170,90,0.05),rgba(240,170,90,0.05)),${bg}` : bg; const href = baseUrl ? `${baseUrl}/commits/${branchPath}?after=&since=${day.key}&until=${day.key}` : '#'; gridHtml += ``; }); if (wi === weeksArr.length - 1 && week[week.length - 1].dow < 6) for (let i = week[week.length - 1].dow + 1; i <= 6; i++) gridHtml += ''; gridHtml += '
'; }); gridHtml += '
'; @@ -994,15 +994,13 @@

return html; } + let yearLabels = []; // cached after each rebuildYears; re-queried per frame otherwise function positionYearLabels() { const sl = scrollDiv.scrollLeft; const vw = canvasViewW || viewportW(); - const labels = yearsBar.querySelectorAll('.year-label'); - for (const lab of labels) { + for (const lab of yearLabels) { const x0 = +lab.dataset.x0, x1 = +lab.dataset.x1; - // Centre the label within the band's currently-visible portion, so it - // stays centred and on-screen at any zoom. Runs every scroll frame, so - // the motion is smooth rather than jumping. + // Centre within the band's visible portion so the label stays on-screen at any zoom. const visLo = Math.max(x0, sl), visHi = Math.min(x1, sl + vw); if (visHi <= visLo) { lab.style.display = 'none'; continue; } lab.style.display = ''; @@ -1013,6 +1011,7 @@

function rebuildYears() { yearsBar.style.width = currentWidth + 'px'; yearsBar.innerHTML = buildYearsInner(currentWidth); + yearLabels = yearsBar.querySelectorAll('.year-label'); positionYearLabels(); } @@ -1494,7 +1493,7 @@

}); let isDown = false, startX, scrollLeft, lastX, lastTime, velocity = 0, animId = null; let suppressClickUntil = 0; - const SEL_THRESHOLD = 4; // mirrors MM_SEL_THRESHOLD; selection state declared above (TDZ-safe for drawCanvas) + const SEL_THRESHOLD = 4; // px before a press counts as a drag, not a click canvas.addEventListener('click', e => { if (Date.now() < suppressClickUntil || !D.githubBaseUrl) return; diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index cda583f..6cc4cfa 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( @@ -548,24 +548,23 @@ def _frameworks_from_files(paths, read_file): add(js_lang, fw) # Text-matched ecosystems — concatenate the relevant manifests and look for - # whole-word dependency names. - py_text = gather({"pyproject.toml", "pipfile", "setup.py", "setup.cfg"}, - requirements=True).lower() - for dep, fw in FW_DEPS.get("Python", {}).items(): - if present(dep, py_text): - add("Python", fw) - rb_text = gather({"gemfile", "gemfile.lock"}).lower() - for dep, fw in FW_DEPS.get("Ruby", {}).items(): - if present(dep, rb_text): - add("Ruby", fw) - go_text = gather({"go.mod", "go.sum"}) # module paths, case-sensitive - for dep, fw in FW_DEPS.get("Go", {}).items(): - if dep in go_text: - add("Go", fw) - rs_text = gather({"cargo.toml"}).lower() - for dep, fw in FW_DEPS.get("Rust", {}).items(): - if present(dep, rs_text): - add("Rust", fw) + # dependency names. Go matches case-sensitive substrings (deps are full + # module paths like `github.com/gin-gonic/gin`); the rest fold to lowercase + # and match on whole words. Python also pulls in requirements*.txt. + text_ecosystems = ( + # (language, manifest basenames, requirements*.txt?, case-sensitive substring?) + ("Python", {"pyproject.toml", "pipfile", "setup.py", "setup.cfg"}, True, False), + ("Ruby", {"gemfile", "gemfile.lock"}, False, False), + ("Go", {"go.mod", "go.sum"}, False, True), + ("Rust", {"cargo.toml"}, False, False), + ) + for lang, bases, requirements, case_sensitive in text_ecosystems: + text = gather(bases, requirements=requirements) + if not case_sensitive: + text = text.lower() + for dep, fw in FW_DEPS.get(lang, {}).items(): + if (dep in text) if case_sensitive else present(dep, text): + add(lang, fw) # PHP — composer.json require sections (JSON). php_map = FW_DEPS.get("PHP", {}) From 20bbecd0f037f0eb08766e1cadf1203764339601 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 20:41:50 +0100 Subject: [PATCH 09/14] Link repo-intel pattern-chart bars to commit pages via popover Clicking a bar in the commit-time or day-of-week charts opens a popover listing that bucket's commits, each row linking to its GitHub commit page. Buckets are reproduced client-side from the ISO string's author-local wall-clock to match the server-side histogram, rather than new Date().getHours() which would shift to the viewer's timezone. --- src/repo-intel/template.html | 99 +++++++++++++++++++++++++++++++++++- stow/bin/repo-intel | 2 +- 2 files changed, 98 insertions(+), 3 deletions(-) diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index db94afa..8fce204 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -213,6 +213,25 @@ .lang-legend .lang-pct { color: var(--text-muted); font-variant-numeric: tabular-nums; } .lane-popover .langbar { margin-top: 12px; } .lane-popover .lang-legend { font-size: 0.72rem; gap: 3px 10px; } + /* Commit-bucket popover — opened by clicking a bar in the pattern charts. */ + .commit-popover { + position: fixed; z-index: 120; pointer-events: auto; + background: rgba(13,17,23,0.98); color: var(--text-primary); + border: 1px solid var(--border-default); border-radius: 6px; + padding: 12px 14px; min-width: 280px; max-width: 380px; + box-shadow: 0 8px 28px rgba(0,0,0,0.5); + opacity: 0; transition: opacity 0.12s; visibility: hidden; + } + .commit-popover.visible { opacity: 1; visibility: visible; } + .commit-popover .cp-title { font-weight: 600; font-size: 0.9rem; line-height: 1.2; } + .commit-popover .cp-sub { color: var(--text-muted); font-size: 0.76rem; margin: 2px 0 10px; } + .commit-popover .cp-list { max-height: 280px; overflow-y: auto; margin: 0 -14px; padding: 0; } + .commit-popover .cp-row { display: flex; gap: 9px; align-items: baseline; padding: 5px 14px; text-decoration: none; color: var(--text-secondary); } + .commit-popover .cp-row:hover { background: var(--bg-badge); } + .commit-popover .cp-hash { font-family: ui-monospace, monospace; font-size: 0.72rem; color: var(--text-muted); flex-shrink: 0; } + .commit-popover .cp-msg { font-size: 0.78rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; min-width: 0; } + .commit-popover .cp-date { font-size: 0.72rem; color: var(--text-muted); flex-shrink: 0; font-variant-numeric: tabular-nums; } + .commit-popover .cp-more { color: var(--text-muted); font-size: 0.74rem; margin-top: 8px; text-align: center; } /* Technologies section. */ #tech .tech-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; } #tech .tech-bar-label { font-size: 0.78rem; color: var(--text-muted); margin: 0 0 4px; } @@ -1851,18 +1870,94 @@

const miniBarOpts = (c, i, xTicks) => ({ responsive: true, maintainAspectRatio: true, plugins: { legend: { display: false }, title: { display: true, text: c.name, color: clr(i), font: { size: 11 } } }, scales: { x: { ticks: { ...xTicks, font: { size: 9 } } }, y: { display: false, beginAtZero: true } } }); +// === COMMIT-BUCKET POPOVER (pattern-chart bars → GitHub commit pages) === +// The bars are histograms bucketed server-side by the commit's author-local +// wall-clock (Python datetime.fromisoformat(iso).hour / .weekday()). Reproduce +// that bucketing from the ISO string itself — new Date(iso).getHours() would +// reinterpret the instant in the viewer's timezone and miss the bar. +function isoBuckets(iso) { + const m = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):/.exec(iso || ''); + if (!m) return null; + const dow = (new Date(Date.UTC(+m[1], +m[2] - 1, +m[3])).getUTCDay() + 6) % 7; + return { hour: +m[4], dow }; +} +function commitsInBucket(email, kind, idx) { + return (D.commits || []) + .filter(c => { + if (c.e !== email) return false; + const b = isoBuckets(c.d); + return b && (kind === 'hour' ? b.hour === idx : b.dow === idx); + }) + .sort((a, b) => new Date(b.d) - new Date(a.d)); +} + +const dowFull = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; +const commitPopover = document.createElement('div'); +commitPopover.className = 'commit-popover'; +document.body.appendChild(commitPopover); +let commitPopoverOpen = false; +function hideCommitPopover() { if (commitPopoverOpen) { commitPopover.classList.remove('visible'); commitPopoverOpen = false; } } + +function showCommitPopover(anchor, c, colorIdx, label, list) { + const ROW_CAP = 200; + const rows = list.slice(0, ROW_CAP).map(c2 => + `` + + `${escapeHtml(c2.h)}` + + `${escapeHtml(c2.s || '')}` + + `${escapeHtml((c2.d || '').slice(0, 16).replace('T', ' '))}` + ).join(''); + const more = list.length > ROW_CAP ? `
+${fmt(list.length - ROW_CAP)} more
` : ''; + commitPopover.innerHTML = + `
${escapeHtml(label)}
` + + `
${escapeHtml(c.name)} · ${fmt(list.length)} commit${list.length === 1 ? '' : 's'}
` + + `
${rows}
${more}`; + + commitPopover.style.left = '-9999px'; + commitPopover.style.top = '0px'; + commitPopover.classList.add('visible'); + commitPopoverOpen = true; + const w = commitPopover.offsetWidth, h = commitPopover.offsetHeight, margin = 8; + const vw = document.documentElement.clientWidth, vh = document.documentElement.clientHeight; + let left = Math.max(margin, Math.min(anchor.x - w / 2, vw - w - margin)); + let top = anchor.top - h - 10; + if (top < margin) top = anchor.bottom + 10; + if (top + h + margin > vh) top = Math.max(margin, vh - h - margin); + commitPopover.style.left = left + 'px'; + commitPopover.style.top = top + 'px'; +} + +function makeBarClick(kind, c, colorIdx) { + return (evt, els, chart) => { + if (!D.githubBaseUrl || !els.length) return; + const idx = els[0].index; + const list = commitsInBucket(c.email, kind, idx); + if (!list.length) return; + const bar = chart.getDatasetMeta(0).data[idx]; + const rect = chart.canvas.getBoundingClientRect(); + const label = kind === 'hour' ? `${idx}:00–${idx}:59` : dowFull[idx]; + showCommitPopover({ x: rect.left + bar.x, top: rect.top + bar.y, bottom: rect.bottom }, c, colorIdx, label, list); + }; +} +const barHover = (evt, els) => { if (evt.native) evt.native.target.style.cursor = (els.length && D.githubBaseUrl) ? 'pointer' : ''; }; + +// Dismiss on outside click, scroll, or Escape. Capture phase runs before the +// chart's own click handler, so reopening on a fresh bar still works. +document.addEventListener('click', e => { if (commitPopoverOpen && !commitPopover.contains(e.target)) hideCommitPopover(); }, true); +document.addEventListener('keydown', e => { if (e.key === 'Escape') hideCommitPopover(); }); +window.addEventListener('scroll', e => { if (commitPopoverOpen && !commitPopover.contains(e.target)) hideCommitPopover(); }, true); + const hourLabels = Array.from({length: 24}, (_, i) => `${i}:00`); renderChartCards(document.getElementById('hourlyCharts'), 'hourly', (c, i) => ({ type: 'bar', data: { labels: hourLabels, datasets: [{ data: hourlyData[c.email], backgroundColor: clr(i) + '90', borderRadius: 2 }] }, - options: miniBarOpts(c, i, { maxTicksLimit: 6 }), + options: { ...miniBarOpts(c, i, { maxTicksLimit: 6 }), onClick: makeBarClick('hour', c, i), onHover: barHover }, })); const dowLabels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; renderChartCards(document.getElementById('dowCharts'), 'dow', (c, i) => ({ type: 'bar', data: { labels: dowLabels, datasets: [{ data: dowData[c.email], backgroundColor: dowData[c.email].map((v, di) => di >= 5 ? clr(i) + '30' : clr(i) + '90'), borderRadius: 3 }] }, - options: miniBarOpts(c, i, {}), + options: { ...miniBarOpts(c, i, {}), onClick: makeBarClick('dow', c, i), onHover: barHover }, })); // === RESET BUTTONS === diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 6cc4cfa..784a450 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( From f2aa7b3265faf5171ef541886a1e6de9f3ddb26c Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 21:50:38 +0100 Subject: [PATCH 10/14] Fold repo-intel langs only into colored parents; add fetch timeout Folding into a non-colored group (e.g. Checksums) seeded color-less language entries. Only fold when the group is itself a colored language, else fall back to the language's own name (guaranteed colored). Also add a 10s timeout to the Linguist fetch to avoid hangs. --- src/repo-intel/gen_techdata.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/repo-intel/gen_techdata.py b/src/repo-intel/gen_techdata.py index c3c3788..b232630 100644 --- a/src/repo-intel/gen_techdata.py +++ b/src/repo-intel/gen_techdata.py @@ -140,7 +140,7 @@ def fetch(url): req = urllib.request.Request(url, headers={"User-Agent": "repo-intel-gen"}) - with urllib.request.urlopen(req) as resp: + with urllib.request.urlopen(req, timeout=10) as resp: return resp.read().decode("utf-8") @@ -200,7 +200,11 @@ def build_language_tables(langs): for name, info in langs.items(): if not info.get("color"): continue - eff = info.get("group") or name # roll fine-grained langs into parent + # Roll fine-grained langs into their parent, but only when that parent + # is itself a colored language — otherwise a group like "Checksums" + # would seed color-less entries. + group = info.get("group") + eff = group if group and group in name_color else name rank = TYPE_RANK.get(info.get("type", ""), 4) for idx, ext in enumerate(info.get("extensions", [])): key = ext[1:].lower() if ext.startswith(".") else ext.lower() From 58ead89cb79dd3d28c23adc3dec084fd4210cec3 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 22:02:56 +0100 Subject: [PATCH 11/14] Populate repo-intel language bar on remote path via GitHub API The GraphQL remote path left the language bar empty since per-file languages are too expensive to fetch over the network. GitHub already runs Linguist and exposes repo-wide bytes-per-language at HEAD, so fetch the aggregate instead: it fills the repo bar (not per-author or per-commit stats, which still need a clone). Label distinguishes the byte-snapshot basis ('by code size') from local line churn. --- src/repo-intel/repo-intel.py | 54 +++++++++++++++++++++++++++++++--- src/repo-intel/template.html | 7 +++-- stow/bin/repo-intel | 56 ++++++++++++++++++++++++++++++++---- 3 files changed, 106 insertions(+), 11 deletions(-) diff --git a/src/repo-intel/repo-intel.py b/src/repo-intel/repo-intel.py index 8bc5ce5..458a059 100755 --- a/src/repo-intel/repo-intel.py +++ b/src/repo-intel/repo-intel.py @@ -1212,6 +1212,44 @@ def fetch_frameworks_remote(owner, repo, token): return _frameworks_from_files(paths, lambda p: contents.get(p, "")) +def fetch_languages_remote(owner, repo, token): + """Repo-wide language breakdown on the GraphQL path, no clone needed. + + GitHub runs Linguist itself and exposes the result as bytes-per-language at + HEAD. That's a composition snapshot, not the per-commit line churn the local + path tracks — so it can only fill the repo-wide bar, never per-author or + per-commit language stats. Reuses `top_languages` (ranking by the first + slot, here byte size) so colors and overflow collapsing match local runs. + Returns [] on error or when the repo has no detected languages. + """ + if not token: + return [] + query = """ +query($owner: String!, $repo: String!) { + repository(owner: $owner, name: $repo) { + languages(first: 50, orderBy: {field: SIZE, direction: DESC}) { + edges { size node { name } } + } + } +} +""".strip() + try: + body = gh_graphql(query, {"owner": owner, "repo": repo}, token) + except urllib.error.URLError as exc: + print(f" warning: language fetch failed: {exc}", file=sys.stderr) + return [] + if "errors" in body: + return [] + edges = ((gh_repository(body).get("languages") or {}).get("edges")) or [] + langs = {} + for e in edges: + name = ((e.get("node") or {}).get("name") or "").strip() + size = e.get("size") or 0 + if name and size > 0: + langs[name] = [size, 0, 0] + return top_languages(langs) + + def _paginate_history(fetch_page, cached_oids, last_n, since, have_count_baseline, label, skip_first=False): """Walk a Commit.history connection page by page. @@ -1462,9 +1500,12 @@ def bottom_fetch_page(cursor): logins[email] = user["login"] tags = fetch_remote_tags(owner, repo, token) - # Per-file languages need a clone, but manifests are cheap to fetch — so - # frameworks work on the GraphQL path; lang_stats stays empty here. + # Per-commit/per-author language churn needs a clone, so `lang_stats` stays + # empty here. But the repo-wide bar and frameworks both come straight from + # the API: GitHub runs Linguist for `repo_languages`, and manifests are + # cheap to fetch for frameworks. frameworks = fetch_frameworks_remote(owner, repo, token) + repo_languages = fetch_languages_remote(owner, repo, token) return ( repo_name, repo_url, @@ -1476,7 +1517,7 @@ def bottom_fetch_page(cursor): default_branch, repo_size_kb, tags, - {"lang_stats": {}, "frameworks": frameworks}, + {"lang_stats": {}, "frameworks": frameworks, "repo_languages": repo_languages}, ) @@ -1533,6 +1574,10 @@ def build_data( ): lang_stats = (extras or {}).get("lang_stats", {}) frameworks = (extras or {}).get("frameworks", []) + # Remote runs ship a precomputed repo-wide bar (bytes at HEAD); local/bare + # runs build it below from per-commit line churn. `repo_languages` being a + # non-empty list signals the former. + repo_languages = (extras or {}).get("repo_languages") or [] repo_langs = {} authors = {} daily_by_author = defaultdict(lambda: defaultdict(int)) @@ -1687,7 +1732,8 @@ def build_data( "dowData": dow_data, "commits": commits_list, "tags": tags or [], - "repoLanguages": top_languages(repo_langs), + "repoLanguages": repo_languages or top_languages(repo_langs), + "repoLanguagesBasis": "size" if repo_languages else "churn", "frameworks": frameworks or [], } diff --git a/src/repo-intel/template.html b/src/repo-intel/template.html index 8fce204..b2c6dd6 100644 --- a/src/repo-intel/template.html +++ b/src/repo-intel/template.html @@ -540,11 +540,14 @@

const frameworks = D.frameworks || []; const langEl = document.getElementById('techLanguages'); + const langLabel = D.repoLanguagesBasis === 'size' + ? 'Languages by code size' + : 'Languages by lines changed'; langEl.innerHTML = repoLangs.length - ? `
Languages by lines changed
` + + ? `
${langLabel}
` + langBarHtml(repoLangs, { legend: true, repoBase: D.githubBaseUrl }) : `
Languages
` + - `
Available on local or bare-clone runs — the remote GitHub API can't read per-file data. Run repo-intel inside a clone for the language breakdown.
`; + `
Couldn't load language data from the GitHub API for this repo.
`; const fwEl = document.getElementById('techFrameworks'); fwEl.innerHTML = `
Frameworks & tools
` + ( diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 784a450..c80cebc 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -71,7 +71,7 @@ from collections import defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path -TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' +TEMPLATE = '\n\n\n\n\n\nRepo Intel\n\n\n\n\n\n
\n

\n

\n
\n \n
\n

Contributions

\n

Commit timeline

\n
Drag to draw a zoom window (drag to pan once zoomed in) · Drag the histogram below to jump · Shift-scroll or pinch to zoom · Hover for details · Hover tag dots to mark a moment · Click to open on GitHub
\n
\n
\n
\n
\n
\n \n

Summary

\n \n \n \n \n \n \n \n \n \n \n \n \n
#AuthorCommits%Added%Deleted%Net%L/CActive daysAvg/dayFirstLast
\n

Overall

\n
\n
\n
\n
\n
\n

Commit frequency over time

\n

Commit time patterns (hour of day)

\n

Day of week patterns

\n
\n
\n
\n\n\n\n' PLACEHOLDER = "/*__DATA_INJECTION__*/" NOREPLY_RE = re.compile(r"(?:\d+\+)?(.+)@users\.noreply\.github\.com") ORIGIN_RE = re.compile( @@ -1212,6 +1212,44 @@ def fetch_frameworks_remote(owner, repo, token): return _frameworks_from_files(paths, lambda p: contents.get(p, "")) +def fetch_languages_remote(owner, repo, token): + """Repo-wide language breakdown on the GraphQL path, no clone needed. + + GitHub runs Linguist itself and exposes the result as bytes-per-language at + HEAD. That's a composition snapshot, not the per-commit line churn the local + path tracks — so it can only fill the repo-wide bar, never per-author or + per-commit language stats. Reuses `top_languages` (ranking by the first + slot, here byte size) so colors and overflow collapsing match local runs. + Returns [] on error or when the repo has no detected languages. + """ + if not token: + return [] + query = """ +query($owner: String!, $repo: String!) { + repository(owner: $owner, name: $repo) { + languages(first: 50, orderBy: {field: SIZE, direction: DESC}) { + edges { size node { name } } + } + } +} +""".strip() + try: + body = gh_graphql(query, {"owner": owner, "repo": repo}, token) + except urllib.error.URLError as exc: + print(f" warning: language fetch failed: {exc}", file=sys.stderr) + return [] + if "errors" in body: + return [] + edges = ((gh_repository(body).get("languages") or {}).get("edges")) or [] + langs = {} + for e in edges: + name = ((e.get("node") or {}).get("name") or "").strip() + size = e.get("size") or 0 + if name and size > 0: + langs[name] = [size, 0, 0] + return top_languages(langs) + + def _paginate_history(fetch_page, cached_oids, last_n, since, have_count_baseline, label, skip_first=False): """Walk a Commit.history connection page by page. @@ -1462,9 +1500,12 @@ query($owner: String!, $repo: String!, $oid: GitObjectID!, $cursor: String, $pag logins[email] = user["login"] tags = fetch_remote_tags(owner, repo, token) - # Per-file languages need a clone, but manifests are cheap to fetch — so - # frameworks work on the GraphQL path; lang_stats stays empty here. + # Per-commit/per-author language churn needs a clone, so `lang_stats` stays + # empty here. But the repo-wide bar and frameworks both come straight from + # the API: GitHub runs Linguist for `repo_languages`, and manifests are + # cheap to fetch for frameworks. frameworks = fetch_frameworks_remote(owner, repo, token) + repo_languages = fetch_languages_remote(owner, repo, token) return ( repo_name, repo_url, @@ -1476,7 +1517,7 @@ query($owner: String!, $repo: String!, $oid: GitObjectID!, $cursor: String, $pag default_branch, repo_size_kb, tags, - {"lang_stats": {}, "frameworks": frameworks}, + {"lang_stats": {}, "frameworks": frameworks, "repo_languages": repo_languages}, ) @@ -1533,6 +1574,10 @@ def build_data( ): lang_stats = (extras or {}).get("lang_stats", {}) frameworks = (extras or {}).get("frameworks", []) + # Remote runs ship a precomputed repo-wide bar (bytes at HEAD); local/bare + # runs build it below from per-commit line churn. `repo_languages` being a + # non-empty list signals the former. + repo_languages = (extras or {}).get("repo_languages") or [] repo_langs = {} authors = {} daily_by_author = defaultdict(lambda: defaultdict(int)) @@ -1687,7 +1732,8 @@ def build_data( "dowData": dow_data, "commits": commits_list, "tags": tags or [], - "repoLanguages": top_languages(repo_langs), + "repoLanguages": repo_languages or top_languages(repo_langs), + "repoLanguagesBasis": "size" if repo_languages else "churn", "frameworks": frameworks or [], } From f62c5d96e6759f81321d15abcc3c69ad46b7d5de Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 22:11:36 +0100 Subject: [PATCH 12/14] Expand repo-intel tool detection: Storybook, dev tooling, CI sentinels Add Storybook (canonical scoped adapters), Testing Library, Puppeteer, TestCafe, Biome, Turborepo, Nx, SWC, Babel, GraphQL, tRPC, Drizzle to the npm map; add pnpm/Yarn/Bun, GitLab CI, Vercel, Netlify, and GitHub Actions as Tools-bucket sentinels. Support a directory-prefix sentinel shape (trailing slash) for .github/workflows/. Regenerate techdata + artifact. --- src/repo-intel/gen_techdata.py | 31 ++++++++++++++-- src/repo-intel/repo-intel.py | 8 ++++- src/repo-intel/techdata.json | 65 +++++++++++++++++++++++++++++++++- stow/bin/repo-intel | 10 ++++-- 4 files changed, 107 insertions(+), 7 deletions(-) diff --git a/src/repo-intel/gen_techdata.py b/src/repo-intel/gen_techdata.py index b232630..6a1e7ce 100644 --- a/src/repo-intel/gen_techdata.py +++ b/src/repo-intel/gen_techdata.py @@ -62,10 +62,26 @@ "styled-components": "styled-components", "jest": "Jest", "vitest": "Vitest", "mocha": "Mocha", "playwright": "Playwright", "@playwright/test": "Playwright", - "cypress": "Cypress", "eslint": "ESLint", "prettier": "Prettier", + "cypress": "Cypress", "puppeteer": "Puppeteer", "testcafe": "TestCafe", + "@testing-library/react": "Testing Library", + "@testing-library/vue": "Testing Library", + "@testing-library/dom": "Testing Library", + "eslint": "ESLint", "prettier": "Prettier", "@biomejs/biome": "Biome", + # Storybook ships across many scoped packages; the framework adapters below + # cover both apps that embed it and addons that declare it as a peer dep. + "storybook": "Storybook", "@storybook/react": "Storybook", + "@storybook/vue3": "Storybook", "@storybook/angular": "Storybook", + "@storybook/svelte": "Storybook", "@storybook/html": "Storybook", + "@storybook/web-components": "Storybook", "@storybook/preact": "Storybook", + # Monorepo / task runners. + "turbo": "Turborepo", "nx": "Nx", "@nx/workspace": "Nx", + # Transpilers. + "@swc/core": "SWC", "@babel/core": "Babel", "redux": "Redux", "@reduxjs/toolkit": "Redux", "zustand": "Zustand", - "@apollo/client": "Apollo", "prisma": "Prisma", - "@prisma/client": "Prisma", "typeorm": "TypeORM", + "@apollo/client": "Apollo", "graphql": "GraphQL", + "@trpc/server": "tRPC", "@trpc/client": "tRPC", + "prisma": "Prisma", "@prisma/client": "Prisma", + "drizzle-orm": "Drizzle", "typeorm": "TypeORM", "mongoose": "Mongoose", "sequelize": "Sequelize", "three": "three.js", "d3": "D3", "chart.js": "Chart.js", } @@ -135,6 +151,15 @@ ["compose.yaml", "Docker Compose", "Tools"], ["Makefile", "Make", "Tools"], ["GNUmakefile", "Make", "Tools"], + ["pnpm-lock.yaml", "pnpm", "Tools"], + ["yarn.lock", "Yarn", "Tools"], + ["bun.lockb", "Bun", "Tools"], + ["bun.lock", "Bun", "Tools"], + [".gitlab-ci.yml", "GitLab CI", "Tools"], + ["vercel.json", "Vercel", "Tools"], + ["netlify.toml", "Netlify", "Tools"], + # Trailing slash → directory-prefix match (no single file to key on). + [".github/workflows/", "GitHub Actions", "Tools"], ] diff --git a/src/repo-intel/repo-intel.py b/src/repo-intel/repo-intel.py index 458a059..4585018 100755 --- a/src/repo-intel/repo-intel.py +++ b/src/repo-intel/repo-intel.py @@ -587,7 +587,13 @@ def gather(bases, requirements=False): if base.lower() in by_base: add(js_lang, fw) for base, fw, lang in FW_SENTINELS_OTHER: - if (base in paths) if "/" in base else (base.lower() in by_base): + if base.endswith("/"): # directory-prefix sentinel (e.g. .github/workflows/) + hit = any(p.startswith(base) for p in paths) + elif "/" in base: # exact sub-path + hit = base in paths + else: # basename + hit = base.lower() in by_base + if hit: add(lang, fw) groups = [] diff --git a/src/repo-intel/techdata.json b/src/repo-intel/techdata.json index 8eb7d82..9cb3d20 100644 --- a/src/repo-intel/techdata.json +++ b/src/repo-intel/techdata.json @@ -76,21 +76,38 @@ "npm": { "@angular/core": "Angular", "@apollo/client": "Apollo", + "@babel/core": "Babel", + "@biomejs/biome": "Biome", "@chakra-ui/react": "Chakra UI", "@hapi/hapi": "hapi", "@ionic/core": "Ionic", "@mui/material": "MUI", "@nestjs/core": "NestJS", + "@nx/workspace": "Nx", "@playwright/test": "Playwright", "@prisma/client": "Prisma", "@reduxjs/toolkit": "Redux", "@remix-run/react": "Remix", + "@storybook/angular": "Storybook", + "@storybook/html": "Storybook", + "@storybook/preact": "Storybook", + "@storybook/react": "Storybook", + "@storybook/svelte": "Storybook", + "@storybook/vue3": "Storybook", + "@storybook/web-components": "Storybook", "@sveltejs/kit": "SvelteKit", + "@swc/core": "SWC", + "@testing-library/dom": "Testing Library", + "@testing-library/react": "Testing Library", + "@testing-library/vue": "Testing Library", + "@trpc/client": "tRPC", + "@trpc/server": "tRPC", "astro": "Astro", "bootstrap": "Bootstrap", "chart.js": "Chart.js", "cypress": "Cypress", "d3": "D3", + "drizzle-orm": "Drizzle", "electron": "Electron", "esbuild": "esbuild", "eslint": "ESLint", @@ -98,17 +115,20 @@ "express": "Express", "fastify": "Fastify", "gatsby": "Gatsby", + "graphql": "GraphQL", "jest": "Jest", "koa": "Koa", "mocha": "Mocha", "mongoose": "Mongoose", "next": "Next.js", "nuxt": "Nuxt", + "nx": "Nx", "parcel": "Parcel", "playwright": "Playwright", "preact": "Preact", "prettier": "Prettier", "prisma": "Prisma", + "puppeteer": "Puppeteer", "react": "React", "react-dom": "React", "react-native": "React Native", @@ -116,10 +136,13 @@ "rollup": "Rollup", "sequelize": "Sequelize", "solid-js": "SolidJS", + "storybook": "Storybook", "styled-components": "styled-components", "svelte": "Svelte", "tailwindcss": "Tailwind CSS", + "testcafe": "TestCafe", "three": "three.js", + "turbo": "Turborepo", "typeorm": "TypeORM", "vite": "Vite", "vitest": "Vitest", @@ -220,6 +243,46 @@ "GNUmakefile", "Make", "Tools" + ], + [ + "pnpm-lock.yaml", + "pnpm", + "Tools" + ], + [ + "yarn.lock", + "Yarn", + "Tools" + ], + [ + "bun.lockb", + "Bun", + "Tools" + ], + [ + "bun.lock", + "Bun", + "Tools" + ], + [ + ".gitlab-ci.yml", + "GitLab CI", + "Tools" + ], + [ + "vercel.json", + "Vercel", + "Tools" + ], + [ + "netlify.toml", + "Netlify", + "Tools" + ], + [ + ".github/workflows/", + "GitHub Actions", + "Tools" ] ], "lang": { @@ -1888,7 +1951,7 @@ "self": "Self", "sexp": "Common Lisp", "sfproj": "XML", - "sfv": "Checksums", + "sfv": "Simple File Verification", "sh": "Shell", "sh.in": "Shell", "shader": "ShaderLab", diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index c80cebc..1918654 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -281,7 +281,7 @@ def iso_week_label(dt): # build.py inlines the JSON here; when unbuilt we read the sibling file. Used # only on the local + bare-clone paths — the GraphQL remote path lacks per-file # data, so these maps go unused there. -TECHDATA = '{\n "_source": {\n "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml",\n "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml"\n },\n "fw_deps": {\n "Go": {\n "github.com/gin-gonic/gin": "Gin",\n "github.com/go-chi/chi": "chi",\n "github.com/gofiber/fiber": "Fiber",\n "github.com/gorilla/mux": "Gorilla",\n "github.com/labstack/echo": "Echo",\n "github.com/spf13/cobra": "Cobra",\n "google.golang.org/grpc": "gRPC",\n "gorm.io/gorm": "GORM"\n },\n "PHP": {\n "cakephp/cakephp": "CakePHP",\n "laravel/framework": "Laravel",\n "slim/slim": "Slim",\n "symfony/framework-bundle": "Symfony",\n "symfony/symfony": "Symfony",\n "yiisoft/yii2": "Yii"\n },\n "Python": {\n "aiohttp": "aiohttp",\n "celery": "Celery",\n "click": "Click",\n "django": "Django",\n "djangorestframework": "Django REST",\n "fastapi": "FastAPI",\n "flask": "Flask",\n "httpx": "HTTPX",\n "keras": "Keras",\n "matplotlib": "Matplotlib",\n "numpy": "NumPy",\n "pandas": "pandas",\n "pydantic": "Pydantic",\n "pyramid": "Pyramid",\n "pytest": "pytest",\n "requests": "Requests",\n "sanic": "Sanic",\n "scikit-learn": "scikit-learn",\n "scipy": "SciPy",\n "scrapy": "Scrapy",\n "sqlalchemy": "SQLAlchemy",\n "starlette": "Starlette",\n "tensorflow": "TensorFlow",\n "torch": "PyTorch",\n "tornado": "Tornado",\n "transformers": "Transformers",\n "typer": "Typer"\n },\n "Ruby": {\n "devise": "Devise",\n "hanami": "Hanami",\n "puma": "Puma",\n "rails": "Rails",\n "rspec": "RSpec",\n "sidekiq": "Sidekiq",\n "sinatra": "Sinatra"\n },\n "Rust": {\n "actix-web": "Actix Web",\n "axum": "Axum",\n "bevy": "Bevy",\n "clap": "clap",\n "diesel": "Diesel",\n "rocket": "Rocket",\n "serde": "Serde",\n "tauri": "Tauri",\n "tokio": "Tokio",\n "tonic": "Tonic",\n "warp": "warp"\n },\n "npm": {\n "@angular/core": "Angular",\n "@apollo/client": "Apollo",\n "@chakra-ui/react": "Chakra UI",\n "@hapi/hapi": "hapi",\n "@ionic/core": "Ionic",\n "@mui/material": "MUI",\n "@nestjs/core": "NestJS",\n "@playwright/test": "Playwright",\n "@prisma/client": "Prisma",\n "@reduxjs/toolkit": "Redux",\n "@remix-run/react": "Remix",\n "@sveltejs/kit": "SvelteKit",\n "astro": "Astro",\n "bootstrap": "Bootstrap",\n "chart.js": "Chart.js",\n "cypress": "Cypress",\n "d3": "D3",\n "electron": "Electron",\n "esbuild": "esbuild",\n "eslint": "ESLint",\n "expo": "Expo",\n "express": "Express",\n "fastify": "Fastify",\n "gatsby": "Gatsby",\n "jest": "Jest",\n "koa": "Koa",\n "mocha": "Mocha",\n "mongoose": "Mongoose",\n "next": "Next.js",\n "nuxt": "Nuxt",\n "parcel": "Parcel",\n "playwright": "Playwright",\n "preact": "Preact",\n "prettier": "Prettier",\n "prisma": "Prisma",\n "react": "React",\n "react-dom": "React",\n "react-native": "React Native",\n "redux": "Redux",\n "rollup": "Rollup",\n "sequelize": "Sequelize",\n "solid-js": "SolidJS",\n "styled-components": "styled-components",\n "svelte": "Svelte",\n "tailwindcss": "Tailwind CSS",\n "three": "three.js",\n "typeorm": "TypeORM",\n "vite": "Vite",\n "vitest": "Vitest",\n "vue": "Vue",\n "webpack": "webpack",\n "zustand": "Zustand"\n }\n },\n "fw_sentinels_js": [\n [\n "next.config.js",\n "Next.js"\n ],\n [\n "next.config.ts",\n "Next.js"\n ],\n [\n "next.config.mjs",\n "Next.js"\n ],\n [\n "nuxt.config.js",\n "Nuxt"\n ],\n [\n "nuxt.config.ts",\n "Nuxt"\n ],\n [\n "svelte.config.js",\n "Svelte"\n ],\n [\n "astro.config.mjs",\n "Astro"\n ],\n [\n "vue.config.js",\n "Vue"\n ],\n [\n "gatsby-config.js",\n "Gatsby"\n ],\n [\n "angular.json",\n "Angular"\n ]\n ],\n "fw_sentinels_other": [\n [\n "manage.py",\n "Django",\n "Python"\n ],\n [\n "artisan",\n "Laravel",\n "PHP"\n ],\n [\n "config/application.rb",\n "Rails",\n "Ruby"\n ],\n [\n "Dockerfile",\n "Docker",\n "Tools"\n ],\n [\n "docker-compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "docker-compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "Makefile",\n "Make",\n "Tools"\n ],\n [\n "GNUmakefile",\n "Make",\n "Tools"\n ]\n ],\n "lang": {\n "color": {\n "1C Enterprise": "#814CCC",\n "2-Dimensional Array": "#38761D",\n "4D": "#004289",\n "ABAP": "#E8274B",\n "ABAP CDS": "#555e25",\n "AGS Script": "#B9D9FF",\n "AIDL": "#34EB6B",\n "AL": "#3AA2B5",\n "ALGOL": "#D1E0DB",\n "AMPL": "#E6EFBB",\n "ANTLR": "#9DC3FF",\n "API Blueprint": "#2ACCA8",\n "APL": "#5A8164",\n "ASP.NET": "#9400ff",\n "ATS": "#1ac620",\n "ActionScript": "#882B0F",\n "Ada": "#02f88c",\n "Adblock Filter List": "#800000",\n "Adobe Font Metrics": "#fa0f00",\n "Agda": "#315665",\n "Aiken": "#640ff8",\n "Alloy": "#64C800",\n "Alpine Abuild": "#0D597F",\n "Altium Designer": "#A89663",\n "AngelScript": "#C7D7DC",\n "Answer Set Programming": "#A9CC29",\n "Ant Build System": "#A9157E",\n "Antlers": "#ff269e",\n "ApacheConf": "#d12127",\n "Apex": "#1797c0",\n "Apollo Guidance Computer": "#0B3D91",\n "AppleScript": "#101F1F",\n "Arc": "#aa2afe",\n "AsciiDoc": "#73a0c5",\n "AspectJ": "#a957b0",\n "Assembly": "#6E4C13",\n "Astro": "#ff5a03",\n "Asymptote": "#ff0000",\n "Augeas": "#9CC134",\n "AutoHotkey": "#6594b9",\n "AutoIt": "#1C3552",\n "Avro IDL": "#0040FF",\n "Awk": "#c30e9b",\n "B (Formal Method)": "#8aa8c5",\n "B4X": "#00e4ff",\n "BASIC": "#ff0000",\n "BQN": "#2b7067",\n "Ballerina": "#FF5000",\n "Batchfile": "#C1F12E",\n "Beef": "#a52f4e",\n "Berry": "#15A13C",\n "BibTeX": "#778899",\n "Bicep": "#519aba",\n "Bikeshed": "#5562ac",\n "Bison": "#6A463F",\n "BitBake": "#00bce4",\n "Blade": "#f7523f",\n "BlitzBasic": "#00FFAE",\n "BlitzMax": "#cd6400",\n "Bluespec": "#12223c",\n "Bluespec BH": "#12223c",\n "Boo": "#d4bec1",\n "Boogie": "#c80fa0",\n "Brainfuck": "#2F2530",\n "BrighterScript": "#66AABB",\n "Brightscript": "#662D91",\n "Browserslist": "#ffd539",\n "Bru": "#F4AA41",\n "BuildStream": "#006bff",\n "C": "#555555",\n "C#": "#178600",\n "C++": "#f34b7d",\n "C3": "#2563eb",\n "CAP CDS": "#0092d1",\n "CLIPS": "#00A300",\n "CMake": "#DA3434",\n "COLLADA": "#F1A42B",\n "CQL": "#006091",\n "CSON": "#244776",\n "CSS": "#663399",\n "CSV": "#237346",\n "CUE": "#5886E1",\n "CWeb": "#00007a",\n "Cabal Config": "#483465",\n "Caddyfile": "#22b638",\n "Cadence": "#00ef8b",\n "Cairo": "#ff4a48",\n "Cairo Zero": "#ff4a48",\n "CameLIGO": "#3be133",\n "Cangjie": "#00868B",\n "Cap\'n Proto": "#c42727",\n "Carbon": "#222222",\n "Ceylon": "#dfa535",\n "Chapel": "#8dc63f",\n "ChucK": "#3f8000",\n "Circom": "#707575",\n "Cirru": "#ccccff",\n "Clarion": "#db901e",\n "Clarity": "#5546ff",\n "Classic ASP": "#6a40fd",\n "Clean": "#3F85AF",\n "Click": "#E4E6F3",\n "Clojure": "#db5855",\n "Closure Templates": "#0d948f",\n "Cloud Firestore Security Rules": "#FFA000",\n "Clue": "#0009b5",\n "CodeQL": "#140f46",\n "CoffeeScript": "#244776",\n "ColdFusion": "#ed2cd6",\n "ColdFusion CFC": "#ed2cd6",\n "Common Lisp": "#3fb68b",\n "Common Workflow Language": "#B5314C",\n "Component Pascal": "#B0CE4E",\n "Cooklang": "#E15A29",\n "Crystal": "#000100",\n "Csound": "#1a1a1a",\n "Csound Document": "#1a1a1a",\n "Csound Score": "#1a1a1a",\n "Cuda": "#3A4E3A",\n "Curry": "#531242",\n "Cylc": "#00b3fd",\n "Cypher": "#34c0eb",\n "Cython": "#fedf5b",\n "D": "#ba595e",\n "D2": "#526ee8",\n "DM": "#447265",\n "Dafny": "#FFEC25",\n "Darcs Patch": "#8eff23",\n "Dart": "#00B4AB",\n "Daslang": "#d3d3d3",\n "DataWeave": "#003a52",\n "Debian Package Control File": "#D70751",\n "DenizenScript": "#FBEE96",\n "Dhall": "#dfafff",\n "DirectX 3D File": "#aace60",\n "Dockerfile": "#384d54",\n "Dogescript": "#cca760",\n "Dotenv": "#e5d559",\n "Dune": "#89421e",\n "Dylan": "#6c616e",\n "E": "#ccce35",\n "ECL": "#8a1267",\n "ECLiPSe": "#001d9d",\n "EJS": "#a91e50",\n "EQ": "#a78649",\n "Earthly": "#2af0ff",\n "Easybuild": "#069406",\n "Ecere Projects": "#913960",\n "Ecmarkup": "#eb8131",\n "Edge": "#0dffe0",\n "EdgeQL": "#31A7FF",\n "EditorConfig": "#fff1f2",\n "Eiffel": "#4d6977",\n "Elixir": "#6e4a7e",\n "Elm": "#60B5CC",\n "Elvish": "#55BB55",\n "Elvish Transcript": "#55BB55",\n "Emacs Lisp": "#c065db",\n "EmberScript": "#FFF4F3",\n "Erlang": "#B83998",\n "Euphoria": "#FF790B",\n "F#": "#b845fc",\n "F*": "#572e30",\n "FIGlet Font": "#FFDDBB",\n "FIRRTL": "#2f632f",\n "FLUX": "#88ccff",\n "Factor": "#636746",\n "Fancy": "#7b9db4",\n "Fantom": "#14253c",\n "Faust": "#c37240",\n "Fennel": "#fff3d7",\n "Filebench WML": "#F6B900",\n "FlatBuffers": "#ed284a",\n "Flix": "#d44a45",\n "Fluent": "#ffcc33",\n "Forth": "#341708",\n "Fortran": "#4d41b1",\n "Fortran Free Form": "#4d41b1",\n "FreeBASIC": "#141AC9",\n "FreeMarker": "#0050b2",\n "Frege": "#00cafe",\n "Futhark": "#5f021f",\n "G-code": "#D08CF2",\n "GAML": "#FFC766",\n "GAMS": "#f49a22",\n "GAP": "#0000cc",\n "GCC Machine Description": "#FFCFAB",\n "GDScript": "#355570",\n "GDShader": "#478CBF",\n "GEDCOM": "#003058",\n "GLSL": "#5686a5",\n "GSC": "#FF6800",\n "Game Maker Language": "#71b417",\n "Gemfile.lock": "#701516",\n "Gemini": "#ff6900",\n "Genero 4gl": "#63408e",\n "Genero per": "#d8df39",\n "Genie": "#fb855d",\n "Genshi": "#951531",\n "Gentoo Ebuild": "#9400ff",\n "Gentoo Eclass": "#9400ff",\n "Gerber Image": "#d20b00",\n "Gherkin": "#5B2063",\n "Git Attributes": "#F44D27",\n "Git Commit": "#F44D27",\n "Git Config": "#F44D27",\n "Git Revision List": "#F44D27",\n "Gleam": "#ffaff3",\n "Glimmer JS": "#F5835F",\n "Glimmer TS": "#3178c6",\n "Glyph": "#c1ac7f",\n "Gnuplot": "#f0a9f0",\n "Go": "#00ADD8",\n "Go Checksums": "#00ADD8",\n "Go Module": "#00ADD8",\n "Go Template": "#00ADD8",\n "Go Workspace": "#00ADD8",\n "Godot Resource": "#355570",\n "Golo": "#88562A",\n "Gosu": "#82937f",\n "Grace": "#615f8b",\n "Gradle": "#02303a",\n "Gradle Kotlin DSL": "#02303a",\n "Grammatical Framework": "#ff0000",\n "GraphQL": "#e10098",\n "Graphviz (DOT)": "#2596be",\n "Groovy": "#4298b8",\n "Groovy Server Pages": "#4298b8",\n "HAProxy": "#106da9",\n "HCL": "#844FBA",\n "HIP": "#4F3A4F",\n "HLSL": "#aace60",\n "HOCON": "#9ff8ee",\n "HTML": "#e34c26",\n "HTML+ECR": "#2e1052",\n "HTML+EEX": "#6e4a7e",\n "HTML+ERB": "#701516",\n "HTML+PHP": "#4f5d95",\n "HTML+Razor": "#512be4",\n "HTTP": "#005C9C",\n "HXML": "#f68712",\n "Hack": "#878787",\n "Haml": "#ece2a9",\n "Handlebars": "#f7931e",\n "Harbour": "#0e60e3",\n "Hare": "#9d7424",\n "Haskell": "#5e5086",\n "Haxe": "#df7900",\n "HiveQL": "#dce200",\n "HolyC": "#ffefaf",\n "Hosts File": "#308888",\n "Hurl": "#FF0288",\n "Hy": "#7790B2",\n "IDL": "#a3522f",\n "IGOR Pro": "#0000cc",\n "IL Assembly": "#512BD4",\n "INI": "#d1dbe0",\n "ISPC": "#2D68B1",\n "Idris": "#b30000",\n "Ignore List": "#000000",\n "ImageJ Macro": "#99AAFF",\n "Imba": "#16cec6",\n "Inno Setup": "#264b99",\n "Io": "#a9188d",\n "Ioke": "#078193",\n "Isabelle": "#FEFE00",\n "Isabelle ROOT": "#FEFE00",\n "J": "#9EEDFF",\n "JAR Manifest": "#b07219",\n "JCL": "#d90e09",\n "JFlex": "#DBCA00",\n "JSON": "#292929",\n "JSON with Comments": "#292929",\n "JSON5": "#267CB9",\n "JSONLD": "#0c479c",\n "JSONiq": "#40d47e",\n "Jac": "#FC792D",\n "Jai": "#ab8b4b",\n "Janet": "#0886a5",\n "Jasmin": "#d03600",\n "Java": "#b07219",\n "Java Properties": "#2A6277",\n "Java Server Pages": "#2A6277",\n "Java Template Engine": "#2A6277",\n "JavaScript": "#f1e05a",\n "JavaScript+ERB": "#f1e05a",\n "Jest Snapshot": "#15c213",\n "JetBrains MPS": "#21D789",\n "Jinja": "#a52a22",\n "Jison": "#56b3cb",\n "Jison Lex": "#56b3cb",\n "Jolie": "#843179",\n "Jsonnet": "#0064bd",\n "Julia": "#a270ba",\n "Julia REPL": "#a270ba",\n "Jupyter Notebook": "#DA5B0B",\n "Just": "#384d54",\n "KCL": "#7ABABF",\n "KDL": "#ffb3b3",\n "KFramework": "#4195c5",\n "KRL": "#28430A",\n "Kaitai Struct": "#773b37",\n "KakouneScript": "#6f8042",\n "KerboScript": "#41adf0",\n "KiCad Layout": "#2f4aab",\n "KiCad Legacy Layout": "#2f4aab",\n "KiCad Schematic": "#2f4aab",\n "KoLmafia ASH": "#B9D9B9",\n "Koka": "#215166",\n "Kotlin": "#A97BFF",\n "LFE": "#4C3023",\n "LLVM": "#185619",\n "LOLCODE": "#cc9900",\n "LSL": "#3d9970",\n "LabVIEW": "#fede06",\n "Lambdapi": "#8027a3",\n "Langium": "#2c8c87",\n "Lark": "#2980B9",\n "Lasso": "#999999",\n "Latte": "#f2a542",\n "Leo": "#C4FFC2",\n "Less": "#1d365d",\n "Lex": "#DBCA00",\n "LigoLANG": "#0e74ff",\n "LilyPond": "#9ccc7c",\n "Liquid": "#67b8de",\n "Liquidsoap": "#990066",\n "Literate Agda": "#315665",\n "Literate CoffeeScript": "#244776",\n "Literate Haskell": "#5e5086",\n "LiveCode Script": "#0c5ba5",\n "LiveScript": "#499886",\n "Logtalk": "#295b9a",\n "LookML": "#652B81",\n "Lua": "#000080",\n "Luau": "#00A2FF",\n "M3U": "#179C7D",\n "MATLAB": "#e16737",\n "MAXScript": "#00a6a6",\n "MDX": "#fcb32c",\n "MLIR": "#5EC8DB",\n "MQL4": "#62A8D6",\n "MQL5": "#4A76B8",\n "MTML": "#b7e1f4",\n "Macaulay2": "#d8ffff",\n "Makefile": "#427819",\n "Mako": "#7e858d",\n "Markdown": "#083fa1",\n "Marko": "#42bff2",\n "Mask": "#f97732",\n "Mathematical Programming System": "#0530ad",\n "Max": "#c4a79c",\n "MeTTa": "#6a5acd",\n "Mercury": "#ff2b2b",\n "Mermaid": "#ff3670",\n "Meson": "#007800",\n "Metal": "#8f14e9",\n "MiniYAML": "#ff1111",\n "MiniZinc": "#06a9e6",\n "Mint": "#02b046",\n "Mirah": "#c7a938",\n "Modelica": "#de1d31",\n "Modula-2": "#10253f",\n "Modula-3": "#223388",\n "Mojo": "#ff4c1f",\n "Monkey C": "#8D6747",\n "MoonBit": "#b92381",\n "MoonScript": "#ff4585",\n "Motoko": "#fbb03b",\n "Motorola 68K Assembly": "#005daa",\n "Move": "#4a137a",\n "Mustache": "#724b3b",\n "NCL": "#28431f",\n "NMODL": "#00356B",\n "NPM Config": "#cb3837",\n "NWScript": "#111522",\n "Nasal": "#1d2c4e",\n "Nearley": "#990000",\n "Nemerle": "#3d3c6e",\n "NetLinx": "#0aa0ff",\n "NetLinx+ERB": "#747faa",\n "NetLogo": "#ff6375",\n "NewLisp": "#87AED7",\n "Nextflow": "#3ac486",\n "Nginx": "#009639",\n "Nickel": "#E0C3FC",\n "Nim": "#ffc200",\n "Nit": "#009917",\n "Nix": "#7e7eff",\n "Noir": "#2f1f49",\n "Nu": "#c9df40",\n "NumPy": "#9C8AF9",\n "Nunjucks": "#3d8137",\n "Nushell": "#4E9906",\n "OASv2-json": "#85ea2d",\n "OASv2-yaml": "#85ea2d",\n "OASv3-json": "#85ea2d",\n "OASv3-yaml": "#85ea2d",\n "OCaml": "#ef7a08",\n "OMNeT++ MSG": "#a0e0a0",\n "OMNeT++ NED": "#08607c",\n "ObjectScript": "#424893",\n "Objective-C": "#438eff",\n "Objective-C++": "#6866fb",\n "Objective-J": "#ff0c5a",\n "Odin": "#60AFFE",\n "Omgrofl": "#cabbff",\n "Opal": "#f7ede0",\n "Open Policy Agent": "#7d9199",\n "OpenAPI Specification v2": "#85ea2d",\n "OpenAPI Specification v3": "#85ea2d",\n "OpenCL": "#ed2e2d",\n "OpenEdge ABL": "#5ce600",\n "OpenQASM": "#AA70FF",\n "OpenSCAD": "#e5cd45",\n "Option List": "#476732",\n "Org": "#77aa99",\n "OverpassQL": "#cce2aa",\n "Oxygene": "#cdd0e3",\n "Oz": "#fab738",\n "P4": "#7055b5",\n "PDDL": "#0d00ff",\n "PEG.js": "#234d6b",\n "PHP": "#4F5D95",\n "PLSQL": "#dad8d8",\n "PLpgSQL": "#336790",\n "POV-Ray SDL": "#6bac65",\n "Pact": "#F7A8B8",\n "Pan": "#cc0000",\n "Papyrus": "#6600cc",\n "Parrot": "#f3ca0a",\n "Pascal": "#E3F171",\n "Pawn": "#dbb284",\n "Pep8": "#C76F5B",\n "Perl": "#0298c3",\n "PicoLisp": "#6067af",\n "PigLatin": "#fcd7de",\n "Pike": "#005390",\n "Pip Requirements": "#FFD343",\n "Pkl": "#6b9543",\n "PlantUML": "#fbbd16",\n "PogoScript": "#d80074",\n "Polar": "#ae81ff",\n "Portugol": "#f8bd00",\n "PostCSS": "#dc3a0c",\n "PostScript": "#da291c",\n "PowerBuilder": "#8f0f8d",\n "PowerShell": "#012456",\n "Praat": "#c8506d",\n "Prisma": "#0c344b",\n "Processing": "#0096D8",\n "Procfile": "#3B2F63",\n "Prolog": "#74283c",\n "Promela": "#de0000",\n "Propeller Spin": "#7fa2a7",\n "Pug": "#a86454",\n "Puppet": "#302B6D",\n "PureBasic": "#5a6986",\n "PureScript": "#1D222D",\n "Pyret": "#ee1e10",\n "Python": "#3572A5",\n "Python console": "#3572A5",\n "Python traceback": "#3572A5",\n "Q#": "#fed659",\n "QML": "#44a51c",\n "Qt Script": "#00b841",\n "Quake": "#882233",\n "QuakeC": "#975777",\n "QuickBASIC": "#008080",\n "Quint": "#9d6ce5",\n "R": "#198CE7",\n "RAML": "#77d9fb",\n "RAScript": "#2C97FA",\n "RBS": "#701516",\n "RDoc": "#701516",\n "REXX": "#d90e09",\n "RMarkdown": "#198ce7",\n "RON": "#a62c00",\n "ROS Interface": "#22314e",\n "RPGLE": "#2BDE21",\n "RUNOFF": "#665a4e",\n "Racket": "#3c5caa",\n "Ragel": "#9d5200",\n "Raku": "#0000fb",\n "Rascal": "#fffaa0",\n "ReScript": "#ed5051",\n "Reason": "#ff5847",\n "ReasonLIGO": "#ff5847",\n "Rebol": "#358a5b",\n "Record Jar": "#0673ba",\n "Red": "#f50000",\n "Regular Expression": "#009a00",\n "Ren\'Py": "#ff7f7f",\n "Rez": "#FFDAB3",\n "Ring": "#2D54CB",\n "Riot": "#A71E49",\n "RobotFramework": "#00c0b5",\n "Roc": "#7c38f5",\n "Rocq Prover": "#d0b68c",\n "Roff": "#ecdebe",\n "Roff Manpage": "#ecdebe",\n "Rouge": "#cc0088",\n "RouterOS Script": "#DE3941",\n "Ruby": "#701516",\n "Rust": "#dea584",\n "SAS": "#B34936",\n "SCSS": "#c6538c",\n "SPARQL": "#0C4597",\n "SQF": "#3F3F3F",\n "SQL": "#e38c00",\n "SQLPL": "#e38c00",\n "SRecode Template": "#348a34",\n "STL": "#373b5e",\n "SVG": "#ff9900",\n "Sail": "#259dd5",\n "SaltStack": "#646464",\n "Sass": "#a53b70",\n "Scala": "#c22d40",\n "Scaml": "#bd181a",\n "Scenic": "#fdc700",\n "Scheme": "#1e4aec",\n "Scilab": "#ca0f21",\n "Self": "#0579aa",\n "ShaderLab": "#222c37",\n "Shell": "#89e051",\n "ShellCheck Config": "#cecfcb",\n "Shen": "#120F14",\n "Simple File Verification": "#C9BFED",\n "Singularity": "#64E6AD",\n "Slang": "#1fbec9",\n "Slash": "#007eff",\n "Slice": "#003fa2",\n "Slim": "#2b2b2b",\n "Slint": "#2379F4",\n "SmPL": "#c94949",\n "Smalltalk": "#596706",\n "Smarty": "#f0c040",\n "Smithy": "#c44536",\n "Snakemake": "#419179",\n "Solidity": "#AA6746",\n "SourcePawn": "#f69e1d",\n "SpiceDB Schema": "#a5318a",\n "Squirrel": "#800000",\n "Stan": "#b2011d",\n "Standard ML": "#dc566d",\n "Starlark": "#76d275",\n "Stata": "#1a5f91",\n "StringTemplate": "#3fb34f",\n "Stylus": "#ff6347",\n "SubRip Text": "#9e0101",\n "SugarSS": "#2fcc9f",\n "SuperCollider": "#46390b",\n "SurrealQL": "#ff00a0",\n "Survex data": "#ffcc99",\n "Svelte": "#ff3e00",\n "Sway": "#00F58C",\n "Sweave": "#198ce7",\n "Swift": "#F05138",\n "SystemVerilog": "#DAE1C2",\n "TI Program": "#A0AA87",\n "TL-Verilog": "#C40023",\n "TLA": "#4b0079",\n "TMDL": "#f0c913",\n "TOML": "#9c4221",\n "TSQL": "#e38c00",\n "TSV": "#237346",\n "TSX": "#3178c6",\n "TXL": "#0178b8",\n "Tact": "#48b5ff",\n "Talon": "#333333",\n "Tcl": "#e4cc98",\n "TeX": "#3D6117",\n "Teal": "#00B1BC",\n "Terra": "#00004c",\n "Terraform Template": "#7b42bb",\n "TextGrid": "#c8506d",\n "TextMate Properties": "#df66e4",\n "Textile": "#ffe7ac",\n "Thrift": "#D12127",\n "Toit": "#c2c9fb",\n "Tools": "#a371f7",\n "Tor Config": "#59316b",\n "Tree-sitter Query": "#8ea64c",\n "Turing": "#cf142b",\n "Twig": "#c1d026",\n "TypeScript": "#3178c6",\n "TypeSpec": "#4A3665",\n "Typst": "#239dad",\n "Unified Parallel C": "#4e3617",\n "Unity3D Asset": "#222c37",\n "Uno": "#9933cc",\n "UnrealScript": "#a54c4d",\n "Untyped Plutus Core": "#36adbd",\n "UrWeb": "#ccccee",\n "V": "#4f87c4",\n "VBA": "#867db1",\n "VBScript": "#15dcdc",\n "VCL": "#148AA8",\n "VHDL": "#adb2cb",\n "Vala": "#a56de2",\n "Valve Data Format": "#f26025",\n "Velocity Template Language": "#507cff",\n "Vento": "#ff0080",\n "Verilog": "#b2b7f8",\n "Vim Help File": "#199f4b",\n "Vim Script": "#199f4b",\n "Vim Snippet": "#199f4b",\n "Visual Basic .NET": "#945db7",\n "Visual Basic 6.0": "#2c6353",\n "Volt": "#1F1F1F",\n "Vue": "#41b883",\n "Vyper": "#9F4CF2",\n "WDL": "#42f1f4",\n "WGSL": "#1a5e9a",\n "Web Ontology Language": "#5b70bd",\n "WebAssembly": "#04133b",\n "WebAssembly Interface Type": "#6250e7",\n "Whiley": "#d5c397",\n "Wikitext": "#fc5757",\n "Windows Registry Entries": "#52d5ff",\n "Witcher Script": "#ff0000",\n "Wolfram Language": "#dd1100",\n "Wollok": "#a23738",\n "World of Warcraft Addon Data": "#f7e43f",\n "Wren": "#383838",\n "X10": "#4B6BEF",\n "XC": "#99DA07",\n "XML": "#0060ac",\n "XML Property List": "#0060ac",\n "XQuery": "#5232e7",\n "XSLT": "#EB8CEB",\n "Xmake": "#22a079",\n "Xojo": "#81bd41",\n "Xonsh": "#285EEF",\n "Xtend": "#24255d",\n "YAML": "#cb171e",\n "YARA": "#220000",\n "YASnippet": "#32AB90",\n "Yacc": "#4B6C4B",\n "Yul": "#794932",\n "ZAP": "#0d665e",\n "ZIL": "#dc75e5",\n "ZenScript": "#00BCD1",\n "Zephir": "#118f9e",\n "Zig": "#ec915c",\n "Zimpl": "#d67711",\n "Zmodel": "#ff7100",\n "crontab": "#ead7ac",\n "eC": "#913960",\n "fish": "#4aae47",\n "hoon": "#00b171",\n "iCalendar": "#ec564c",\n "jq": "#c7254e",\n "kvlang": "#1da6e0",\n "mIRC Script": "#3d57c3",\n "mcfunction": "#E22837",\n "mdsvex": "#5f9ea0",\n "mupad": "#244963",\n "nanorc": "#2d004d",\n "nesC": "#94B0C7",\n "ooc": "#b0b77e",\n "q": "#0040cd",\n "reStructuredText": "#141414",\n "sed": "#64b970",\n "templ": "#66D0DD",\n "vCard": "#ee2647",\n "wisp": "#7582D1",\n "xBase": "#403a40"\n },\n "ext": {\n "1": "Roff",\n "1in": "Roff",\n "1m": "Roff",\n "1x": "Roff",\n "2": "Roff",\n "2da": "2-Dimensional Array",\n "3": "Roff",\n "3in": "Roff",\n "3m": "Roff",\n "3p": "Roff",\n "3pm": "Roff",\n "3qt": "Roff",\n "3x": "Roff",\n "4": "Roff",\n "4dform": "JSON",\n "4dm": "4D",\n "4dproject": "JSON",\n "4gl": "Genero 4gl",\n "4th": "Forth",\n "5": "Roff",\n "6": "Roff",\n "6pl": "Raku",\n "6pm": "Raku",\n "7": "Roff",\n "8": "Roff",\n "8xp": "TI Program",\n "8xp.txt": "TI Program",\n "9": "Roff",\n "_coffee": "CoffeeScript",\n "_js": "JavaScript",\n "_ls": "LiveScript",\n "a51": "Assembly",\n "abap": "ABAP",\n "action": "ROS Interface",\n "ada": "Ada",\n "adb": "Ada",\n "adml": "XML",\n "admx": "XML",\n "ado": "Stata",\n "adoc": "AsciiDoc",\n "adp": "Tcl",\n "ads": "Ada",\n "afm": "Adobe Font Metrics",\n "agc": "Assembly",\n "agda": "Agda",\n "ahk": "AutoHotkey",\n "ahkl": "AutoHotkey",\n "aidl": "AIDL",\n "aj": "AspectJ",\n "ak": "Aiken",\n "al": "AL",\n "alg": "ALGOL",\n "als": "Alloy",\n "ampl": "AMPL",\n "angelscript": "AngelScript",\n "anim": "Unity3D Asset",\n "ant": "XML",\n "antlers.html": "Antlers",\n "antlers.php": "Antlers",\n "antlers.xml": "Antlers",\n "apacheconf": "ApacheConf",\n "apex": "Apex",\n "apib": "API Blueprint",\n "apl": "APL",\n "app": "Erlang",\n "app.src": "Erlang",\n "applescript": "AppleScript",\n "arc": "Arc",\n "arr": "Pyret",\n "as": "ActionScript",\n "asax": "ASP.NET",\n "asc": "AGS Script",\n "asciidoc": "AsciiDoc",\n "ascx": "ASP.NET",\n "asd": "Common Lisp",\n "asddls": "ABAP CDS",\n "ash": "KoLmafia ASH",\n "ashx": "ASP.NET",\n "asm": "Assembly",\n "asmx": "ASP.NET",\n "asp": "Classic ASP",\n "aspx": "ASP.NET",\n "asset": "Unity3D Asset",\n "astro": "Astro",\n "asy": "Asymptote",\n "au3": "AutoIt",\n "aug": "Augeas",\n "auk": "Awk",\n "aux": "TeX",\n "avdl": "Avro IDL",\n "avsc": "JSON",\n "aw": "PHP",\n "awk": "Awk",\n "axaml": "XML",\n "axd": "ASP.NET",\n "axi": "NetLinx",\n "axi.erb": "NetLinx+ERB",\n "axml": "XML",\n "axs": "NetLinx",\n "axs.erb": "NetLinx+ERB",\n "b": "Brainfuck",\n "bal": "Ballerina",\n "bas": "B4X",\n "bash": "Shell",\n "bat": "Batchfile",\n "bats": "Shell",\n "bb": "BitBake",\n "bbappend": "BitBake",\n "bbclass": "BitBake",\n "bbx": "TeX",\n "bdy": "PLSQL",\n "be": "Berry",\n "bf": "Beef",\n "bi": "FreeBASIC",\n "bib": "TeX",\n "bibtex": "TeX",\n "bicep": "Bicep",\n "bicepparam": "Bicep",\n "bison": "Yacc",\n "blade": "Blade",\n "blade.php": "Blade",\n "bmx": "BlitzMax",\n "bones": "JavaScript",\n "boo": "Boo",\n "boot": "Clojure",\n "bpl": "Boogie",\n "bqn": "BQN",\n "brd": "KiCad Legacy Layout",\n "brs": "Brightscript",\n "bru": "Bru",\n "bs": "Bluespec",\n "bsl": "1C Enterprise",\n "bst": "BuildStream",\n "bsv": "Bluespec",\n "builder": "Ruby",\n "builds": "XML",\n "bzl": "Starlark",\n "c": "C",\n "c++": "C++",\n "c3": "C3",\n "cabal": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cairo": "Cairo",\n "cake": "C#",\n "capnp": "Cap\'n Proto",\n "carbon": "Carbon",\n "cats": "C",\n "cbx": "TeX",\n "cc": "C++",\n "ccproj": "XML",\n "ccxml": "XML",\n "cdc": "Cadence",\n "cdf": "Wolfram Language",\n "cds": "CAP CDS",\n "ceylon": "Ceylon",\n "cfc": "ColdFusion",\n "cfg": "HAProxy",\n "cfm": "ColdFusion",\n "cfml": "ColdFusion",\n "cgi": "Perl",\n "cginc": "HLSL",\n "ch": "xBase",\n "chpl": "Chapel",\n "circom": "Circom",\n "cirru": "Cirru",\n "cj": "Cangjie",\n "cjs": "JavaScript",\n "cjsx": "CoffeeScript",\n "ck": "ChucK",\n "cl": "C",\n "cl2": "Clojure",\n "clar": "Clarity",\n "click": "Click",\n "clixml": "XML",\n "clj": "Clojure",\n "cljc": "Clojure",\n "cljs": "Clojure",\n "cljs.hl": "Clojure",\n "cljscm": "Clojure",\n "cljx": "Clojure",\n "clp": "CLIPS",\n "cls": "Apex",\n "clue": "Clue",\n "clw": "Clarion",\n "cmake": "CMake",\n "cmake.in": "CMake",\n "cmd": "Batchfile",\n "cmp": "Gerber Image",\n "cnc": "G-code",\n "cnf": "INI",\n "cocci": "SmPL",\n "code-snippets": "JSON",\n "code-workspace": "JSON",\n "coffee": "CoffeeScript",\n "coffee.md": "CoffeeScript",\n "command": "Shell",\n "containerfile": "Dockerfile",\n "cook": "Cooklang",\n "coq": "Rocq Prover",\n "cp": "Component Pascal",\n "cpp": "C++",\n "cppm": "C++",\n "cproject": "XML",\n "cps": "Component Pascal",\n "cql": "CQL",\n "cr": "Crystal",\n "cs": "C#",\n "cs.pp": "C#",\n "csc": "GSC",\n "cscfg": "XML",\n "csd": "Csound Document",\n "csdef": "XML",\n "cshtml": "HTML",\n "csl": "XML",\n "cson": "CSON",\n "csproj": "XML",\n "css": "CSS",\n "csv": "CSV",\n "csx": "C#",\n "ct": "XML",\n "ctl": "Visual Basic 6.0",\n "ctp": "PHP",\n "cts": "TypeScript",\n "cu": "Cuda",\n "cue": "CUE",\n "cuh": "Cuda",\n "curry": "Curry",\n "cwl": "Common Workflow Language",\n "cxx": "C++",\n "cylc": "INI",\n "cyp": "Cypher",\n "cypher": "Cypher",\n "d": "D",\n "d2": "D2",\n "dae": "COLLADA",\n "darcspatch": "Darcs Patch",\n "dart": "Dart",\n "das": "Daslang",\n "dats": "ATS",\n "db2": "SQLPL",\n "dcl": "Clean",\n "ddl": "PLSQL",\n "decls": "BlitzBasic",\n "depproj": "XML",\n "dfm": "Pascal",\n "dfy": "Dafny",\n "dhall": "Dhall",\n "di": "D",\n "dita": "XML",\n "ditamap": "XML",\n "ditaval": "XML",\n "djs": "Dogescript",\n "dll.config": "XML",\n "dlm": "IDL",\n "dm": "DM",\n "do": "Stata",\n "dockerfile": "Dockerfile",\n "dof": "INI",\n "doh": "Stata",\n "dot": "Graphviz (DOT)",\n "dotsettings": "XML",\n "dpatch": "Darcs Patch",\n "dpr": "Pascal",\n "druby": "Mirah",\n "dsc": "DenizenScript",\n "dsp": "Faust",\n "dsr": "Visual Basic 6.0",\n "dtx": "TeX",\n "duby": "Mirah",\n "dwl": "DataWeave",\n "dyalog": "APL",\n "dyl": "Dylan",\n "dylan": "Dylan",\n "e": "E",\n "eb": "Python",\n "ebuild": "Shell",\n "ec": "eC",\n "ecl": "ECL",\n "eclass": "Shell",\n "eclxml": "ECL",\n "ecr": "HTML",\n "ect": "EJS",\n "edge": "Edge",\n "edgeql": "EdgeQL",\n "editorconfig": "INI",\n "eh": "eC",\n "ejs": "EJS",\n "ejs.t": "EJS",\n "el": "Emacs Lisp",\n "eliom": "OCaml",\n "eliomi": "OCaml",\n "elm": "Elm",\n "elv": "Elvish",\n "em": "EmberScript",\n "emacs": "Emacs Lisp",\n "emacs.desktop": "Emacs Lisp",\n "emberscript": "EmberScript",\n "env": "Dotenv",\n "epj": "JavaScript",\n "eps": "PostScript",\n "epsi": "PostScript",\n "eq": "EQ",\n "erb": "HTML",\n "erb.deface": "HTML",\n "erl": "Erlang",\n "es": "Erlang",\n "es6": "JavaScript",\n "escript": "Erlang",\n "esdl": "EdgeQL",\n "ex": "Elixir",\n "exs": "Elixir",\n "eye": "Ruby",\n "f": "Fortran",\n "f03": "Fortran",\n "f08": "Fortran",\n "f77": "Fortran",\n "f90": "Fortran",\n "f95": "Fortran",\n "factor": "Factor",\n "fan": "Fantom",\n "fancypack": "Fancy",\n "fbs": "FlatBuffers",\n "fcgi": "Lua",\n "feature": "Gherkin",\n "filters": "XML",\n "fir": "FIRRTL",\n "fish": "Shell",\n "flex": "Lex",\n "flf": "FIGlet Font",\n "flix": "Flix",\n "flux": "FLUX",\n "fnc": "PLSQL",\n "fnl": "Fennel",\n "for": "Fortran",\n "forth": "Forth",\n "fp": "GLSL",\n "fpp": "Fortran",\n "fr": "Frege",\n "frag": "GLSL",\n "frg": "GLSL",\n "frm": "VBA",\n "frt": "Forth",\n "fs": "F#",\n "fsh": "GLSL",\n "fshader": "GLSL",\n "fsi": "F#",\n "fsproj": "XML",\n "fst": "F*",\n "fsti": "F*",\n "fsx": "F#",\n "fth": "Forth",\n "ftl": "Fluent",\n "ftlh": "FreeMarker",\n "fun": "Standard ML",\n "fut": "Futhark",\n "fx": "FLUX",\n "fxh": "HLSL",\n "fxml": "XML",\n "fy": "Fancy",\n "g": "G-code",\n "g4": "ANTLR",\n "gaml": "GAML",\n "gap": "GAP",\n "gawk": "Awk",\n "gbl": "Gerber Image",\n "gbo": "Gerber Image",\n "gbp": "Gerber Image",\n "gbr": "Gerber Image",\n "gbs": "Gerber Image",\n "gco": "G-code",\n "gcode": "G-code",\n "gd": "GDScript",\n "gdnlib": "Godot Resource",\n "gdns": "Godot Resource",\n "gdshader": "GDShader",\n "gdshaderinc": "GDShader",\n "ged": "GEDCOM",\n "gemspec": "Ruby",\n "geo": "GLSL",\n "geojson": "JSON",\n "geom": "GLSL",\n "gf": "Grammatical Framework",\n "gi": "GAP",\n "gitconfig": "INI",\n "gitignore": "Ignore List",\n "gjs": "JavaScript",\n "gko": "Gerber Image",\n "glade": "XML",\n "gleam": "Gleam",\n "glf": "Glyph",\n "glsl": "GLSL",\n "glslf": "GLSL",\n "glslv": "GLSL",\n "gltf": "JSON",\n "gmi": "Gemini",\n "gml": "Game Maker Language",\n "gms": "GAMS",\n "gmx": "XML",\n "gnu": "Gnuplot",\n "gnuplot": "Gnuplot",\n "go": "Go",\n "god": "Ruby",\n "gohtml": "Go Template",\n "golo": "Golo",\n "gotmpl": "Go Template",\n "gp": "Gnuplot",\n "gpb": "Gerber Image",\n "gpt": "Gerber Image",\n "gpx": "XML",\n "gql": "GraphQL",\n "grace": "Grace",\n "gradle": "Gradle",\n "gradle.kts": "Gradle",\n "graphql": "GraphQL",\n "graphqls": "GraphQL",\n "groovy": "Groovy",\n "grt": "Groovy",\n "grxml": "XML",\n "gs": "Genie",\n "gsc": "GSC",\n "gsh": "GSC",\n "gshader": "GLSL",\n "gsp": "Groovy",\n "gst": "Gosu",\n "gsx": "Gosu",\n "gtl": "Gerber Image",\n "gto": "Gerber Image",\n "gtp": "Gerber Image",\n "gtpl": "Groovy",\n "gts": "TypeScript",\n "gv": "Graphviz (DOT)",\n "gvy": "Groovy",\n "gyp": "Python",\n "gypi": "Python",\n "h": "C",\n "h++": "C++",\n "h.in": "C",\n "ha": "Hare",\n "hack": "Hack",\n "haml": "Haml",\n "haml.deface": "Haml",\n "handlebars": "Handlebars",\n "har": "JSON",\n "hats": "ATS",\n "hb": "Harbour",\n "hbs": "Handlebars",\n "hc": "HolyC",\n "hcl": "HCL",\n "heex": "HTML",\n "hh": "C++",\n "hhi": "Hack",\n "hic": "Clojure",\n "hip": "HIP",\n "hlsl": "HLSL",\n "hlsli": "HLSL",\n "hocon": "HOCON",\n "hoon": "hoon",\n "hpp": "C++",\n "hqf": "SQF",\n "hql": "HiveQL",\n "hrl": "Erlang",\n "hs": "Haskell",\n "hs-boot": "Haskell",\n "hsc": "Haskell",\n "hta": "HTML",\n "htm": "HTML",\n "html": "HTML",\n "html.eex": "HTML",\n "html.hl": "HTML",\n "html.tmpl": "Go Template",\n "http": "HTTP",\n "hurl": "Hurl",\n "hx": "Haxe",\n "hxml": "HXML",\n "hxsl": "Haxe",\n "hxx": "C++",\n "hy": "Hy",\n "hzp": "XML",\n "i": "Assembly",\n "i3": "Modula-3",\n "ical": "iCalendar",\n "ice": "Slice",\n "iced": "CoffeeScript",\n "icl": "Clean",\n "icls": "XML",\n "ics": "iCalendar",\n "idc": "C",\n "idr": "Idris",\n "ig": "Modula-3",\n "ihlp": "Stata",\n "ijm": "ImageJ Macro",\n "ijs": "J",\n "ik": "Ioke",\n "il": "IL Assembly",\n "ily": "LilyPond",\n "imba": "Imba",\n "iml": "XML",\n "inc": "Assembly",\n "ini": "INI",\n "inl": "C++",\n "ino": "C++",\n "ins": "TeX",\n "intr": "Dylan",\n "io": "Io",\n "iol": "Jolie",\n "ipf": "IGOR Pro",\n "ipp": "C++",\n "ipynb": "Jupyter Notebook",\n "isl": "Inno Setup",\n "ispc": "ISPC",\n "iss": "Inno Setup",\n "iuml": "PlantUML",\n "ivy": "XML",\n "ixx": "C++",\n "j": "Jasmin",\n "j2": "Jinja",\n "jac": "Jac",\n "jade": "Pug",\n "jai": "Jai",\n "jake": "JavaScript",\n "janet": "Janet",\n "jav": "Java",\n "java": "Java",\n "javascript": "JavaScript",\n "jbuilder": "Ruby",\n "jcl": "JCL",\n "jelly": "XML",\n "jflex": "Lex",\n "jinja": "Jinja",\n "jinja2": "Jinja",\n "jison": "Yacc",\n "jisonlex": "Lex",\n "jl": "Julia",\n "jq": "JSONiq",\n "js": "JavaScript",\n "js.erb": "JavaScript",\n "jsb": "JavaScript",\n "jscad": "JavaScript",\n "jsfl": "JavaScript",\n "jsh": "Java",\n "jslib": "JavaScript",\n "jsm": "JavaScript",\n "json": "JSON",\n "json-tmlanguage": "JSON",\n "json.example": "JSON",\n "json5": "JSON5",\n "jsonc": "JSON",\n "jsonl": "JSON",\n "jsonld": "JSONLD",\n "jsonnet": "Jsonnet",\n "jsp": "Java",\n "jspre": "JavaScript",\n "jsproj": "XML",\n "jss": "JavaScript",\n "jst": "EJS",\n "jsx": "JavaScript",\n "jte": "Java",\n "just": "Just",\n "k": "KCL",\n "kak": "KakouneScript",\n "kdl": "KDL",\n "kicad_mod": "KiCad Layout",\n "kicad_pcb": "KiCad Layout",\n "kicad_sch": "KiCad Schematic",\n "kicad_sym": "KiCad Schematic",\n "kicad_wks": "KiCad Layout",\n "kid": "Genshi",\n "kk": "Koka",\n "kml": "XML",\n "kojo": "Scala",\n "krl": "KRL",\n "ks": "KerboScript",\n "ksh": "Shell",\n "ksy": "Kaitai Struct",\n "kt": "Kotlin",\n "ktm": "Kotlin",\n "kts": "Kotlin",\n "kv": "kvlang",\n "l": "Common Lisp",\n "lagda": "Agda",\n "langium": "Langium",\n "lark": "Lark",\n "las": "Lasso",\n "lasso": "Lasso",\n "lasso8": "Lasso",\n "lasso9": "Lasso",\n "latte": "Latte",\n "launch": "XML",\n "lbx": "TeX",\n "leex": "HTML",\n "lektorproject": "INI",\n "leo": "Leo",\n "less": "Less",\n "lex": "Lex",\n "lfe": "LFE",\n "lgt": "Logtalk",\n "lhs": "Haskell",\n "libsonnet": "Jsonnet",\n "lid": "Dylan",\n "lidr": "Idris",\n "ligo": "LigoLANG",\n "linq": "C#",\n "liq": "Liquidsoap",\n "liquid": "Liquid",\n "lisp": "Common Lisp",\n "litcoffee": "CoffeeScript",\n "livecodescript": "LiveCode Script",\n "livemd": "Markdown",\n "lkml": "LookML",\n "ll": "LLVM",\n "lmi": "Python",\n "logtalk": "Logtalk",\n "lol": "LOLCODE",\n "lookml": "LookML",\n "lp": "Answer Set Programming",\n "lpr": "Pascal",\n "ls": "LiveScript",\n "lsl": "LSL",\n "lslp": "LSL",\n "lsp": "Common Lisp",\n "ltx": "TeX",\n "lua": "Lua",\n "luau": "Luau",\n "lvclass": "LabVIEW",\n "lvlib": "LabVIEW",\n "lvproj": "LabVIEW",\n "ly": "LilyPond",\n "m": "Objective-C",\n "m2": "Macaulay2",\n "m3": "Modula-3",\n "m3u": "M3U",\n "m3u8": "M3U",\n "ma": "Wolfram Language",\n "mak": "Makefile",\n "make": "Makefile",\n "makefile": "Makefile",\n "mako": "Mako",\n "man": "Roff",\n "mao": "Mako",\n "markdown": "Markdown",\n "marko": "Marko",\n "mask": "Mask",\n "mat": "Unity3D Asset",\n "mata": "Stata",\n "matah": "Stata",\n "mathematica": "Wolfram Language",\n "matlab": "MATLAB",\n "mawk": "Awk",\n "maxhelp": "Max",\n "maxpat": "Max",\n "maxproj": "Max",\n "mbt": "MoonBit",\n "mc": "Monkey C",\n "mcfunction": "mcfunction",\n "mch": "B (Formal Method)",\n "mcmeta": "JSON",\n "mcr": "MAXScript",\n "md": "Markdown",\n "mdoc": "Roff",\n "mdown": "Markdown",\n "mdpolicy": "XML",\n "mdwn": "Markdown",\n "mdx": "MDX",\n "me": "Roff",\n "mediawiki": "Wikitext",\n "mermaid": "Mermaid",\n "meta": "Unity3D Asset",\n "metal": "Metal",\n "metta": "MeTTa",\n "mg": "Modula-3",\n "mint": "Mint",\n "mir": "YAML",\n "mirah": "Mirah",\n "mjml": "XML",\n "mjs": "JavaScript",\n "mk": "Makefile",\n "mkd": "Markdown",\n "mkdn": "Markdown",\n "mkdown": "Markdown",\n "mkfile": "Makefile",\n "mkii": "TeX",\n "mkiv": "TeX",\n "mkvi": "TeX",\n "ml": "OCaml",\n "ml4": "OCaml",\n "mli": "OCaml",\n "mligo": "LigoLANG",\n "mlir": "MLIR",\n "mll": "OCaml",\n "mly": "OCaml",\n "mm": "Objective-C++",\n "mmd": "Mermaid",\n "mo": "Modelica",\n "mod": "Modula-2",\n "mojo": "Mojo",\n "moo": "Mercury",\n "moon": "MoonScript",\n "move": "Move",\n "mpl": "JetBrains MPS",\n "mps": "JetBrains MPS",\n "mq4": "MQL4",\n "mq5": "MQL5",\n "mqh": "MQL4",\n "mrc": "mIRC Script",\n "ms": "MAXScript",\n "msd": "JetBrains MPS",\n "msg": "OMNeT++ MSG",\n "mspec": "Ruby",\n "mt": "Wolfram Language",\n "mtml": "MTML",\n "mts": "TypeScript",\n "mu": "mupad",\n "mud": "ZIL",\n "mustache": "Mustache",\n "mxml": "XML",\n "mxt": "Max",\n "mysql": "SQL",\n "mzn": "MiniZinc",\n "n": "Nemerle",\n "nanorc": "INI",\n "nas": "Nasal",\n "nasm": "Assembly",\n "natvis": "XML",\n "nawk": "Awk",\n "nb": "Wolfram Language",\n "nbp": "Wolfram Language",\n "nc": "nesC",\n "ncl": "NCL",\n "ndproj": "XML",\n "ne": "Nearley",\n "nearley": "Nearley",\n "ned": "OMNeT++ NED",\n "nf": "Nextflow",\n "nginx": "Nginx",\n "nginxconf": "Nginx",\n "nim": "Nim",\n "nim.cfg": "Nim",\n "nimble": "Nim",\n "nimrod": "Nim",\n "nims": "Nim",\n "nit": "Nit",\n "nix": "Nix",\n "njk": "Nunjucks",\n "njs": "JavaScript",\n "nl": "NewLisp",\n "nlogo": "NetLogo",\n "nomad": "HCL",\n "nproj": "XML",\n "nqp": "Raku",\n "nr": "Noir",\n "nse": "Lua",\n "nss": "NWScript",\n "nu": "Nu",\n "numpy": "Python",\n "numpyw": "Python",\n "numsc": "Python",\n "nuspec": "XML",\n "nut": "Squirrel",\n "ny": "Common Lisp",\n "odd": "XML",\n "odin": "Odin",\n "ol": "Jolie",\n "omgrofl": "Omgrofl",\n "ooc": "ooc",\n "opal": "Opal",\n "opencl": "C",\n "orc": "Csound",\n "org": "Org",\n "os": "1C Enterprise",\n "osm": "XML",\n "outjob": "Altium Designer",\n "overpassql": "OverpassQL",\n "owl": "Web Ontology Language",\n "oxygene": "Oxygene",\n "oz": "Oz",\n "p": "OpenEdge ABL",\n "p4": "P4",\n "p6": "Raku",\n "p6l": "Raku",\n "p6m": "Raku",\n "p8": "Lua",\n "pac": "JavaScript",\n "pact": "Pact",\n "pan": "Pan",\n "parrot": "Parrot",\n "pas": "Pascal",\n "pascal": "Pascal",\n "pat": "Max",\n "pb": "PureBasic",\n "pbi": "PureBasic",\n "pbt": "PowerBuilder",\n "pcbdoc": "Altium Designer",\n "pck": "PLSQL",\n "pcss": "CSS",\n "pd_lua": "Lua",\n "pddl": "PDDL",\n "pde": "Processing",\n "peggy": "PEG.js",\n "pegjs": "PEG.js",\n "pep": "Pep8",\n "per": "Genero per",\n "perl": "Perl",\n "pfa": "PostScript",\n "pgsql": "PLpgSQL",\n "ph": "Perl",\n "php": "PHP",\n "php3": "PHP",\n "php4": "PHP",\n "php5": "PHP",\n "phps": "PHP",\n "phpt": "PHP",\n "phtml": "HTML",\n "pig": "PigLatin",\n "pike": "Pike",\n "pkb": "PLSQL",\n "pkgproj": "XML",\n "pkl": "Pkl",\n "pks": "PLSQL",\n "pl": "Perl",\n "pl6": "Raku",\n "plantuml": "PlantUML",\n "plb": "PLSQL",\n "plist": "XML",\n "plot": "Gnuplot",\n "pls": "PLSQL",\n "plsql": "PLSQL",\n "plt": "Gnuplot",\n "pluginspec": "Ruby",\n "plx": "Perl",\n "pm": "Perl",\n "pm6": "Raku",\n "pml": "Promela",\n "pmod": "Pike",\n "podsl": "Common Lisp",\n "podspec": "Ruby",\n "pogo": "PogoScript",\n "polar": "Polar",\n "por": "Portugol",\n "postcss": "CSS",\n "pov": "POV-Ray SDL",\n "pp": "Puppet",\n "pprx": "REXX",\n "praat": "Praat",\n "prawn": "Ruby",\n "prc": "PLSQL",\n "prefab": "Unity3D Asset",\n "prefs": "INI",\n "prg": "xBase",\n "prisma": "Prisma",\n "prjpcb": "Altium Designer",\n "pro": "Prolog",\n "proj": "XML",\n "prolog": "Prolog",\n "properties": "Java Properties",\n "props": "XML",\n "prw": "xBase",\n "ps": "PostScript",\n "ps1": "PowerShell",\n "ps1xml": "XML",\n "psc": "Papyrus",\n "psc1": "XML",\n "psd1": "PowerShell",\n "psgi": "Perl",\n "psm1": "PowerShell",\n "pt": "XML",\n "pubxml": "XML",\n "pug": "Pug",\n "puml": "PlantUML",\n "purs": "PureScript",\n "pwn": "Pawn",\n "pxd": "Cython",\n "pxi": "Cython",\n "py": "Python",\n "py3": "Python",\n "pyde": "Python",\n "pyi": "Python",\n "pyp": "Python",\n "pyt": "Python",\n "pytb": "Python",\n "pyw": "Python",\n "pyx": "Cython",\n "q": "HiveQL",\n "qasm": "OpenQASM",\n "qbs": "QML",\n "qc": "QuakeC",\n "qhelp": "XML",\n "ql": "CodeQL",\n "qll": "CodeQL",\n "qmd": "RMarkdown",\n "qml": "QML",\n "qnt": "Quint",\n "qs": "Q#",\n "r": "R",\n "r2": "Rebol",\n "r3": "Rebol",\n "rabl": "Ruby",\n "rake": "Ruby",\n "raku": "Raku",\n "rakumod": "Raku",\n "raml": "RAML",\n "rascript": "RAScript",\n "razor": "HTML",\n "rb": "Ruby",\n "rbi": "Ruby",\n "rbs": "Ruby",\n "rbuild": "Ruby",\n "rbw": "Ruby",\n "rbx": "Ruby",\n "rbxs": "Lua",\n "rchit": "GLSL",\n "rd": "R",\n "rdf": "XML",\n "rdoc": "RDoc",\n "re": "Reason",\n "reb": "Rebol",\n "rebol": "Rebol",\n "red": "Red",\n "reds": "Red",\n "reek": "YAML",\n "reg": "Windows Registry Entries",\n "regex": "Regular Expression",\n "regexp": "Regular Expression",\n "rego": "Open Policy Agent",\n "rei": "Reason",\n "religo": "LigoLANG",\n "res": "ReScript",\n "resi": "ReScript",\n "resource": "RobotFramework",\n "rest": "reStructuredText",\n "rest.txt": "reStructuredText",\n "resx": "XML",\n "rex": "REXX",\n "rexx": "REXX",\n "rg": "Rouge",\n "rhtml": "HTML",\n "ring": "Ring",\n "riot": "Riot",\n "rkt": "Racket",\n "rktd": "Racket",\n "rktl": "Racket",\n "rl": "Ragel",\n "rmd": "RMarkdown",\n "rmiss": "GLSL",\n "rnh": "RUNOFF",\n "rno": "RUNOFF",\n "rnw": "Sweave",\n "robot": "RobotFramework",\n "roc": "Roc",\n "rockspec": "Lua",\n "roff": "Roff",\n "ron": "RON",\n "ronn": "Markdown",\n "rpgle": "RPGLE",\n "rpy": "Ren\'Py",\n "rq": "SPARQL",\n "rs": "Rust",\n "rs.in": "Rust",\n "rsc": "Rascal",\n "rss": "XML",\n "rst": "reStructuredText",\n "rst.txt": "reStructuredText",\n "rsx": "R",\n "ru": "Ruby",\n "ruby": "Ruby",\n "rviz": "YAML",\n "s": "Assembly",\n "sail": "Sail",\n "sarif": "JSON",\n "sas": "SAS",\n "sass": "Sass",\n "sats": "ATS",\n "sbatch": "Shell",\n "sbt": "Scala",\n "sc": "SuperCollider",\n "scad": "OpenSCAD",\n "scala": "Scala",\n "scaml": "Scaml",\n "scd": "SuperCollider",\n "sce": "Scilab",\n "scenic": "Scenic",\n "sch": "Scheme",\n "schdoc": "Altium Designer",\n "sci": "Scilab",\n "scm": "Scheme",\n "sco": "Csound Score",\n "scpt": "AppleScript",\n "scrbl": "Racket",\n "scss": "SCSS",\n "scxml": "XML",\n "sdc": "Tcl",\n "sed": "sed",\n "self": "Self",\n "sexp": "Common Lisp",\n "sfproj": "XML",\n "sfv": "Checksums",\n "sh": "Shell",\n "sh.in": "Shell",\n "shader": "ShaderLab",\n "shen": "Shen",\n "shproj": "XML",\n "sig": "Standard ML",\n "sj": "Objective-J",\n "sjs": "JavaScript",\n "sl": "Slash",\n "slang": "Slang",\n "sld": "Scheme",\n "slim": "Slim",\n "slint": "Slint",\n "slnx": "XML",\n "sls": "SaltStack",\n "slurm": "Shell",\n "sma": "Pawn",\n "smithy": "Smithy",\n "smk": "Python",\n "sml": "Standard ML",\n "snakefile": "Python",\n "snap": "Jest Snapshot",\n "snip": "Vim Snippet",\n "snippet": "Vim Snippet",\n "snippets": "Vim Snippet",\n "sol": "Solidity",\n "soy": "Closure Templates",\n "sp": "SourcePawn",\n "sparql": "SPARQL",\n "spc": "PLSQL",\n "spec": "Python",\n "spin": "Propeller Spin",\n "sps": "Scheme",\n "sqf": "SQF",\n "sql": "SQL",\n "sqlrpgle": "RPGLE",\n "sra": "PowerBuilder",\n "srdf": "XML",\n "srt": "SRecode Template",\n "sru": "PowerBuilder",\n "srv": "ROS Interface",\n "srw": "PowerBuilder",\n "ss": "Scheme",\n "ssjs": "JavaScript",\n "sss": "SugarSS",\n "st": "Smalltalk",\n "stan": "Stan",\n "star": "Starlark",\n "sthlp": "Stata",\n "stl": "STL",\n "story": "Gherkin",\n "storyboard": "XML",\n "sttheme": "XML",\n "sty": "TeX",\n "styl": "Stylus",\n "sublime-build": "JSON",\n "sublime-color-scheme": "JSON",\n "sublime-commands": "JSON",\n "sublime-completions": "JSON",\n "sublime-keymap": "JSON",\n "sublime-macro": "JSON",\n "sublime-menu": "JSON",\n "sublime-mousemap": "JSON",\n "sublime-project": "JSON",\n "sublime-settings": "JSON",\n "sublime-snippet": "XML",\n "sublime-syntax": "YAML",\n "sublime-theme": "JSON",\n "sublime-workspace": "JSON",\n "sublime_metrics": "JSON",\n "sublime_session": "JSON",\n "surql": "SurrealQL",\n "sv": "SystemVerilog",\n "svelte": "Svelte",\n "svg": "SVG",\n "svh": "SystemVerilog",\n "svx": "mdsvex",\n "sw": "Sway",\n "swift": "Swift",\n "syntax": "YAML",\n "t": "Perl",\n "tab": "SQL",\n "tac": "Python",\n "tact": "Tact",\n "tag": "Java",\n "talon": "Talon",\n "targets": "XML",\n "tcc": "C++",\n "tcl": "Tcl",\n "tcl.in": "Tcl",\n "templ": "templ",\n "tesc": "GLSL",\n "tese": "GLSL",\n "tex": "TeX",\n "textgrid": "TextGrid",\n "textile": "Textile",\n "tf": "HCL",\n "tfstate": "JSON",\n "tfstate.backup": "JSON",\n "tftpl": "HCL",\n "tfvars": "HCL",\n "thor": "Ruby",\n "thrift": "Thrift",\n "thy": "Isabelle",\n "tl": "Teal",\n "tla": "TLA",\n "tlv": "TL-Verilog",\n "tm": "Tcl",\n "tmac": "Roff",\n "tmcommand": "XML",\n "tmdl": "TMDL",\n "tml": "XML",\n "tmlanguage": "XML",\n "tmpl": "Go Template",\n "tmpreferences": "XML",\n "tmsnippet": "XML",\n "tmtheme": "XML",\n "tmux": "Shell",\n "toc": "TeX",\n "tofu": "HCL",\n "toit": "Toit",\n "toml": "TOML",\n "toml.example": "TOML",\n "tool": "Shell",\n "topojson": "JSON",\n "tpb": "PLSQL",\n "tpl": "Smarty",\n "tpp": "C++",\n "tps": "PLSQL",\n "tres": "Godot Resource",\n "trg": "PLSQL",\n "trigger": "Apex",\n "ts": "TypeScript",\n "tscn": "Godot Resource",\n "tsconfig.json": "JSON",\n "tsp": "TypeSpec",\n "tst": "GAP",\n "tsv": "TSV",\n "tsx": "TypeScript",\n "tu": "Turing",\n "twig": "Twig",\n "txl": "TXL",\n "txt": "Adblock Filter List",\n "txx": "C++",\n "typ": "Typst",\n "uc": "UnrealScript",\n "udf": "SQL",\n "udo": "Csound",\n "ui": "XML",\n "unity": "Unity3D Asset",\n "uno": "Uno",\n "upc": "C",\n "uplc": "Untyped Plutus Core",\n "ur": "UrWeb",\n "urdf": "XML",\n "url": "INI",\n "urs": "UrWeb",\n "ux": "XML",\n "v": "Verilog",\n "vala": "Vala",\n "vapi": "Vala",\n "vark": "Gosu",\n "vb": "Visual Basic .NET",\n "vba": "VBA",\n "vbhtml": "Visual Basic .NET",\n "vbproj": "XML",\n "vbs": "VBScript",\n "vcf": "vCard",\n "vcl": "VCL",\n "vcxproj": "XML",\n "vdf": "Valve Data Format",\n "veo": "Verilog",\n "vert": "GLSL",\n "vh": "SystemVerilog",\n "vhd": "VHDL",\n "vhdl": "VHDL",\n "vhf": "VHDL",\n "vhi": "VHDL",\n "vho": "VHDL",\n "vhost": "ApacheConf",\n "vhs": "VHDL",\n "vht": "VHDL",\n "vhw": "VHDL",\n "vim": "Vim Script",\n "vimrc": "Vim Script",\n "viw": "SQL",\n "vmb": "Vim Script",\n "volt": "Volt",\n "vrx": "GLSL",\n "vs": "GLSL",\n "vsh": "GLSL",\n "vshader": "GLSL",\n "vsixmanifest": "XML",\n "vssettings": "XML",\n "vstemplate": "XML",\n "vtl": "Velocity Template Language",\n "vto": "Vento",\n "vue": "Vue",\n "vw": "PLSQL",\n "vxml": "XML",\n "vy": "Vyper",\n "w": "CWeb",\n "wast": "WebAssembly",\n "wat": "WebAssembly",\n "watchr": "Ruby",\n "wdl": "WDL",\n "webapp": "JSON",\n "webmanifest": "JSON",\n "wgsl": "WGSL",\n "whiley": "Whiley",\n "wiki": "Wikitext",\n "wikitext": "Wikitext",\n "wisp": "wisp",\n "wit": "WebAssembly Interface Type",\n "wixproj": "XML",\n "wl": "Wolfram Language",\n "wlk": "Wollok",\n "wls": "Wolfram Language",\n "wlt": "Wolfram Language",\n "wlua": "Lua",\n "workbook": "Markdown",\n "workflow": "HCL",\n "wren": "Wren",\n "ws": "Witcher Script",\n "wsdl": "XML",\n "wsf": "XML",\n "wsgi": "Python",\n "wxi": "XML",\n "wxl": "XML",\n "wxs": "XML",\n "x": "DirectX 3D File",\n "x10": "X10",\n "x3d": "XML",\n "x68": "Assembly",\n "xacro": "XML",\n "xaml": "XML",\n "xc": "XC",\n "xdc": "Tcl",\n "xht": "HTML",\n "xhtml": "HTML",\n "xib": "XML",\n "xlf": "XML",\n "xliff": "XML",\n "xmi": "XML",\n "xml": "XML",\n "xml.dist": "XML",\n "xmp": "XML",\n "xojo_code": "Xojo",\n "xojo_menu": "Xojo",\n "xojo_report": "Xojo",\n "xojo_script": "Xojo",\n "xojo_toolbar": "Xojo",\n "xojo_window": "Xojo",\n "xproj": "XML",\n "xpy": "Python",\n "xq": "XQuery",\n "xql": "XQuery",\n "xqm": "XQuery",\n "xquery": "XQuery",\n "xqy": "XQuery",\n "xrl": "Erlang",\n "xsd": "XML",\n "xsh": "Xonsh",\n "xsjs": "JavaScript",\n "xsjslib": "JavaScript",\n "xsl": "XSLT",\n "xslt": "XSLT",\n "xspec": "XML",\n "xtend": "Xtend",\n "xul": "XML",\n "xzap": "ZAP",\n "y": "Yacc",\n "yacc": "Yacc",\n "yaml": "MiniYAML",\n "yaml-tmlanguage": "YAML",\n "yaml.sed": "YAML",\n "yap": "Prolog",\n "yar": "YARA",\n "yara": "YARA",\n "yasnippet": "YASnippet",\n "yml": "YAML",\n "yml.mysql": "YAML",\n "yrl": "Erlang",\n "yul": "Yul",\n "yy": "Yacc",\n "yyp": "JSON",\n "zap": "ZAP",\n "zcml": "XML",\n "zed": "SpiceDB Schema",\n "zep": "Zephir",\n "zig": "Zig",\n "zig.zon": "Zig",\n "zil": "ZIL",\n "zimpl": "Zimpl",\n "zmodel": "Zmodel",\n "zmpl": "Zimpl",\n "zpl": "Zimpl",\n "zs": "ZenScript",\n "zsh": "Shell",\n "zsh-theme": "Shell"\n },\n "filename": {\n ".abbrev_defs": "Emacs Lisp",\n ".ackrc": "Option List",\n ".all-contributorsrc": "JSON",\n ".arcconfig": "JSON",\n ".atomignore": "Ignore List",\n ".auto-changelog": "JSON",\n ".babelignore": "Ignore List",\n ".babelrc": "JSON",\n ".bash_aliases": "Shell",\n ".bash_functions": "Shell",\n ".bash_history": "Shell",\n ".bash_logout": "Shell",\n ".bash_profile": "Shell",\n ".bashrc": "Shell",\n ".browserslistrc": "Browserslist",\n ".buckconfig": "INI",\n ".bzrignore": "Ignore List",\n ".c8rc": "JSON",\n ".clang-format": "YAML",\n ".clang-tidy": "YAML",\n ".clangd": "YAML",\n ".classpath": "XML",\n ".coffeelintignore": "Ignore List",\n ".coveragerc": "INI",\n ".cproject": "XML",\n ".cshrc": "Shell",\n ".cvsignore": "Ignore List",\n ".devcontainer.json": "JSON",\n ".dockerignore": "Ignore List",\n ".easignore": "Ignore List",\n ".editorconfig": "INI",\n ".eleventyignore": "Ignore List",\n ".emacs": "Emacs Lisp",\n ".emacs.desktop": "Emacs Lisp",\n ".env": "Dotenv",\n ".env.ci": "Dotenv",\n ".env.dev": "Dotenv",\n ".env.development": "Dotenv",\n ".env.development.local": "Dotenv",\n ".env.example": "Dotenv",\n ".env.local": "Dotenv",\n ".env.prod": "Dotenv",\n ".env.production": "Dotenv",\n ".env.sample": "Dotenv",\n ".env.staging": "Dotenv",\n ".env.template": "Dotenv",\n ".env.test": "Dotenv",\n ".env.testing": "Dotenv",\n ".envrc": "Shell",\n ".eslintignore": "Ignore List",\n ".eslintrc.json": "JSON",\n ".exrc": "Vim Script",\n ".factor-boot-rc": "Factor",\n ".factor-rc": "Factor",\n ".flake8": "INI",\n ".flaskenv": "Shell",\n ".gclient": "Python",\n ".gemrc": "YAML",\n ".git-blame-ignore-revs": "Git Revision List",\n ".gitattributes": "Git Attributes",\n ".gitconfig": "INI",\n ".gitignore": "Ignore List",\n ".gitmodules": "INI",\n ".gnus": "Emacs Lisp",\n ".gvimrc": "Vim Script",\n ".htaccess": "ApacheConf",\n ".htmlhintrc": "JSON",\n ".ignore": "Ignore List",\n ".imgbotconfig": "JSON",\n ".irbrc": "Ruby",\n ".jscsrc": "JSON",\n ".jshintrc": "JSON",\n ".jslintrc": "JSON",\n ".justfile": "Just",\n ".kshrc": "Shell",\n ".latexmkrc": "Perl",\n ".login": "Shell",\n ".luacheckrc": "Lua",\n ".markdownlintignore": "Ignore List",\n ".nanorc": "INI",\n ".nodemonignore": "Ignore List",\n ".npmignore": "Ignore List",\n ".npmrc": "INI",\n ".nvimrc": "Vim Script",\n ".nycrc": "JSON",\n ".oxlintrc.json": "JSON",\n ".php": "PHP",\n ".php_cs": "PHP",\n ".php_cs.dist": "PHP",\n ".prettierignore": "Ignore List",\n ".profile": "Shell",\n ".project": "XML",\n ".pryrc": "Ruby",\n ".pylintrc": "INI",\n ".rprofile": "R",\n ".rspec": "Option List",\n ".scalafix.conf": "HOCON",\n ".scalafmt.conf": "HOCON",\n ".shellcheckrc": "ShellCheck Config",\n ".simplecov": "Ruby",\n ".spacemacs": "Emacs Lisp",\n ".stylelintignore": "Ignore List",\n ".swcrc": "JSON",\n ".tern-config": "JSON",\n ".tern-project": "JSON",\n ".tm_properties": "TextMate Properties",\n ".tmux.conf": "Shell",\n ".vercelignore": "Ignore List",\n ".vimrc": "Vim Script",\n ".viper": "Emacs Lisp",\n ".vscodeignore": "Ignore List",\n ".watchmanconfig": "JSON",\n ".xinitrc": "Shell",\n ".xsession": "Shell",\n ".yardopts": "Option List",\n ".zlogin": "Shell",\n ".zlogout": "Shell",\n ".zprofile": "Shell",\n ".zshenv": "Shell",\n ".zshrc": "Shell",\n "9fs": "Shell",\n "_emacs": "Emacs Lisp",\n "_helpers.tpl": "Go Template",\n "_vimrc": "Vim Script",\n "abbrev_defs": "Emacs Lisp",\n "ack": "Perl",\n "ackrc": "Option List",\n "ant.xml": "Ant Build System",\n "apache2.conf": "ApacheConf",\n "api-extractor.json": "JSON",\n "apkbuild": "Shell",\n "app.config": "XML",\n "appraisals": "Ruby",\n "bash_aliases": "Shell",\n "bash_logout": "Shell",\n "bash_profile": "Shell",\n "bashrc": "Shell",\n "berksfile": "Ruby",\n "brewfile": "Ruby",\n "browserslist": "Browserslist",\n "bsdmakefile": "Makefile",\n "buck": "Starlark",\n "build": "Starlark",\n "build.bazel": "Starlark",\n "build.xml": "Ant Build System",\n "buildfile": "Ruby",\n "buildozer.spec": "INI",\n "bun.lock": "JSON",\n "cabal.config": "Cabal Config",\n "cabal.project": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cakefile": "CoffeeScript",\n "capfile": "Ruby",\n "cargo.lock": "TOML",\n "cargo.toml.orig": "TOML",\n "cask": "Emacs Lisp",\n "citation.cff": "YAML",\n "cmakelists.txt": "CMake",\n "commit_editmsg": "Git Commit",\n "composer.lock": "JSON",\n "containerfile": "Dockerfile",\n "contents.lr": "Markdown",\n "cpanfile": "Perl",\n "crontab": "crontab",\n "cshrc": "Shell",\n "dangerfile": "Ruby",\n "deliverfile": "Ruby",\n "deno.lock": "JSON",\n "deps": "Python",\n "dev-requirements.txt": "Pip Requirements",\n "devcontainer.json": "JSON",\n "dockerfile": "Dockerfile",\n "dune-project": "Dune",\n "earthfile": "Earthly",\n "eask": "Emacs Lisp",\n "emakefile": "Erlang",\n "eqnrc": "Roff",\n "expr-dist": "R",\n "fakefile": "Fancy",\n "fastfile": "Ruby",\n "firestore.rules": "Cloud Firestore Security Rules",\n "flake.lock": "JSON",\n "fp-lib-table": "KiCad Layout",\n "gemfile": "Ruby",\n "gemfile.lock": "Gemfile.lock",\n "gitignore-global": "Ignore List",\n "gitignore_global": "Ignore List",\n "glide.lock": "YAML",\n "gnumakefile": "Makefile",\n "go.mod": "Go Module",\n "go.sum": "Go Checksums",\n "go.work": "Go Workspace",\n "go.work.sum": "Go Checksums",\n "gopkg.lock": "TOML",\n "gradlew": "Shell",\n "gradlew.bat": "Batchfile",\n "guardfile": "Ruby",\n "gvimrc": "Vim Script",\n "haproxy.cfg": "HAProxy",\n "hosts": "Hosts File",\n "hosts.txt": "Hosts File",\n "httpd.conf": "ApacheConf",\n "installscript.qs": "Qt Script",\n "jakefile": "JavaScript",\n "jarfile": "Ruby",\n "jenkinsfile": "Groovy",\n "jsconfig.json": "JSON",\n "justfile": "Just",\n "kakrc": "KakouneScript",\n "kbuild": "Makefile",\n "kcl.mod": "KCL",\n "kcl.mod.lock": "KCL",\n "kshrc": "Shell",\n "language-configuration.json": "JSON",\n "language-subtag-registry.txt": "Record Jar",\n "latexmkrc": "Perl",\n "lexer.x": "Lex",\n "login": "Shell",\n "m3makefile": "Quake",\n "m3overrides": "Quake",\n "makefile": "Makefile",\n "makefile.am": "Makefile",\n "makefile.boot": "Makefile",\n "makefile.frag": "Makefile",\n "makefile.in": "Makefile",\n "makefile.inc": "Makefile",\n "makefile.pl": "Perl",\n "makefile.sco": "Makefile",\n "makefile.wat": "Makefile",\n "man": "Shell",\n "manifest.mf": "JAR Manifest",\n "mavenfile": "Ruby",\n "mcmod.info": "JSON",\n "meson.build": "Meson",\n "meson_options.txt": "Meson",\n "mise.local.lock": "TOML",\n "mise.lock": "TOML",\n "mix.lock": "Elixir",\n "mkfile": "Makefile",\n "mmn": "Roff",\n "mmt": "Roff",\n "mocha.opts": "Option List",\n "module.bazel": "Starlark",\n "module.bazel.lock": "JSON",\n "modulefile": "Puppet",\n "mvnw": "Shell",\n "mvnw.cmd": "Batchfile",\n "nanorc": "INI",\n "nextflow.config": "Nextflow",\n "nginx.conf": "Nginx",\n "nim.cfg": "Nim",\n "notebook": "Jupyter Notebook",\n "nuget.config": "XML",\n "nukefile": "Nu",\n "nvimrc": "Vim Script",\n "owh": "Tcl",\n "package.resolved": "JSON",\n "packages.config": "XML",\n "pdm.lock": "TOML",\n "phakefile": "PHP",\n "pipfile": "TOML",\n "pipfile.lock": "JSON",\n "pixi.lock": "YAML",\n "pkgbuild": "Shell",\n "podfile": "Ruby",\n "poetry.lock": "TOML",\n "procfile": "Procfile",\n "profile": "Shell",\n "project.ede": "Emacs Lisp",\n "project.godot": "Godot Resource",\n "puppetfile": "Ruby",\n "pylintrc": "INI",\n "rakefile": "Ruby",\n "rebar.config": "Erlang",\n "rebar.config.lock": "Erlang",\n "rebar.lock": "Erlang",\n "requirements-dev.txt": "Pip Requirements",\n "requirements.lock.txt": "Pip Requirements",\n "requirements.txt": "Pip Requirements",\n "rexfile": "Perl",\n "riemann.config": "Clojure",\n "root": "Isabelle",\n "sconscript": "Python",\n "sconstruct": "Python",\n "settings.stylecop": "XML",\n "singularity": "Singularity",\n "slakefile": "LiveScript",\n "snakefile": "Python",\n "snapfile": "Ruby",\n "starfield": "Tcl",\n "steepfile": "Ruby",\n "suite.rc": "INI",\n "thorfile": "Ruby",\n "tiltfile": "Starlark",\n "tmux.conf": "Shell",\n "toolchain_installscript.qs": "Qt Script",\n "torrc": "Tor Config",\n "troffrc": "Roff",\n "troffrc-end": "Roff",\n "tsconfig.json": "JSON",\n "tslint.json": "JSON",\n "uv.lock": "TOML",\n "vagrantfile": "Ruby",\n "vimrc": "Vim Script",\n "vlcrc": "INI",\n "web.config": "XML",\n "web.debug.config": "XML",\n "web.release.config": "XML",\n "workspace": "Starlark",\n "workspace.bazel": "Starlark",\n "workspace.bzlmod": "Starlark",\n "wscript": "Python",\n "xinitrc": "Shell",\n "xmake.lua": "Xmake",\n "xsession": "Shell",\n "yarn.lock": "YAML",\n "zlogin": "Shell",\n "zlogout": "Shell",\n "zprofile": "Shell",\n "zshenv": "Shell",\n "zshrc": "Shell"\n }\n },\n "vendor": [\n "(^|/)cache/",\n "^[Dd]ependencies/",\n "(^|/)dist/",\n "^deps/",\n "(^|/)configure$",\n "(^|/)config\\\\.guess$",\n "(^|/)config\\\\.sub$",\n "(^|/)aclocal\\\\.m4",\n "(^|/)libtool\\\\.m4",\n "(^|/)ltoptions\\\\.m4",\n "(^|/)ltsugar\\\\.m4",\n "(^|/)ltversion\\\\.m4",\n "(^|/)lt~obsolete\\\\.m4",\n "(^|/)dotnet-install\\\\.(ps1|sh)$",\n "(^|/)cpplint\\\\.py",\n "(^|/)node_modules/",\n "(^|/)\\\\.yarn/releases/",\n "(^|/)\\\\.yarn/plugins/",\n "(^|/)\\\\.yarn/sdks/",\n "(^|/)\\\\.yarn/versions/",\n "(^|/)\\\\.yarn/unplugged/",\n "(^|/)_esy$",\n "(^|/)bower_components/",\n "^rebar$",\n "(^|/)erlang\\\\.mk",\n "(^|/)Godeps/_workspace/",\n "(^|/)testdata/",\n "(^|/)\\\\.indent\\\\.pro",\n "(\\\\.|-)min\\\\.(js|css)$",\n "([^\\\\s]*)import\\\\.(css|less|scss|styl)$",\n "(^|/)bootstrap([^/.]*)(\\\\..*)?\\\\.(js|css|less|scss|styl)$",\n "(^|/)custom\\\\.bootstrap([^\\\\s]*)(js|css|less|scss|styl)$",\n "(^|/)font-?awesome\\\\.(css|less|scss|styl)$",\n "(^|/)font-?awesome/.*\\\\.(css|less|scss|styl)$",\n "(^|/)foundation\\\\.(css|less|scss|styl)$",\n "(^|/)normalize\\\\.(css|less|scss|styl)$",\n "(^|/)skeleton\\\\.(css|less|scss|styl)$",\n "(^|/)[Bb]ourbon/.*\\\\.(css|less|scss|styl)$",\n "(^|/)animate\\\\.(css|less|scss|styl)$",\n "(^|/)materialize\\\\.(css|less|scss|styl|js)$",\n "(^|/)select2/.*\\\\.(css|scss|js)$",\n "(^|/)bulma\\\\.(css|sass|scss)$",\n "(3rd|[Tt]hird)[-_]?[Pp]arty/",\n "(^|/)vendors?/",\n "(^|/)[Ee]xtern(als?)?/",\n "(^|/)[Vv]+endor/",\n "^debian/",\n "(^|/)run\\\\.n$",\n "(^|/)bootstrap-datepicker/",\n "(^|/)jquery([^.]*)\\\\.js$",\n "(^|/)jquery\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)jquery\\\\-ui(\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?)?(\\\\.\\\\w+)?\\\\.(js|css)$",\n "(^|/)jquery\\\\.(ui|effects)\\\\.([^.]*)\\\\.(js|css)$",\n "(^|/)jquery\\\\.fn\\\\.gantt\\\\.js",\n "(^|/)jquery\\\\.fancybox\\\\.(js|css)",\n "(^|/)fuelux\\\\.js",\n "(^|/)jquery\\\\.fileupload(-\\\\w+)?\\\\.js$",\n "(^|/)jquery\\\\.dataTables\\\\.js",\n "(^|/)bootbox\\\\.js",\n "(^|/)pdf\\\\.worker\\\\.js",\n "(^|/)slick\\\\.\\\\w+.js$",\n "(^|/)Leaflet\\\\.Coordinates-\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.src\\\\.js$",\n "(^|/)leaflet\\\\.draw-src\\\\.js",\n "(^|/)leaflet\\\\.draw\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.js",\n "(^|/)leaflet\\\\.spin\\\\.js",\n "(^|/)wicket-leaflet\\\\.js",\n "(^|/)\\\\.sublime-project",\n "(^|/)\\\\.sublime-workspace",\n "(^|/)\\\\.vscode/",\n "(^|/)prototype(.*)\\\\.js$",\n "(^|/)effects\\\\.js$",\n "(^|/)controls\\\\.js$",\n "(^|/)dragdrop\\\\.js$",\n "(.*?)\\\\.d\\\\.ts$",\n "(^|/)mootools([^.]*)\\\\d+\\\\.\\\\d+.\\\\d+([^.]*)\\\\.js$",\n "(^|/)dojo\\\\.js$",\n "(^|/)MochiKit\\\\.js$",\n "(^|/)yahoo-([^.]*)\\\\.js$",\n "(^|/)yui([^.]*)\\\\.js$",\n "(^|/)ckeditor\\\\.js$",\n "(^|/)tiny_mce([^.]*)\\\\.js$",\n "(^|/)tiny_mce/(langs|plugins|themes|utils)",\n "(^|/)ace-builds/",\n "(^|/)fontello(.*?)\\\\.css$",\n "(^|/)MathJax/",\n "(^|/)Chart\\\\.js$",\n "(^|/)[Cc]ode[Mm]irror/(\\\\d+\\\\.\\\\d+/)?(lib|mode|theme|addon|keymap|demo)",\n "(^|/)shBrush([^.]*)\\\\.js$",\n "(^|/)shCore\\\\.js$",\n "(^|/)shLegacy\\\\.js$",\n "(^|/)angular([^.]*)\\\\.js$",\n "(^|\\\\/)d3(\\\\.v\\\\d+)?([^.]*)\\\\.js$",\n "(^|/)react(-[^.]*)?\\\\.js$",\n "(^|/)flow-typed/.*\\\\.js$",\n "(^|/)modernizr\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)modernizr\\\\.custom\\\\.\\\\d+\\\\.js$",\n "(^|/)knockout-(\\\\d+\\\\.){3}(debug\\\\.)?js$",\n "(^|/)docs?/_?(build|themes?|templates?|static)/",\n "(^|/)admin_media/",\n "(^|/)env/",\n "(^|/)fabfile\\\\.py$",\n "(^|/)waf$",\n "(^|/)\\\\.osx$",\n "\\\\.xctemplate/",\n "\\\\.imageset/",\n "(^|/)Carthage/",\n "(^|/)Sparkle/",\n "(^|/)Crashlytics\\\\.framework/",\n "(^|/)Fabric\\\\.framework/",\n "(^|/)BuddyBuildSDK\\\\.framework/",\n "(^|/)Realm\\\\.framework",\n "(^|/)RealmSwift\\\\.framework",\n "(^|/)\\\\.gitattributes$",\n "(^|/)\\\\.gitignore$",\n "(^|/)\\\\.gitmodules$",\n "(^|/)gradlew$",\n "(^|/)gradlew\\\\.bat$",\n "(^|/)gradle/wrapper/",\n "(^|/)mvnw$",\n "(^|/)mvnw\\\\.cmd$",\n "(^|/)\\\\.mvn/wrapper/",\n "-vsdoc\\\\.js$",\n "\\\\.intellisense\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.validate(\\\\.unobtrusive)?\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.unobtrusive\\\\-ajax\\\\.js$",\n "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\\\.debug)?\\\\.js$",\n "(^|/)[Pp]ackages\\\\/.+\\\\.\\\\d+\\\\/",\n "(^|/)extjs/.*?\\\\.js$",\n "(^|/)extjs/.*?\\\\.xml$",\n "(^|/)extjs/.*?\\\\.txt$",\n "(^|/)extjs/.*?\\\\.html$",\n "(^|/)extjs/.*?\\\\.properties$",\n "(^|/)extjs/\\\\.sencha/",\n "(^|/)extjs/docs/",\n "(^|/)extjs/builds/",\n "(^|/)extjs/cmd/",\n "(^|/)extjs/examples/",\n "(^|/)extjs/locale/",\n "(^|/)extjs/packages/",\n "(^|/)extjs/plugins/",\n "(^|/)extjs/resources/",\n "(^|/)extjs/src/",\n "(^|/)extjs/welcome/",\n "(^|/)html5shiv\\\\.js$",\n "(^|/)[Tt]ests?/fixtures/",\n "(^|/)[Ss]pecs?/fixtures/",\n "(^|/)cordova([^.]*)\\\\.js$",\n "(^|/)cordova\\\\-\\\\d\\\\.\\\\d(\\\\.\\\\d)?\\\\.js$",\n "(^|/)foundation(\\\\..*)?\\\\.js$",\n "(^|/)Vagrantfile$",\n "(^|/)\\\\.[Dd][Ss]_[Ss]tore$",\n "(^|/)inst/extdata/",\n "(^|/)octicons\\\\.css",\n "(^|/)sprockets-octicons\\\\.scss",\n "(^|/)activator$",\n "(^|/)activator\\\\.bat$",\n "(^|/)proguard\\\\.pro$",\n "(^|/)proguard-rules\\\\.pro$",\n "(^|/)puphpet/",\n "(^|/)\\\\.google_apis/",\n "(^|/)Jenkinsfile$",\n "(^|/)\\\\.gitpod\\\\.Dockerfile$",\n "(^|/)\\\\.github/",\n "(^|/)\\\\.obsidian/",\n "(^|/)\\\\.teamcity/",\n "(^|/)xvba_modules/"\n ]\n}' +TECHDATA = '{\n "_source": {\n "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml",\n "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml"\n },\n "fw_deps": {\n "Go": {\n "github.com/gin-gonic/gin": "Gin",\n "github.com/go-chi/chi": "chi",\n "github.com/gofiber/fiber": "Fiber",\n "github.com/gorilla/mux": "Gorilla",\n "github.com/labstack/echo": "Echo",\n "github.com/spf13/cobra": "Cobra",\n "google.golang.org/grpc": "gRPC",\n "gorm.io/gorm": "GORM"\n },\n "PHP": {\n "cakephp/cakephp": "CakePHP",\n "laravel/framework": "Laravel",\n "slim/slim": "Slim",\n "symfony/framework-bundle": "Symfony",\n "symfony/symfony": "Symfony",\n "yiisoft/yii2": "Yii"\n },\n "Python": {\n "aiohttp": "aiohttp",\n "celery": "Celery",\n "click": "Click",\n "django": "Django",\n "djangorestframework": "Django REST",\n "fastapi": "FastAPI",\n "flask": "Flask",\n "httpx": "HTTPX",\n "keras": "Keras",\n "matplotlib": "Matplotlib",\n "numpy": "NumPy",\n "pandas": "pandas",\n "pydantic": "Pydantic",\n "pyramid": "Pyramid",\n "pytest": "pytest",\n "requests": "Requests",\n "sanic": "Sanic",\n "scikit-learn": "scikit-learn",\n "scipy": "SciPy",\n "scrapy": "Scrapy",\n "sqlalchemy": "SQLAlchemy",\n "starlette": "Starlette",\n "tensorflow": "TensorFlow",\n "torch": "PyTorch",\n "tornado": "Tornado",\n "transformers": "Transformers",\n "typer": "Typer"\n },\n "Ruby": {\n "devise": "Devise",\n "hanami": "Hanami",\n "puma": "Puma",\n "rails": "Rails",\n "rspec": "RSpec",\n "sidekiq": "Sidekiq",\n "sinatra": "Sinatra"\n },\n "Rust": {\n "actix-web": "Actix Web",\n "axum": "Axum",\n "bevy": "Bevy",\n "clap": "clap",\n "diesel": "Diesel",\n "rocket": "Rocket",\n "serde": "Serde",\n "tauri": "Tauri",\n "tokio": "Tokio",\n "tonic": "Tonic",\n "warp": "warp"\n },\n "npm": {\n "@angular/core": "Angular",\n "@apollo/client": "Apollo",\n "@babel/core": "Babel",\n "@biomejs/biome": "Biome",\n "@chakra-ui/react": "Chakra UI",\n "@hapi/hapi": "hapi",\n "@ionic/core": "Ionic",\n "@mui/material": "MUI",\n "@nestjs/core": "NestJS",\n "@nx/workspace": "Nx",\n "@playwright/test": "Playwright",\n "@prisma/client": "Prisma",\n "@reduxjs/toolkit": "Redux",\n "@remix-run/react": "Remix",\n "@storybook/angular": "Storybook",\n "@storybook/html": "Storybook",\n "@storybook/preact": "Storybook",\n "@storybook/react": "Storybook",\n "@storybook/svelte": "Storybook",\n "@storybook/vue3": "Storybook",\n "@storybook/web-components": "Storybook",\n "@sveltejs/kit": "SvelteKit",\n "@swc/core": "SWC",\n "@testing-library/dom": "Testing Library",\n "@testing-library/react": "Testing Library",\n "@testing-library/vue": "Testing Library",\n "@trpc/client": "tRPC",\n "@trpc/server": "tRPC",\n "astro": "Astro",\n "bootstrap": "Bootstrap",\n "chart.js": "Chart.js",\n "cypress": "Cypress",\n "d3": "D3",\n "drizzle-orm": "Drizzle",\n "electron": "Electron",\n "esbuild": "esbuild",\n "eslint": "ESLint",\n "expo": "Expo",\n "express": "Express",\n "fastify": "Fastify",\n "gatsby": "Gatsby",\n "graphql": "GraphQL",\n "jest": "Jest",\n "koa": "Koa",\n "mocha": "Mocha",\n "mongoose": "Mongoose",\n "next": "Next.js",\n "nuxt": "Nuxt",\n "nx": "Nx",\n "parcel": "Parcel",\n "playwright": "Playwright",\n "preact": "Preact",\n "prettier": "Prettier",\n "prisma": "Prisma",\n "puppeteer": "Puppeteer",\n "react": "React",\n "react-dom": "React",\n "react-native": "React Native",\n "redux": "Redux",\n "rollup": "Rollup",\n "sequelize": "Sequelize",\n "solid-js": "SolidJS",\n "storybook": "Storybook",\n "styled-components": "styled-components",\n "svelte": "Svelte",\n "tailwindcss": "Tailwind CSS",\n "testcafe": "TestCafe",\n "three": "three.js",\n "turbo": "Turborepo",\n "typeorm": "TypeORM",\n "vite": "Vite",\n "vitest": "Vitest",\n "vue": "Vue",\n "webpack": "webpack",\n "zustand": "Zustand"\n }\n },\n "fw_sentinels_js": [\n [\n "next.config.js",\n "Next.js"\n ],\n [\n "next.config.ts",\n "Next.js"\n ],\n [\n "next.config.mjs",\n "Next.js"\n ],\n [\n "nuxt.config.js",\n "Nuxt"\n ],\n [\n "nuxt.config.ts",\n "Nuxt"\n ],\n [\n "svelte.config.js",\n "Svelte"\n ],\n [\n "astro.config.mjs",\n "Astro"\n ],\n [\n "vue.config.js",\n "Vue"\n ],\n [\n "gatsby-config.js",\n "Gatsby"\n ],\n [\n "angular.json",\n "Angular"\n ]\n ],\n "fw_sentinels_other": [\n [\n "manage.py",\n "Django",\n "Python"\n ],\n [\n "artisan",\n "Laravel",\n "PHP"\n ],\n [\n "config/application.rb",\n "Rails",\n "Ruby"\n ],\n [\n "Dockerfile",\n "Docker",\n "Tools"\n ],\n [\n "docker-compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "docker-compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "Makefile",\n "Make",\n "Tools"\n ],\n [\n "GNUmakefile",\n "Make",\n "Tools"\n ],\n [\n "pnpm-lock.yaml",\n "pnpm",\n "Tools"\n ],\n [\n "yarn.lock",\n "Yarn",\n "Tools"\n ],\n [\n "bun.lockb",\n "Bun",\n "Tools"\n ],\n [\n "bun.lock",\n "Bun",\n "Tools"\n ],\n [\n ".gitlab-ci.yml",\n "GitLab CI",\n "Tools"\n ],\n [\n "vercel.json",\n "Vercel",\n "Tools"\n ],\n [\n "netlify.toml",\n "Netlify",\n "Tools"\n ],\n [\n ".github/workflows/",\n "GitHub Actions",\n "Tools"\n ]\n ],\n "lang": {\n "color": {\n "1C Enterprise": "#814CCC",\n "2-Dimensional Array": "#38761D",\n "4D": "#004289",\n "ABAP": "#E8274B",\n "ABAP CDS": "#555e25",\n "AGS Script": "#B9D9FF",\n "AIDL": "#34EB6B",\n "AL": "#3AA2B5",\n "ALGOL": "#D1E0DB",\n "AMPL": "#E6EFBB",\n "ANTLR": "#9DC3FF",\n "API Blueprint": "#2ACCA8",\n "APL": "#5A8164",\n "ASP.NET": "#9400ff",\n "ATS": "#1ac620",\n "ActionScript": "#882B0F",\n "Ada": "#02f88c",\n "Adblock Filter List": "#800000",\n "Adobe Font Metrics": "#fa0f00",\n "Agda": "#315665",\n "Aiken": "#640ff8",\n "Alloy": "#64C800",\n "Alpine Abuild": "#0D597F",\n "Altium Designer": "#A89663",\n "AngelScript": "#C7D7DC",\n "Answer Set Programming": "#A9CC29",\n "Ant Build System": "#A9157E",\n "Antlers": "#ff269e",\n "ApacheConf": "#d12127",\n "Apex": "#1797c0",\n "Apollo Guidance Computer": "#0B3D91",\n "AppleScript": "#101F1F",\n "Arc": "#aa2afe",\n "AsciiDoc": "#73a0c5",\n "AspectJ": "#a957b0",\n "Assembly": "#6E4C13",\n "Astro": "#ff5a03",\n "Asymptote": "#ff0000",\n "Augeas": "#9CC134",\n "AutoHotkey": "#6594b9",\n "AutoIt": "#1C3552",\n "Avro IDL": "#0040FF",\n "Awk": "#c30e9b",\n "B (Formal Method)": "#8aa8c5",\n "B4X": "#00e4ff",\n "BASIC": "#ff0000",\n "BQN": "#2b7067",\n "Ballerina": "#FF5000",\n "Batchfile": "#C1F12E",\n "Beef": "#a52f4e",\n "Berry": "#15A13C",\n "BibTeX": "#778899",\n "Bicep": "#519aba",\n "Bikeshed": "#5562ac",\n "Bison": "#6A463F",\n "BitBake": "#00bce4",\n "Blade": "#f7523f",\n "BlitzBasic": "#00FFAE",\n "BlitzMax": "#cd6400",\n "Bluespec": "#12223c",\n "Bluespec BH": "#12223c",\n "Boo": "#d4bec1",\n "Boogie": "#c80fa0",\n "Brainfuck": "#2F2530",\n "BrighterScript": "#66AABB",\n "Brightscript": "#662D91",\n "Browserslist": "#ffd539",\n "Bru": "#F4AA41",\n "BuildStream": "#006bff",\n "C": "#555555",\n "C#": "#178600",\n "C++": "#f34b7d",\n "C3": "#2563eb",\n "CAP CDS": "#0092d1",\n "CLIPS": "#00A300",\n "CMake": "#DA3434",\n "COLLADA": "#F1A42B",\n "CQL": "#006091",\n "CSON": "#244776",\n "CSS": "#663399",\n "CSV": "#237346",\n "CUE": "#5886E1",\n "CWeb": "#00007a",\n "Cabal Config": "#483465",\n "Caddyfile": "#22b638",\n "Cadence": "#00ef8b",\n "Cairo": "#ff4a48",\n "Cairo Zero": "#ff4a48",\n "CameLIGO": "#3be133",\n "Cangjie": "#00868B",\n "Cap\'n Proto": "#c42727",\n "Carbon": "#222222",\n "Ceylon": "#dfa535",\n "Chapel": "#8dc63f",\n "ChucK": "#3f8000",\n "Circom": "#707575",\n "Cirru": "#ccccff",\n "Clarion": "#db901e",\n "Clarity": "#5546ff",\n "Classic ASP": "#6a40fd",\n "Clean": "#3F85AF",\n "Click": "#E4E6F3",\n "Clojure": "#db5855",\n "Closure Templates": "#0d948f",\n "Cloud Firestore Security Rules": "#FFA000",\n "Clue": "#0009b5",\n "CodeQL": "#140f46",\n "CoffeeScript": "#244776",\n "ColdFusion": "#ed2cd6",\n "ColdFusion CFC": "#ed2cd6",\n "Common Lisp": "#3fb68b",\n "Common Workflow Language": "#B5314C",\n "Component Pascal": "#B0CE4E",\n "Cooklang": "#E15A29",\n "Crystal": "#000100",\n "Csound": "#1a1a1a",\n "Csound Document": "#1a1a1a",\n "Csound Score": "#1a1a1a",\n "Cuda": "#3A4E3A",\n "Curry": "#531242",\n "Cylc": "#00b3fd",\n "Cypher": "#34c0eb",\n "Cython": "#fedf5b",\n "D": "#ba595e",\n "D2": "#526ee8",\n "DM": "#447265",\n "Dafny": "#FFEC25",\n "Darcs Patch": "#8eff23",\n "Dart": "#00B4AB",\n "Daslang": "#d3d3d3",\n "DataWeave": "#003a52",\n "Debian Package Control File": "#D70751",\n "DenizenScript": "#FBEE96",\n "Dhall": "#dfafff",\n "DirectX 3D File": "#aace60",\n "Dockerfile": "#384d54",\n "Dogescript": "#cca760",\n "Dotenv": "#e5d559",\n "Dune": "#89421e",\n "Dylan": "#6c616e",\n "E": "#ccce35",\n "ECL": "#8a1267",\n "ECLiPSe": "#001d9d",\n "EJS": "#a91e50",\n "EQ": "#a78649",\n "Earthly": "#2af0ff",\n "Easybuild": "#069406",\n "Ecere Projects": "#913960",\n "Ecmarkup": "#eb8131",\n "Edge": "#0dffe0",\n "EdgeQL": "#31A7FF",\n "EditorConfig": "#fff1f2",\n "Eiffel": "#4d6977",\n "Elixir": "#6e4a7e",\n "Elm": "#60B5CC",\n "Elvish": "#55BB55",\n "Elvish Transcript": "#55BB55",\n "Emacs Lisp": "#c065db",\n "EmberScript": "#FFF4F3",\n "Erlang": "#B83998",\n "Euphoria": "#FF790B",\n "F#": "#b845fc",\n "F*": "#572e30",\n "FIGlet Font": "#FFDDBB",\n "FIRRTL": "#2f632f",\n "FLUX": "#88ccff",\n "Factor": "#636746",\n "Fancy": "#7b9db4",\n "Fantom": "#14253c",\n "Faust": "#c37240",\n "Fennel": "#fff3d7",\n "Filebench WML": "#F6B900",\n "FlatBuffers": "#ed284a",\n "Flix": "#d44a45",\n "Fluent": "#ffcc33",\n "Forth": "#341708",\n "Fortran": "#4d41b1",\n "Fortran Free Form": "#4d41b1",\n "FreeBASIC": "#141AC9",\n "FreeMarker": "#0050b2",\n "Frege": "#00cafe",\n "Futhark": "#5f021f",\n "G-code": "#D08CF2",\n "GAML": "#FFC766",\n "GAMS": "#f49a22",\n "GAP": "#0000cc",\n "GCC Machine Description": "#FFCFAB",\n "GDScript": "#355570",\n "GDShader": "#478CBF",\n "GEDCOM": "#003058",\n "GLSL": "#5686a5",\n "GSC": "#FF6800",\n "Game Maker Language": "#71b417",\n "Gemfile.lock": "#701516",\n "Gemini": "#ff6900",\n "Genero 4gl": "#63408e",\n "Genero per": "#d8df39",\n "Genie": "#fb855d",\n "Genshi": "#951531",\n "Gentoo Ebuild": "#9400ff",\n "Gentoo Eclass": "#9400ff",\n "Gerber Image": "#d20b00",\n "Gherkin": "#5B2063",\n "Git Attributes": "#F44D27",\n "Git Commit": "#F44D27",\n "Git Config": "#F44D27",\n "Git Revision List": "#F44D27",\n "Gleam": "#ffaff3",\n "Glimmer JS": "#F5835F",\n "Glimmer TS": "#3178c6",\n "Glyph": "#c1ac7f",\n "Gnuplot": "#f0a9f0",\n "Go": "#00ADD8",\n "Go Checksums": "#00ADD8",\n "Go Module": "#00ADD8",\n "Go Template": "#00ADD8",\n "Go Workspace": "#00ADD8",\n "Godot Resource": "#355570",\n "Golo": "#88562A",\n "Gosu": "#82937f",\n "Grace": "#615f8b",\n "Gradle": "#02303a",\n "Gradle Kotlin DSL": "#02303a",\n "Grammatical Framework": "#ff0000",\n "GraphQL": "#e10098",\n "Graphviz (DOT)": "#2596be",\n "Groovy": "#4298b8",\n "Groovy Server Pages": "#4298b8",\n "HAProxy": "#106da9",\n "HCL": "#844FBA",\n "HIP": "#4F3A4F",\n "HLSL": "#aace60",\n "HOCON": "#9ff8ee",\n "HTML": "#e34c26",\n "HTML+ECR": "#2e1052",\n "HTML+EEX": "#6e4a7e",\n "HTML+ERB": "#701516",\n "HTML+PHP": "#4f5d95",\n "HTML+Razor": "#512be4",\n "HTTP": "#005C9C",\n "HXML": "#f68712",\n "Hack": "#878787",\n "Haml": "#ece2a9",\n "Handlebars": "#f7931e",\n "Harbour": "#0e60e3",\n "Hare": "#9d7424",\n "Haskell": "#5e5086",\n "Haxe": "#df7900",\n "HiveQL": "#dce200",\n "HolyC": "#ffefaf",\n "Hosts File": "#308888",\n "Hurl": "#FF0288",\n "Hy": "#7790B2",\n "IDL": "#a3522f",\n "IGOR Pro": "#0000cc",\n "IL Assembly": "#512BD4",\n "INI": "#d1dbe0",\n "ISPC": "#2D68B1",\n "Idris": "#b30000",\n "Ignore List": "#000000",\n "ImageJ Macro": "#99AAFF",\n "Imba": "#16cec6",\n "Inno Setup": "#264b99",\n "Io": "#a9188d",\n "Ioke": "#078193",\n "Isabelle": "#FEFE00",\n "Isabelle ROOT": "#FEFE00",\n "J": "#9EEDFF",\n "JAR Manifest": "#b07219",\n "JCL": "#d90e09",\n "JFlex": "#DBCA00",\n "JSON": "#292929",\n "JSON with Comments": "#292929",\n "JSON5": "#267CB9",\n "JSONLD": "#0c479c",\n "JSONiq": "#40d47e",\n "Jac": "#FC792D",\n "Jai": "#ab8b4b",\n "Janet": "#0886a5",\n "Jasmin": "#d03600",\n "Java": "#b07219",\n "Java Properties": "#2A6277",\n "Java Server Pages": "#2A6277",\n "Java Template Engine": "#2A6277",\n "JavaScript": "#f1e05a",\n "JavaScript+ERB": "#f1e05a",\n "Jest Snapshot": "#15c213",\n "JetBrains MPS": "#21D789",\n "Jinja": "#a52a22",\n "Jison": "#56b3cb",\n "Jison Lex": "#56b3cb",\n "Jolie": "#843179",\n "Jsonnet": "#0064bd",\n "Julia": "#a270ba",\n "Julia REPL": "#a270ba",\n "Jupyter Notebook": "#DA5B0B",\n "Just": "#384d54",\n "KCL": "#7ABABF",\n "KDL": "#ffb3b3",\n "KFramework": "#4195c5",\n "KRL": "#28430A",\n "Kaitai Struct": "#773b37",\n "KakouneScript": "#6f8042",\n "KerboScript": "#41adf0",\n "KiCad Layout": "#2f4aab",\n "KiCad Legacy Layout": "#2f4aab",\n "KiCad Schematic": "#2f4aab",\n "KoLmafia ASH": "#B9D9B9",\n "Koka": "#215166",\n "Kotlin": "#A97BFF",\n "LFE": "#4C3023",\n "LLVM": "#185619",\n "LOLCODE": "#cc9900",\n "LSL": "#3d9970",\n "LabVIEW": "#fede06",\n "Lambdapi": "#8027a3",\n "Langium": "#2c8c87",\n "Lark": "#2980B9",\n "Lasso": "#999999",\n "Latte": "#f2a542",\n "Leo": "#C4FFC2",\n "Less": "#1d365d",\n "Lex": "#DBCA00",\n "LigoLANG": "#0e74ff",\n "LilyPond": "#9ccc7c",\n "Liquid": "#67b8de",\n "Liquidsoap": "#990066",\n "Literate Agda": "#315665",\n "Literate CoffeeScript": "#244776",\n "Literate Haskell": "#5e5086",\n "LiveCode Script": "#0c5ba5",\n "LiveScript": "#499886",\n "Logtalk": "#295b9a",\n "LookML": "#652B81",\n "Lua": "#000080",\n "Luau": "#00A2FF",\n "M3U": "#179C7D",\n "MATLAB": "#e16737",\n "MAXScript": "#00a6a6",\n "MDX": "#fcb32c",\n "MLIR": "#5EC8DB",\n "MQL4": "#62A8D6",\n "MQL5": "#4A76B8",\n "MTML": "#b7e1f4",\n "Macaulay2": "#d8ffff",\n "Makefile": "#427819",\n "Mako": "#7e858d",\n "Markdown": "#083fa1",\n "Marko": "#42bff2",\n "Mask": "#f97732",\n "Mathematical Programming System": "#0530ad",\n "Max": "#c4a79c",\n "MeTTa": "#6a5acd",\n "Mercury": "#ff2b2b",\n "Mermaid": "#ff3670",\n "Meson": "#007800",\n "Metal": "#8f14e9",\n "MiniYAML": "#ff1111",\n "MiniZinc": "#06a9e6",\n "Mint": "#02b046",\n "Mirah": "#c7a938",\n "Modelica": "#de1d31",\n "Modula-2": "#10253f",\n "Modula-3": "#223388",\n "Mojo": "#ff4c1f",\n "Monkey C": "#8D6747",\n "MoonBit": "#b92381",\n "MoonScript": "#ff4585",\n "Motoko": "#fbb03b",\n "Motorola 68K Assembly": "#005daa",\n "Move": "#4a137a",\n "Mustache": "#724b3b",\n "NCL": "#28431f",\n "NMODL": "#00356B",\n "NPM Config": "#cb3837",\n "NWScript": "#111522",\n "Nasal": "#1d2c4e",\n "Nearley": "#990000",\n "Nemerle": "#3d3c6e",\n "NetLinx": "#0aa0ff",\n "NetLinx+ERB": "#747faa",\n "NetLogo": "#ff6375",\n "NewLisp": "#87AED7",\n "Nextflow": "#3ac486",\n "Nginx": "#009639",\n "Nickel": "#E0C3FC",\n "Nim": "#ffc200",\n "Nit": "#009917",\n "Nix": "#7e7eff",\n "Noir": "#2f1f49",\n "Nu": "#c9df40",\n "NumPy": "#9C8AF9",\n "Nunjucks": "#3d8137",\n "Nushell": "#4E9906",\n "OASv2-json": "#85ea2d",\n "OASv2-yaml": "#85ea2d",\n "OASv3-json": "#85ea2d",\n "OASv3-yaml": "#85ea2d",\n "OCaml": "#ef7a08",\n "OMNeT++ MSG": "#a0e0a0",\n "OMNeT++ NED": "#08607c",\n "ObjectScript": "#424893",\n "Objective-C": "#438eff",\n "Objective-C++": "#6866fb",\n "Objective-J": "#ff0c5a",\n "Odin": "#60AFFE",\n "Omgrofl": "#cabbff",\n "Opal": "#f7ede0",\n "Open Policy Agent": "#7d9199",\n "OpenAPI Specification v2": "#85ea2d",\n "OpenAPI Specification v3": "#85ea2d",\n "OpenCL": "#ed2e2d",\n "OpenEdge ABL": "#5ce600",\n "OpenQASM": "#AA70FF",\n "OpenSCAD": "#e5cd45",\n "Option List": "#476732",\n "Org": "#77aa99",\n "OverpassQL": "#cce2aa",\n "Oxygene": "#cdd0e3",\n "Oz": "#fab738",\n "P4": "#7055b5",\n "PDDL": "#0d00ff",\n "PEG.js": "#234d6b",\n "PHP": "#4F5D95",\n "PLSQL": "#dad8d8",\n "PLpgSQL": "#336790",\n "POV-Ray SDL": "#6bac65",\n "Pact": "#F7A8B8",\n "Pan": "#cc0000",\n "Papyrus": "#6600cc",\n "Parrot": "#f3ca0a",\n "Pascal": "#E3F171",\n "Pawn": "#dbb284",\n "Pep8": "#C76F5B",\n "Perl": "#0298c3",\n "PicoLisp": "#6067af",\n "PigLatin": "#fcd7de",\n "Pike": "#005390",\n "Pip Requirements": "#FFD343",\n "Pkl": "#6b9543",\n "PlantUML": "#fbbd16",\n "PogoScript": "#d80074",\n "Polar": "#ae81ff",\n "Portugol": "#f8bd00",\n "PostCSS": "#dc3a0c",\n "PostScript": "#da291c",\n "PowerBuilder": "#8f0f8d",\n "PowerShell": "#012456",\n "Praat": "#c8506d",\n "Prisma": "#0c344b",\n "Processing": "#0096D8",\n "Procfile": "#3B2F63",\n "Prolog": "#74283c",\n "Promela": "#de0000",\n "Propeller Spin": "#7fa2a7",\n "Pug": "#a86454",\n "Puppet": "#302B6D",\n "PureBasic": "#5a6986",\n "PureScript": "#1D222D",\n "Pyret": "#ee1e10",\n "Python": "#3572A5",\n "Python console": "#3572A5",\n "Python traceback": "#3572A5",\n "Q#": "#fed659",\n "QML": "#44a51c",\n "Qt Script": "#00b841",\n "Quake": "#882233",\n "QuakeC": "#975777",\n "QuickBASIC": "#008080",\n "Quint": "#9d6ce5",\n "R": "#198CE7",\n "RAML": "#77d9fb",\n "RAScript": "#2C97FA",\n "RBS": "#701516",\n "RDoc": "#701516",\n "REXX": "#d90e09",\n "RMarkdown": "#198ce7",\n "RON": "#a62c00",\n "ROS Interface": "#22314e",\n "RPGLE": "#2BDE21",\n "RUNOFF": "#665a4e",\n "Racket": "#3c5caa",\n "Ragel": "#9d5200",\n "Raku": "#0000fb",\n "Rascal": "#fffaa0",\n "ReScript": "#ed5051",\n "Reason": "#ff5847",\n "ReasonLIGO": "#ff5847",\n "Rebol": "#358a5b",\n "Record Jar": "#0673ba",\n "Red": "#f50000",\n "Regular Expression": "#009a00",\n "Ren\'Py": "#ff7f7f",\n "Rez": "#FFDAB3",\n "Ring": "#2D54CB",\n "Riot": "#A71E49",\n "RobotFramework": "#00c0b5",\n "Roc": "#7c38f5",\n "Rocq Prover": "#d0b68c",\n "Roff": "#ecdebe",\n "Roff Manpage": "#ecdebe",\n "Rouge": "#cc0088",\n "RouterOS Script": "#DE3941",\n "Ruby": "#701516",\n "Rust": "#dea584",\n "SAS": "#B34936",\n "SCSS": "#c6538c",\n "SPARQL": "#0C4597",\n "SQF": "#3F3F3F",\n "SQL": "#e38c00",\n "SQLPL": "#e38c00",\n "SRecode Template": "#348a34",\n "STL": "#373b5e",\n "SVG": "#ff9900",\n "Sail": "#259dd5",\n "SaltStack": "#646464",\n "Sass": "#a53b70",\n "Scala": "#c22d40",\n "Scaml": "#bd181a",\n "Scenic": "#fdc700",\n "Scheme": "#1e4aec",\n "Scilab": "#ca0f21",\n "Self": "#0579aa",\n "ShaderLab": "#222c37",\n "Shell": "#89e051",\n "ShellCheck Config": "#cecfcb",\n "Shen": "#120F14",\n "Simple File Verification": "#C9BFED",\n "Singularity": "#64E6AD",\n "Slang": "#1fbec9",\n "Slash": "#007eff",\n "Slice": "#003fa2",\n "Slim": "#2b2b2b",\n "Slint": "#2379F4",\n "SmPL": "#c94949",\n "Smalltalk": "#596706",\n "Smarty": "#f0c040",\n "Smithy": "#c44536",\n "Snakemake": "#419179",\n "Solidity": "#AA6746",\n "SourcePawn": "#f69e1d",\n "SpiceDB Schema": "#a5318a",\n "Squirrel": "#800000",\n "Stan": "#b2011d",\n "Standard ML": "#dc566d",\n "Starlark": "#76d275",\n "Stata": "#1a5f91",\n "StringTemplate": "#3fb34f",\n "Stylus": "#ff6347",\n "SubRip Text": "#9e0101",\n "SugarSS": "#2fcc9f",\n "SuperCollider": "#46390b",\n "SurrealQL": "#ff00a0",\n "Survex data": "#ffcc99",\n "Svelte": "#ff3e00",\n "Sway": "#00F58C",\n "Sweave": "#198ce7",\n "Swift": "#F05138",\n "SystemVerilog": "#DAE1C2",\n "TI Program": "#A0AA87",\n "TL-Verilog": "#C40023",\n "TLA": "#4b0079",\n "TMDL": "#f0c913",\n "TOML": "#9c4221",\n "TSQL": "#e38c00",\n "TSV": "#237346",\n "TSX": "#3178c6",\n "TXL": "#0178b8",\n "Tact": "#48b5ff",\n "Talon": "#333333",\n "Tcl": "#e4cc98",\n "TeX": "#3D6117",\n "Teal": "#00B1BC",\n "Terra": "#00004c",\n "Terraform Template": "#7b42bb",\n "TextGrid": "#c8506d",\n "TextMate Properties": "#df66e4",\n "Textile": "#ffe7ac",\n "Thrift": "#D12127",\n "Toit": "#c2c9fb",\n "Tools": "#a371f7",\n "Tor Config": "#59316b",\n "Tree-sitter Query": "#8ea64c",\n "Turing": "#cf142b",\n "Twig": "#c1d026",\n "TypeScript": "#3178c6",\n "TypeSpec": "#4A3665",\n "Typst": "#239dad",\n "Unified Parallel C": "#4e3617",\n "Unity3D Asset": "#222c37",\n "Uno": "#9933cc",\n "UnrealScript": "#a54c4d",\n "Untyped Plutus Core": "#36adbd",\n "UrWeb": "#ccccee",\n "V": "#4f87c4",\n "VBA": "#867db1",\n "VBScript": "#15dcdc",\n "VCL": "#148AA8",\n "VHDL": "#adb2cb",\n "Vala": "#a56de2",\n "Valve Data Format": "#f26025",\n "Velocity Template Language": "#507cff",\n "Vento": "#ff0080",\n "Verilog": "#b2b7f8",\n "Vim Help File": "#199f4b",\n "Vim Script": "#199f4b",\n "Vim Snippet": "#199f4b",\n "Visual Basic .NET": "#945db7",\n "Visual Basic 6.0": "#2c6353",\n "Volt": "#1F1F1F",\n "Vue": "#41b883",\n "Vyper": "#9F4CF2",\n "WDL": "#42f1f4",\n "WGSL": "#1a5e9a",\n "Web Ontology Language": "#5b70bd",\n "WebAssembly": "#04133b",\n "WebAssembly Interface Type": "#6250e7",\n "Whiley": "#d5c397",\n "Wikitext": "#fc5757",\n "Windows Registry Entries": "#52d5ff",\n "Witcher Script": "#ff0000",\n "Wolfram Language": "#dd1100",\n "Wollok": "#a23738",\n "World of Warcraft Addon Data": "#f7e43f",\n "Wren": "#383838",\n "X10": "#4B6BEF",\n "XC": "#99DA07",\n "XML": "#0060ac",\n "XML Property List": "#0060ac",\n "XQuery": "#5232e7",\n "XSLT": "#EB8CEB",\n "Xmake": "#22a079",\n "Xojo": "#81bd41",\n "Xonsh": "#285EEF",\n "Xtend": "#24255d",\n "YAML": "#cb171e",\n "YARA": "#220000",\n "YASnippet": "#32AB90",\n "Yacc": "#4B6C4B",\n "Yul": "#794932",\n "ZAP": "#0d665e",\n "ZIL": "#dc75e5",\n "ZenScript": "#00BCD1",\n "Zephir": "#118f9e",\n "Zig": "#ec915c",\n "Zimpl": "#d67711",\n "Zmodel": "#ff7100",\n "crontab": "#ead7ac",\n "eC": "#913960",\n "fish": "#4aae47",\n "hoon": "#00b171",\n "iCalendar": "#ec564c",\n "jq": "#c7254e",\n "kvlang": "#1da6e0",\n "mIRC Script": "#3d57c3",\n "mcfunction": "#E22837",\n "mdsvex": "#5f9ea0",\n "mupad": "#244963",\n "nanorc": "#2d004d",\n "nesC": "#94B0C7",\n "ooc": "#b0b77e",\n "q": "#0040cd",\n "reStructuredText": "#141414",\n "sed": "#64b970",\n "templ": "#66D0DD",\n "vCard": "#ee2647",\n "wisp": "#7582D1",\n "xBase": "#403a40"\n },\n "ext": {\n "1": "Roff",\n "1in": "Roff",\n "1m": "Roff",\n "1x": "Roff",\n "2": "Roff",\n "2da": "2-Dimensional Array",\n "3": "Roff",\n "3in": "Roff",\n "3m": "Roff",\n "3p": "Roff",\n "3pm": "Roff",\n "3qt": "Roff",\n "3x": "Roff",\n "4": "Roff",\n "4dform": "JSON",\n "4dm": "4D",\n "4dproject": "JSON",\n "4gl": "Genero 4gl",\n "4th": "Forth",\n "5": "Roff",\n "6": "Roff",\n "6pl": "Raku",\n "6pm": "Raku",\n "7": "Roff",\n "8": "Roff",\n "8xp": "TI Program",\n "8xp.txt": "TI Program",\n "9": "Roff",\n "_coffee": "CoffeeScript",\n "_js": "JavaScript",\n "_ls": "LiveScript",\n "a51": "Assembly",\n "abap": "ABAP",\n "action": "ROS Interface",\n "ada": "Ada",\n "adb": "Ada",\n "adml": "XML",\n "admx": "XML",\n "ado": "Stata",\n "adoc": "AsciiDoc",\n "adp": "Tcl",\n "ads": "Ada",\n "afm": "Adobe Font Metrics",\n "agc": "Assembly",\n "agda": "Agda",\n "ahk": "AutoHotkey",\n "ahkl": "AutoHotkey",\n "aidl": "AIDL",\n "aj": "AspectJ",\n "ak": "Aiken",\n "al": "AL",\n "alg": "ALGOL",\n "als": "Alloy",\n "ampl": "AMPL",\n "angelscript": "AngelScript",\n "anim": "Unity3D Asset",\n "ant": "XML",\n "antlers.html": "Antlers",\n "antlers.php": "Antlers",\n "antlers.xml": "Antlers",\n "apacheconf": "ApacheConf",\n "apex": "Apex",\n "apib": "API Blueprint",\n "apl": "APL",\n "app": "Erlang",\n "app.src": "Erlang",\n "applescript": "AppleScript",\n "arc": "Arc",\n "arr": "Pyret",\n "as": "ActionScript",\n "asax": "ASP.NET",\n "asc": "AGS Script",\n "asciidoc": "AsciiDoc",\n "ascx": "ASP.NET",\n "asd": "Common Lisp",\n "asddls": "ABAP CDS",\n "ash": "KoLmafia ASH",\n "ashx": "ASP.NET",\n "asm": "Assembly",\n "asmx": "ASP.NET",\n "asp": "Classic ASP",\n "aspx": "ASP.NET",\n "asset": "Unity3D Asset",\n "astro": "Astro",\n "asy": "Asymptote",\n "au3": "AutoIt",\n "aug": "Augeas",\n "auk": "Awk",\n "aux": "TeX",\n "avdl": "Avro IDL",\n "avsc": "JSON",\n "aw": "PHP",\n "awk": "Awk",\n "axaml": "XML",\n "axd": "ASP.NET",\n "axi": "NetLinx",\n "axi.erb": "NetLinx+ERB",\n "axml": "XML",\n "axs": "NetLinx",\n "axs.erb": "NetLinx+ERB",\n "b": "Brainfuck",\n "bal": "Ballerina",\n "bas": "B4X",\n "bash": "Shell",\n "bat": "Batchfile",\n "bats": "Shell",\n "bb": "BitBake",\n "bbappend": "BitBake",\n "bbclass": "BitBake",\n "bbx": "TeX",\n "bdy": "PLSQL",\n "be": "Berry",\n "bf": "Beef",\n "bi": "FreeBASIC",\n "bib": "TeX",\n "bibtex": "TeX",\n "bicep": "Bicep",\n "bicepparam": "Bicep",\n "bison": "Yacc",\n "blade": "Blade",\n "blade.php": "Blade",\n "bmx": "BlitzMax",\n "bones": "JavaScript",\n "boo": "Boo",\n "boot": "Clojure",\n "bpl": "Boogie",\n "bqn": "BQN",\n "brd": "KiCad Legacy Layout",\n "brs": "Brightscript",\n "bru": "Bru",\n "bs": "Bluespec",\n "bsl": "1C Enterprise",\n "bst": "BuildStream",\n "bsv": "Bluespec",\n "builder": "Ruby",\n "builds": "XML",\n "bzl": "Starlark",\n "c": "C",\n "c++": "C++",\n "c3": "C3",\n "cabal": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cairo": "Cairo",\n "cake": "C#",\n "capnp": "Cap\'n Proto",\n "carbon": "Carbon",\n "cats": "C",\n "cbx": "TeX",\n "cc": "C++",\n "ccproj": "XML",\n "ccxml": "XML",\n "cdc": "Cadence",\n "cdf": "Wolfram Language",\n "cds": "CAP CDS",\n "ceylon": "Ceylon",\n "cfc": "ColdFusion",\n "cfg": "HAProxy",\n "cfm": "ColdFusion",\n "cfml": "ColdFusion",\n "cgi": "Perl",\n "cginc": "HLSL",\n "ch": "xBase",\n "chpl": "Chapel",\n "circom": "Circom",\n "cirru": "Cirru",\n "cj": "Cangjie",\n "cjs": "JavaScript",\n "cjsx": "CoffeeScript",\n "ck": "ChucK",\n "cl": "C",\n "cl2": "Clojure",\n "clar": "Clarity",\n "click": "Click",\n "clixml": "XML",\n "clj": "Clojure",\n "cljc": "Clojure",\n "cljs": "Clojure",\n "cljs.hl": "Clojure",\n "cljscm": "Clojure",\n "cljx": "Clojure",\n "clp": "CLIPS",\n "cls": "Apex",\n "clue": "Clue",\n "clw": "Clarion",\n "cmake": "CMake",\n "cmake.in": "CMake",\n "cmd": "Batchfile",\n "cmp": "Gerber Image",\n "cnc": "G-code",\n "cnf": "INI",\n "cocci": "SmPL",\n "code-snippets": "JSON",\n "code-workspace": "JSON",\n "coffee": "CoffeeScript",\n "coffee.md": "CoffeeScript",\n "command": "Shell",\n "containerfile": "Dockerfile",\n "cook": "Cooklang",\n "coq": "Rocq Prover",\n "cp": "Component Pascal",\n "cpp": "C++",\n "cppm": "C++",\n "cproject": "XML",\n "cps": "Component Pascal",\n "cql": "CQL",\n "cr": "Crystal",\n "cs": "C#",\n "cs.pp": "C#",\n "csc": "GSC",\n "cscfg": "XML",\n "csd": "Csound Document",\n "csdef": "XML",\n "cshtml": "HTML",\n "csl": "XML",\n "cson": "CSON",\n "csproj": "XML",\n "css": "CSS",\n "csv": "CSV",\n "csx": "C#",\n "ct": "XML",\n "ctl": "Visual Basic 6.0",\n "ctp": "PHP",\n "cts": "TypeScript",\n "cu": "Cuda",\n "cue": "CUE",\n "cuh": "Cuda",\n "curry": "Curry",\n "cwl": "Common Workflow Language",\n "cxx": "C++",\n "cylc": "INI",\n "cyp": "Cypher",\n "cypher": "Cypher",\n "d": "D",\n "d2": "D2",\n "dae": "COLLADA",\n "darcspatch": "Darcs Patch",\n "dart": "Dart",\n "das": "Daslang",\n "dats": "ATS",\n "db2": "SQLPL",\n "dcl": "Clean",\n "ddl": "PLSQL",\n "decls": "BlitzBasic",\n "depproj": "XML",\n "dfm": "Pascal",\n "dfy": "Dafny",\n "dhall": "Dhall",\n "di": "D",\n "dita": "XML",\n "ditamap": "XML",\n "ditaval": "XML",\n "djs": "Dogescript",\n "dll.config": "XML",\n "dlm": "IDL",\n "dm": "DM",\n "do": "Stata",\n "dockerfile": "Dockerfile",\n "dof": "INI",\n "doh": "Stata",\n "dot": "Graphviz (DOT)",\n "dotsettings": "XML",\n "dpatch": "Darcs Patch",\n "dpr": "Pascal",\n "druby": "Mirah",\n "dsc": "DenizenScript",\n "dsp": "Faust",\n "dsr": "Visual Basic 6.0",\n "dtx": "TeX",\n "duby": "Mirah",\n "dwl": "DataWeave",\n "dyalog": "APL",\n "dyl": "Dylan",\n "dylan": "Dylan",\n "e": "E",\n "eb": "Python",\n "ebuild": "Shell",\n "ec": "eC",\n "ecl": "ECL",\n "eclass": "Shell",\n "eclxml": "ECL",\n "ecr": "HTML",\n "ect": "EJS",\n "edge": "Edge",\n "edgeql": "EdgeQL",\n "editorconfig": "INI",\n "eh": "eC",\n "ejs": "EJS",\n "ejs.t": "EJS",\n "el": "Emacs Lisp",\n "eliom": "OCaml",\n "eliomi": "OCaml",\n "elm": "Elm",\n "elv": "Elvish",\n "em": "EmberScript",\n "emacs": "Emacs Lisp",\n "emacs.desktop": "Emacs Lisp",\n "emberscript": "EmberScript",\n "env": "Dotenv",\n "epj": "JavaScript",\n "eps": "PostScript",\n "epsi": "PostScript",\n "eq": "EQ",\n "erb": "HTML",\n "erb.deface": "HTML",\n "erl": "Erlang",\n "es": "Erlang",\n "es6": "JavaScript",\n "escript": "Erlang",\n "esdl": "EdgeQL",\n "ex": "Elixir",\n "exs": "Elixir",\n "eye": "Ruby",\n "f": "Fortran",\n "f03": "Fortran",\n "f08": "Fortran",\n "f77": "Fortran",\n "f90": "Fortran",\n "f95": "Fortran",\n "factor": "Factor",\n "fan": "Fantom",\n "fancypack": "Fancy",\n "fbs": "FlatBuffers",\n "fcgi": "Lua",\n "feature": "Gherkin",\n "filters": "XML",\n "fir": "FIRRTL",\n "fish": "Shell",\n "flex": "Lex",\n "flf": "FIGlet Font",\n "flix": "Flix",\n "flux": "FLUX",\n "fnc": "PLSQL",\n "fnl": "Fennel",\n "for": "Fortran",\n "forth": "Forth",\n "fp": "GLSL",\n "fpp": "Fortran",\n "fr": "Frege",\n "frag": "GLSL",\n "frg": "GLSL",\n "frm": "VBA",\n "frt": "Forth",\n "fs": "F#",\n "fsh": "GLSL",\n "fshader": "GLSL",\n "fsi": "F#",\n "fsproj": "XML",\n "fst": "F*",\n "fsti": "F*",\n "fsx": "F#",\n "fth": "Forth",\n "ftl": "Fluent",\n "ftlh": "FreeMarker",\n "fun": "Standard ML",\n "fut": "Futhark",\n "fx": "FLUX",\n "fxh": "HLSL",\n "fxml": "XML",\n "fy": "Fancy",\n "g": "G-code",\n "g4": "ANTLR",\n "gaml": "GAML",\n "gap": "GAP",\n "gawk": "Awk",\n "gbl": "Gerber Image",\n "gbo": "Gerber Image",\n "gbp": "Gerber Image",\n "gbr": "Gerber Image",\n "gbs": "Gerber Image",\n "gco": "G-code",\n "gcode": "G-code",\n "gd": "GDScript",\n "gdnlib": "Godot Resource",\n "gdns": "Godot Resource",\n "gdshader": "GDShader",\n "gdshaderinc": "GDShader",\n "ged": "GEDCOM",\n "gemspec": "Ruby",\n "geo": "GLSL",\n "geojson": "JSON",\n "geom": "GLSL",\n "gf": "Grammatical Framework",\n "gi": "GAP",\n "gitconfig": "INI",\n "gitignore": "Ignore List",\n "gjs": "JavaScript",\n "gko": "Gerber Image",\n "glade": "XML",\n "gleam": "Gleam",\n "glf": "Glyph",\n "glsl": "GLSL",\n "glslf": "GLSL",\n "glslv": "GLSL",\n "gltf": "JSON",\n "gmi": "Gemini",\n "gml": "Game Maker Language",\n "gms": "GAMS",\n "gmx": "XML",\n "gnu": "Gnuplot",\n "gnuplot": "Gnuplot",\n "go": "Go",\n "god": "Ruby",\n "gohtml": "Go Template",\n "golo": "Golo",\n "gotmpl": "Go Template",\n "gp": "Gnuplot",\n "gpb": "Gerber Image",\n "gpt": "Gerber Image",\n "gpx": "XML",\n "gql": "GraphQL",\n "grace": "Grace",\n "gradle": "Gradle",\n "gradle.kts": "Gradle",\n "graphql": "GraphQL",\n "graphqls": "GraphQL",\n "groovy": "Groovy",\n "grt": "Groovy",\n "grxml": "XML",\n "gs": "Genie",\n "gsc": "GSC",\n "gsh": "GSC",\n "gshader": "GLSL",\n "gsp": "Groovy",\n "gst": "Gosu",\n "gsx": "Gosu",\n "gtl": "Gerber Image",\n "gto": "Gerber Image",\n "gtp": "Gerber Image",\n "gtpl": "Groovy",\n "gts": "TypeScript",\n "gv": "Graphviz (DOT)",\n "gvy": "Groovy",\n "gyp": "Python",\n "gypi": "Python",\n "h": "C",\n "h++": "C++",\n "h.in": "C",\n "ha": "Hare",\n "hack": "Hack",\n "haml": "Haml",\n "haml.deface": "Haml",\n "handlebars": "Handlebars",\n "har": "JSON",\n "hats": "ATS",\n "hb": "Harbour",\n "hbs": "Handlebars",\n "hc": "HolyC",\n "hcl": "HCL",\n "heex": "HTML",\n "hh": "C++",\n "hhi": "Hack",\n "hic": "Clojure",\n "hip": "HIP",\n "hlsl": "HLSL",\n "hlsli": "HLSL",\n "hocon": "HOCON",\n "hoon": "hoon",\n "hpp": "C++",\n "hqf": "SQF",\n "hql": "HiveQL",\n "hrl": "Erlang",\n "hs": "Haskell",\n "hs-boot": "Haskell",\n "hsc": "Haskell",\n "hta": "HTML",\n "htm": "HTML",\n "html": "HTML",\n "html.eex": "HTML",\n "html.hl": "HTML",\n "html.tmpl": "Go Template",\n "http": "HTTP",\n "hurl": "Hurl",\n "hx": "Haxe",\n "hxml": "HXML",\n "hxsl": "Haxe",\n "hxx": "C++",\n "hy": "Hy",\n "hzp": "XML",\n "i": "Assembly",\n "i3": "Modula-3",\n "ical": "iCalendar",\n "ice": "Slice",\n "iced": "CoffeeScript",\n "icl": "Clean",\n "icls": "XML",\n "ics": "iCalendar",\n "idc": "C",\n "idr": "Idris",\n "ig": "Modula-3",\n "ihlp": "Stata",\n "ijm": "ImageJ Macro",\n "ijs": "J",\n "ik": "Ioke",\n "il": "IL Assembly",\n "ily": "LilyPond",\n "imba": "Imba",\n "iml": "XML",\n "inc": "Assembly",\n "ini": "INI",\n "inl": "C++",\n "ino": "C++",\n "ins": "TeX",\n "intr": "Dylan",\n "io": "Io",\n "iol": "Jolie",\n "ipf": "IGOR Pro",\n "ipp": "C++",\n "ipynb": "Jupyter Notebook",\n "isl": "Inno Setup",\n "ispc": "ISPC",\n "iss": "Inno Setup",\n "iuml": "PlantUML",\n "ivy": "XML",\n "ixx": "C++",\n "j": "Jasmin",\n "j2": "Jinja",\n "jac": "Jac",\n "jade": "Pug",\n "jai": "Jai",\n "jake": "JavaScript",\n "janet": "Janet",\n "jav": "Java",\n "java": "Java",\n "javascript": "JavaScript",\n "jbuilder": "Ruby",\n "jcl": "JCL",\n "jelly": "XML",\n "jflex": "Lex",\n "jinja": "Jinja",\n "jinja2": "Jinja",\n "jison": "Yacc",\n "jisonlex": "Lex",\n "jl": "Julia",\n "jq": "JSONiq",\n "js": "JavaScript",\n "js.erb": "JavaScript",\n "jsb": "JavaScript",\n "jscad": "JavaScript",\n "jsfl": "JavaScript",\n "jsh": "Java",\n "jslib": "JavaScript",\n "jsm": "JavaScript",\n "json": "JSON",\n "json-tmlanguage": "JSON",\n "json.example": "JSON",\n "json5": "JSON5",\n "jsonc": "JSON",\n "jsonl": "JSON",\n "jsonld": "JSONLD",\n "jsonnet": "Jsonnet",\n "jsp": "Java",\n "jspre": "JavaScript",\n "jsproj": "XML",\n "jss": "JavaScript",\n "jst": "EJS",\n "jsx": "JavaScript",\n "jte": "Java",\n "just": "Just",\n "k": "KCL",\n "kak": "KakouneScript",\n "kdl": "KDL",\n "kicad_mod": "KiCad Layout",\n "kicad_pcb": "KiCad Layout",\n "kicad_sch": "KiCad Schematic",\n "kicad_sym": "KiCad Schematic",\n "kicad_wks": "KiCad Layout",\n "kid": "Genshi",\n "kk": "Koka",\n "kml": "XML",\n "kojo": "Scala",\n "krl": "KRL",\n "ks": "KerboScript",\n "ksh": "Shell",\n "ksy": "Kaitai Struct",\n "kt": "Kotlin",\n "ktm": "Kotlin",\n "kts": "Kotlin",\n "kv": "kvlang",\n "l": "Common Lisp",\n "lagda": "Agda",\n "langium": "Langium",\n "lark": "Lark",\n "las": "Lasso",\n "lasso": "Lasso",\n "lasso8": "Lasso",\n "lasso9": "Lasso",\n "latte": "Latte",\n "launch": "XML",\n "lbx": "TeX",\n "leex": "HTML",\n "lektorproject": "INI",\n "leo": "Leo",\n "less": "Less",\n "lex": "Lex",\n "lfe": "LFE",\n "lgt": "Logtalk",\n "lhs": "Haskell",\n "libsonnet": "Jsonnet",\n "lid": "Dylan",\n "lidr": "Idris",\n "ligo": "LigoLANG",\n "linq": "C#",\n "liq": "Liquidsoap",\n "liquid": "Liquid",\n "lisp": "Common Lisp",\n "litcoffee": "CoffeeScript",\n "livecodescript": "LiveCode Script",\n "livemd": "Markdown",\n "lkml": "LookML",\n "ll": "LLVM",\n "lmi": "Python",\n "logtalk": "Logtalk",\n "lol": "LOLCODE",\n "lookml": "LookML",\n "lp": "Answer Set Programming",\n "lpr": "Pascal",\n "ls": "LiveScript",\n "lsl": "LSL",\n "lslp": "LSL",\n "lsp": "Common Lisp",\n "ltx": "TeX",\n "lua": "Lua",\n "luau": "Luau",\n "lvclass": "LabVIEW",\n "lvlib": "LabVIEW",\n "lvproj": "LabVIEW",\n "ly": "LilyPond",\n "m": "Objective-C",\n "m2": "Macaulay2",\n "m3": "Modula-3",\n "m3u": "M3U",\n "m3u8": "M3U",\n "ma": "Wolfram Language",\n "mak": "Makefile",\n "make": "Makefile",\n "makefile": "Makefile",\n "mako": "Mako",\n "man": "Roff",\n "mao": "Mako",\n "markdown": "Markdown",\n "marko": "Marko",\n "mask": "Mask",\n "mat": "Unity3D Asset",\n "mata": "Stata",\n "matah": "Stata",\n "mathematica": "Wolfram Language",\n "matlab": "MATLAB",\n "mawk": "Awk",\n "maxhelp": "Max",\n "maxpat": "Max",\n "maxproj": "Max",\n "mbt": "MoonBit",\n "mc": "Monkey C",\n "mcfunction": "mcfunction",\n "mch": "B (Formal Method)",\n "mcmeta": "JSON",\n "mcr": "MAXScript",\n "md": "Markdown",\n "mdoc": "Roff",\n "mdown": "Markdown",\n "mdpolicy": "XML",\n "mdwn": "Markdown",\n "mdx": "MDX",\n "me": "Roff",\n "mediawiki": "Wikitext",\n "mermaid": "Mermaid",\n "meta": "Unity3D Asset",\n "metal": "Metal",\n "metta": "MeTTa",\n "mg": "Modula-3",\n "mint": "Mint",\n "mir": "YAML",\n "mirah": "Mirah",\n "mjml": "XML",\n "mjs": "JavaScript",\n "mk": "Makefile",\n "mkd": "Markdown",\n "mkdn": "Markdown",\n "mkdown": "Markdown",\n "mkfile": "Makefile",\n "mkii": "TeX",\n "mkiv": "TeX",\n "mkvi": "TeX",\n "ml": "OCaml",\n "ml4": "OCaml",\n "mli": "OCaml",\n "mligo": "LigoLANG",\n "mlir": "MLIR",\n "mll": "OCaml",\n "mly": "OCaml",\n "mm": "Objective-C++",\n "mmd": "Mermaid",\n "mo": "Modelica",\n "mod": "Modula-2",\n "mojo": "Mojo",\n "moo": "Mercury",\n "moon": "MoonScript",\n "move": "Move",\n "mpl": "JetBrains MPS",\n "mps": "JetBrains MPS",\n "mq4": "MQL4",\n "mq5": "MQL5",\n "mqh": "MQL4",\n "mrc": "mIRC Script",\n "ms": "MAXScript",\n "msd": "JetBrains MPS",\n "msg": "OMNeT++ MSG",\n "mspec": "Ruby",\n "mt": "Wolfram Language",\n "mtml": "MTML",\n "mts": "TypeScript",\n "mu": "mupad",\n "mud": "ZIL",\n "mustache": "Mustache",\n "mxml": "XML",\n "mxt": "Max",\n "mysql": "SQL",\n "mzn": "MiniZinc",\n "n": "Nemerle",\n "nanorc": "INI",\n "nas": "Nasal",\n "nasm": "Assembly",\n "natvis": "XML",\n "nawk": "Awk",\n "nb": "Wolfram Language",\n "nbp": "Wolfram Language",\n "nc": "nesC",\n "ncl": "NCL",\n "ndproj": "XML",\n "ne": "Nearley",\n "nearley": "Nearley",\n "ned": "OMNeT++ NED",\n "nf": "Nextflow",\n "nginx": "Nginx",\n "nginxconf": "Nginx",\n "nim": "Nim",\n "nim.cfg": "Nim",\n "nimble": "Nim",\n "nimrod": "Nim",\n "nims": "Nim",\n "nit": "Nit",\n "nix": "Nix",\n "njk": "Nunjucks",\n "njs": "JavaScript",\n "nl": "NewLisp",\n "nlogo": "NetLogo",\n "nomad": "HCL",\n "nproj": "XML",\n "nqp": "Raku",\n "nr": "Noir",\n "nse": "Lua",\n "nss": "NWScript",\n "nu": "Nu",\n "numpy": "Python",\n "numpyw": "Python",\n "numsc": "Python",\n "nuspec": "XML",\n "nut": "Squirrel",\n "ny": "Common Lisp",\n "odd": "XML",\n "odin": "Odin",\n "ol": "Jolie",\n "omgrofl": "Omgrofl",\n "ooc": "ooc",\n "opal": "Opal",\n "opencl": "C",\n "orc": "Csound",\n "org": "Org",\n "os": "1C Enterprise",\n "osm": "XML",\n "outjob": "Altium Designer",\n "overpassql": "OverpassQL",\n "owl": "Web Ontology Language",\n "oxygene": "Oxygene",\n "oz": "Oz",\n "p": "OpenEdge ABL",\n "p4": "P4",\n "p6": "Raku",\n "p6l": "Raku",\n "p6m": "Raku",\n "p8": "Lua",\n "pac": "JavaScript",\n "pact": "Pact",\n "pan": "Pan",\n "parrot": "Parrot",\n "pas": "Pascal",\n "pascal": "Pascal",\n "pat": "Max",\n "pb": "PureBasic",\n "pbi": "PureBasic",\n "pbt": "PowerBuilder",\n "pcbdoc": "Altium Designer",\n "pck": "PLSQL",\n "pcss": "CSS",\n "pd_lua": "Lua",\n "pddl": "PDDL",\n "pde": "Processing",\n "peggy": "PEG.js",\n "pegjs": "PEG.js",\n "pep": "Pep8",\n "per": "Genero per",\n "perl": "Perl",\n "pfa": "PostScript",\n "pgsql": "PLpgSQL",\n "ph": "Perl",\n "php": "PHP",\n "php3": "PHP",\n "php4": "PHP",\n "php5": "PHP",\n "phps": "PHP",\n "phpt": "PHP",\n "phtml": "HTML",\n "pig": "PigLatin",\n "pike": "Pike",\n "pkb": "PLSQL",\n "pkgproj": "XML",\n "pkl": "Pkl",\n "pks": "PLSQL",\n "pl": "Perl",\n "pl6": "Raku",\n "plantuml": "PlantUML",\n "plb": "PLSQL",\n "plist": "XML",\n "plot": "Gnuplot",\n "pls": "PLSQL",\n "plsql": "PLSQL",\n "plt": "Gnuplot",\n "pluginspec": "Ruby",\n "plx": "Perl",\n "pm": "Perl",\n "pm6": "Raku",\n "pml": "Promela",\n "pmod": "Pike",\n "podsl": "Common Lisp",\n "podspec": "Ruby",\n "pogo": "PogoScript",\n "polar": "Polar",\n "por": "Portugol",\n "postcss": "CSS",\n "pov": "POV-Ray SDL",\n "pp": "Puppet",\n "pprx": "REXX",\n "praat": "Praat",\n "prawn": "Ruby",\n "prc": "PLSQL",\n "prefab": "Unity3D Asset",\n "prefs": "INI",\n "prg": "xBase",\n "prisma": "Prisma",\n "prjpcb": "Altium Designer",\n "pro": "Prolog",\n "proj": "XML",\n "prolog": "Prolog",\n "properties": "Java Properties",\n "props": "XML",\n "prw": "xBase",\n "ps": "PostScript",\n "ps1": "PowerShell",\n "ps1xml": "XML",\n "psc": "Papyrus",\n "psc1": "XML",\n "psd1": "PowerShell",\n "psgi": "Perl",\n "psm1": "PowerShell",\n "pt": "XML",\n "pubxml": "XML",\n "pug": "Pug",\n "puml": "PlantUML",\n "purs": "PureScript",\n "pwn": "Pawn",\n "pxd": "Cython",\n "pxi": "Cython",\n "py": "Python",\n "py3": "Python",\n "pyde": "Python",\n "pyi": "Python",\n "pyp": "Python",\n "pyt": "Python",\n "pytb": "Python",\n "pyw": "Python",\n "pyx": "Cython",\n "q": "HiveQL",\n "qasm": "OpenQASM",\n "qbs": "QML",\n "qc": "QuakeC",\n "qhelp": "XML",\n "ql": "CodeQL",\n "qll": "CodeQL",\n "qmd": "RMarkdown",\n "qml": "QML",\n "qnt": "Quint",\n "qs": "Q#",\n "r": "R",\n "r2": "Rebol",\n "r3": "Rebol",\n "rabl": "Ruby",\n "rake": "Ruby",\n "raku": "Raku",\n "rakumod": "Raku",\n "raml": "RAML",\n "rascript": "RAScript",\n "razor": "HTML",\n "rb": "Ruby",\n "rbi": "Ruby",\n "rbs": "Ruby",\n "rbuild": "Ruby",\n "rbw": "Ruby",\n "rbx": "Ruby",\n "rbxs": "Lua",\n "rchit": "GLSL",\n "rd": "R",\n "rdf": "XML",\n "rdoc": "RDoc",\n "re": "Reason",\n "reb": "Rebol",\n "rebol": "Rebol",\n "red": "Red",\n "reds": "Red",\n "reek": "YAML",\n "reg": "Windows Registry Entries",\n "regex": "Regular Expression",\n "regexp": "Regular Expression",\n "rego": "Open Policy Agent",\n "rei": "Reason",\n "religo": "LigoLANG",\n "res": "ReScript",\n "resi": "ReScript",\n "resource": "RobotFramework",\n "rest": "reStructuredText",\n "rest.txt": "reStructuredText",\n "resx": "XML",\n "rex": "REXX",\n "rexx": "REXX",\n "rg": "Rouge",\n "rhtml": "HTML",\n "ring": "Ring",\n "riot": "Riot",\n "rkt": "Racket",\n "rktd": "Racket",\n "rktl": "Racket",\n "rl": "Ragel",\n "rmd": "RMarkdown",\n "rmiss": "GLSL",\n "rnh": "RUNOFF",\n "rno": "RUNOFF",\n "rnw": "Sweave",\n "robot": "RobotFramework",\n "roc": "Roc",\n "rockspec": "Lua",\n "roff": "Roff",\n "ron": "RON",\n "ronn": "Markdown",\n "rpgle": "RPGLE",\n "rpy": "Ren\'Py",\n "rq": "SPARQL",\n "rs": "Rust",\n "rs.in": "Rust",\n "rsc": "Rascal",\n "rss": "XML",\n "rst": "reStructuredText",\n "rst.txt": "reStructuredText",\n "rsx": "R",\n "ru": "Ruby",\n "ruby": "Ruby",\n "rviz": "YAML",\n "s": "Assembly",\n "sail": "Sail",\n "sarif": "JSON",\n "sas": "SAS",\n "sass": "Sass",\n "sats": "ATS",\n "sbatch": "Shell",\n "sbt": "Scala",\n "sc": "SuperCollider",\n "scad": "OpenSCAD",\n "scala": "Scala",\n "scaml": "Scaml",\n "scd": "SuperCollider",\n "sce": "Scilab",\n "scenic": "Scenic",\n "sch": "Scheme",\n "schdoc": "Altium Designer",\n "sci": "Scilab",\n "scm": "Scheme",\n "sco": "Csound Score",\n "scpt": "AppleScript",\n "scrbl": "Racket",\n "scss": "SCSS",\n "scxml": "XML",\n "sdc": "Tcl",\n "sed": "sed",\n "self": "Self",\n "sexp": "Common Lisp",\n "sfproj": "XML",\n "sfv": "Simple File Verification",\n "sh": "Shell",\n "sh.in": "Shell",\n "shader": "ShaderLab",\n "shen": "Shen",\n "shproj": "XML",\n "sig": "Standard ML",\n "sj": "Objective-J",\n "sjs": "JavaScript",\n "sl": "Slash",\n "slang": "Slang",\n "sld": "Scheme",\n "slim": "Slim",\n "slint": "Slint",\n "slnx": "XML",\n "sls": "SaltStack",\n "slurm": "Shell",\n "sma": "Pawn",\n "smithy": "Smithy",\n "smk": "Python",\n "sml": "Standard ML",\n "snakefile": "Python",\n "snap": "Jest Snapshot",\n "snip": "Vim Snippet",\n "snippet": "Vim Snippet",\n "snippets": "Vim Snippet",\n "sol": "Solidity",\n "soy": "Closure Templates",\n "sp": "SourcePawn",\n "sparql": "SPARQL",\n "spc": "PLSQL",\n "spec": "Python",\n "spin": "Propeller Spin",\n "sps": "Scheme",\n "sqf": "SQF",\n "sql": "SQL",\n "sqlrpgle": "RPGLE",\n "sra": "PowerBuilder",\n "srdf": "XML",\n "srt": "SRecode Template",\n "sru": "PowerBuilder",\n "srv": "ROS Interface",\n "srw": "PowerBuilder",\n "ss": "Scheme",\n "ssjs": "JavaScript",\n "sss": "SugarSS",\n "st": "Smalltalk",\n "stan": "Stan",\n "star": "Starlark",\n "sthlp": "Stata",\n "stl": "STL",\n "story": "Gherkin",\n "storyboard": "XML",\n "sttheme": "XML",\n "sty": "TeX",\n "styl": "Stylus",\n "sublime-build": "JSON",\n "sublime-color-scheme": "JSON",\n "sublime-commands": "JSON",\n "sublime-completions": "JSON",\n "sublime-keymap": "JSON",\n "sublime-macro": "JSON",\n "sublime-menu": "JSON",\n "sublime-mousemap": "JSON",\n "sublime-project": "JSON",\n "sublime-settings": "JSON",\n "sublime-snippet": "XML",\n "sublime-syntax": "YAML",\n "sublime-theme": "JSON",\n "sublime-workspace": "JSON",\n "sublime_metrics": "JSON",\n "sublime_session": "JSON",\n "surql": "SurrealQL",\n "sv": "SystemVerilog",\n "svelte": "Svelte",\n "svg": "SVG",\n "svh": "SystemVerilog",\n "svx": "mdsvex",\n "sw": "Sway",\n "swift": "Swift",\n "syntax": "YAML",\n "t": "Perl",\n "tab": "SQL",\n "tac": "Python",\n "tact": "Tact",\n "tag": "Java",\n "talon": "Talon",\n "targets": "XML",\n "tcc": "C++",\n "tcl": "Tcl",\n "tcl.in": "Tcl",\n "templ": "templ",\n "tesc": "GLSL",\n "tese": "GLSL",\n "tex": "TeX",\n "textgrid": "TextGrid",\n "textile": "Textile",\n "tf": "HCL",\n "tfstate": "JSON",\n "tfstate.backup": "JSON",\n "tftpl": "HCL",\n "tfvars": "HCL",\n "thor": "Ruby",\n "thrift": "Thrift",\n "thy": "Isabelle",\n "tl": "Teal",\n "tla": "TLA",\n "tlv": "TL-Verilog",\n "tm": "Tcl",\n "tmac": "Roff",\n "tmcommand": "XML",\n "tmdl": "TMDL",\n "tml": "XML",\n "tmlanguage": "XML",\n "tmpl": "Go Template",\n "tmpreferences": "XML",\n "tmsnippet": "XML",\n "tmtheme": "XML",\n "tmux": "Shell",\n "toc": "TeX",\n "tofu": "HCL",\n "toit": "Toit",\n "toml": "TOML",\n "toml.example": "TOML",\n "tool": "Shell",\n "topojson": "JSON",\n "tpb": "PLSQL",\n "tpl": "Smarty",\n "tpp": "C++",\n "tps": "PLSQL",\n "tres": "Godot Resource",\n "trg": "PLSQL",\n "trigger": "Apex",\n "ts": "TypeScript",\n "tscn": "Godot Resource",\n "tsconfig.json": "JSON",\n "tsp": "TypeSpec",\n "tst": "GAP",\n "tsv": "TSV",\n "tsx": "TypeScript",\n "tu": "Turing",\n "twig": "Twig",\n "txl": "TXL",\n "txt": "Adblock Filter List",\n "txx": "C++",\n "typ": "Typst",\n "uc": "UnrealScript",\n "udf": "SQL",\n "udo": "Csound",\n "ui": "XML",\n "unity": "Unity3D Asset",\n "uno": "Uno",\n "upc": "C",\n "uplc": "Untyped Plutus Core",\n "ur": "UrWeb",\n "urdf": "XML",\n "url": "INI",\n "urs": "UrWeb",\n "ux": "XML",\n "v": "Verilog",\n "vala": "Vala",\n "vapi": "Vala",\n "vark": "Gosu",\n "vb": "Visual Basic .NET",\n "vba": "VBA",\n "vbhtml": "Visual Basic .NET",\n "vbproj": "XML",\n "vbs": "VBScript",\n "vcf": "vCard",\n "vcl": "VCL",\n "vcxproj": "XML",\n "vdf": "Valve Data Format",\n "veo": "Verilog",\n "vert": "GLSL",\n "vh": "SystemVerilog",\n "vhd": "VHDL",\n "vhdl": "VHDL",\n "vhf": "VHDL",\n "vhi": "VHDL",\n "vho": "VHDL",\n "vhost": "ApacheConf",\n "vhs": "VHDL",\n "vht": "VHDL",\n "vhw": "VHDL",\n "vim": "Vim Script",\n "vimrc": "Vim Script",\n "viw": "SQL",\n "vmb": "Vim Script",\n "volt": "Volt",\n "vrx": "GLSL",\n "vs": "GLSL",\n "vsh": "GLSL",\n "vshader": "GLSL",\n "vsixmanifest": "XML",\n "vssettings": "XML",\n "vstemplate": "XML",\n "vtl": "Velocity Template Language",\n "vto": "Vento",\n "vue": "Vue",\n "vw": "PLSQL",\n "vxml": "XML",\n "vy": "Vyper",\n "w": "CWeb",\n "wast": "WebAssembly",\n "wat": "WebAssembly",\n "watchr": "Ruby",\n "wdl": "WDL",\n "webapp": "JSON",\n "webmanifest": "JSON",\n "wgsl": "WGSL",\n "whiley": "Whiley",\n "wiki": "Wikitext",\n "wikitext": "Wikitext",\n "wisp": "wisp",\n "wit": "WebAssembly Interface Type",\n "wixproj": "XML",\n "wl": "Wolfram Language",\n "wlk": "Wollok",\n "wls": "Wolfram Language",\n "wlt": "Wolfram Language",\n "wlua": "Lua",\n "workbook": "Markdown",\n "workflow": "HCL",\n "wren": "Wren",\n "ws": "Witcher Script",\n "wsdl": "XML",\n "wsf": "XML",\n "wsgi": "Python",\n "wxi": "XML",\n "wxl": "XML",\n "wxs": "XML",\n "x": "DirectX 3D File",\n "x10": "X10",\n "x3d": "XML",\n "x68": "Assembly",\n "xacro": "XML",\n "xaml": "XML",\n "xc": "XC",\n "xdc": "Tcl",\n "xht": "HTML",\n "xhtml": "HTML",\n "xib": "XML",\n "xlf": "XML",\n "xliff": "XML",\n "xmi": "XML",\n "xml": "XML",\n "xml.dist": "XML",\n "xmp": "XML",\n "xojo_code": "Xojo",\n "xojo_menu": "Xojo",\n "xojo_report": "Xojo",\n "xojo_script": "Xojo",\n "xojo_toolbar": "Xojo",\n "xojo_window": "Xojo",\n "xproj": "XML",\n "xpy": "Python",\n "xq": "XQuery",\n "xql": "XQuery",\n "xqm": "XQuery",\n "xquery": "XQuery",\n "xqy": "XQuery",\n "xrl": "Erlang",\n "xsd": "XML",\n "xsh": "Xonsh",\n "xsjs": "JavaScript",\n "xsjslib": "JavaScript",\n "xsl": "XSLT",\n "xslt": "XSLT",\n "xspec": "XML",\n "xtend": "Xtend",\n "xul": "XML",\n "xzap": "ZAP",\n "y": "Yacc",\n "yacc": "Yacc",\n "yaml": "MiniYAML",\n "yaml-tmlanguage": "YAML",\n "yaml.sed": "YAML",\n "yap": "Prolog",\n "yar": "YARA",\n "yara": "YARA",\n "yasnippet": "YASnippet",\n "yml": "YAML",\n "yml.mysql": "YAML",\n "yrl": "Erlang",\n "yul": "Yul",\n "yy": "Yacc",\n "yyp": "JSON",\n "zap": "ZAP",\n "zcml": "XML",\n "zed": "SpiceDB Schema",\n "zep": "Zephir",\n "zig": "Zig",\n "zig.zon": "Zig",\n "zil": "ZIL",\n "zimpl": "Zimpl",\n "zmodel": "Zmodel",\n "zmpl": "Zimpl",\n "zpl": "Zimpl",\n "zs": "ZenScript",\n "zsh": "Shell",\n "zsh-theme": "Shell"\n },\n "filename": {\n ".abbrev_defs": "Emacs Lisp",\n ".ackrc": "Option List",\n ".all-contributorsrc": "JSON",\n ".arcconfig": "JSON",\n ".atomignore": "Ignore List",\n ".auto-changelog": "JSON",\n ".babelignore": "Ignore List",\n ".babelrc": "JSON",\n ".bash_aliases": "Shell",\n ".bash_functions": "Shell",\n ".bash_history": "Shell",\n ".bash_logout": "Shell",\n ".bash_profile": "Shell",\n ".bashrc": "Shell",\n ".browserslistrc": "Browserslist",\n ".buckconfig": "INI",\n ".bzrignore": "Ignore List",\n ".c8rc": "JSON",\n ".clang-format": "YAML",\n ".clang-tidy": "YAML",\n ".clangd": "YAML",\n ".classpath": "XML",\n ".coffeelintignore": "Ignore List",\n ".coveragerc": "INI",\n ".cproject": "XML",\n ".cshrc": "Shell",\n ".cvsignore": "Ignore List",\n ".devcontainer.json": "JSON",\n ".dockerignore": "Ignore List",\n ".easignore": "Ignore List",\n ".editorconfig": "INI",\n ".eleventyignore": "Ignore List",\n ".emacs": "Emacs Lisp",\n ".emacs.desktop": "Emacs Lisp",\n ".env": "Dotenv",\n ".env.ci": "Dotenv",\n ".env.dev": "Dotenv",\n ".env.development": "Dotenv",\n ".env.development.local": "Dotenv",\n ".env.example": "Dotenv",\n ".env.local": "Dotenv",\n ".env.prod": "Dotenv",\n ".env.production": "Dotenv",\n ".env.sample": "Dotenv",\n ".env.staging": "Dotenv",\n ".env.template": "Dotenv",\n ".env.test": "Dotenv",\n ".env.testing": "Dotenv",\n ".envrc": "Shell",\n ".eslintignore": "Ignore List",\n ".eslintrc.json": "JSON",\n ".exrc": "Vim Script",\n ".factor-boot-rc": "Factor",\n ".factor-rc": "Factor",\n ".flake8": "INI",\n ".flaskenv": "Shell",\n ".gclient": "Python",\n ".gemrc": "YAML",\n ".git-blame-ignore-revs": "Git Revision List",\n ".gitattributes": "Git Attributes",\n ".gitconfig": "INI",\n ".gitignore": "Ignore List",\n ".gitmodules": "INI",\n ".gnus": "Emacs Lisp",\n ".gvimrc": "Vim Script",\n ".htaccess": "ApacheConf",\n ".htmlhintrc": "JSON",\n ".ignore": "Ignore List",\n ".imgbotconfig": "JSON",\n ".irbrc": "Ruby",\n ".jscsrc": "JSON",\n ".jshintrc": "JSON",\n ".jslintrc": "JSON",\n ".justfile": "Just",\n ".kshrc": "Shell",\n ".latexmkrc": "Perl",\n ".login": "Shell",\n ".luacheckrc": "Lua",\n ".markdownlintignore": "Ignore List",\n ".nanorc": "INI",\n ".nodemonignore": "Ignore List",\n ".npmignore": "Ignore List",\n ".npmrc": "INI",\n ".nvimrc": "Vim Script",\n ".nycrc": "JSON",\n ".oxlintrc.json": "JSON",\n ".php": "PHP",\n ".php_cs": "PHP",\n ".php_cs.dist": "PHP",\n ".prettierignore": "Ignore List",\n ".profile": "Shell",\n ".project": "XML",\n ".pryrc": "Ruby",\n ".pylintrc": "INI",\n ".rprofile": "R",\n ".rspec": "Option List",\n ".scalafix.conf": "HOCON",\n ".scalafmt.conf": "HOCON",\n ".shellcheckrc": "ShellCheck Config",\n ".simplecov": "Ruby",\n ".spacemacs": "Emacs Lisp",\n ".stylelintignore": "Ignore List",\n ".swcrc": "JSON",\n ".tern-config": "JSON",\n ".tern-project": "JSON",\n ".tm_properties": "TextMate Properties",\n ".tmux.conf": "Shell",\n ".vercelignore": "Ignore List",\n ".vimrc": "Vim Script",\n ".viper": "Emacs Lisp",\n ".vscodeignore": "Ignore List",\n ".watchmanconfig": "JSON",\n ".xinitrc": "Shell",\n ".xsession": "Shell",\n ".yardopts": "Option List",\n ".zlogin": "Shell",\n ".zlogout": "Shell",\n ".zprofile": "Shell",\n ".zshenv": "Shell",\n ".zshrc": "Shell",\n "9fs": "Shell",\n "_emacs": "Emacs Lisp",\n "_helpers.tpl": "Go Template",\n "_vimrc": "Vim Script",\n "abbrev_defs": "Emacs Lisp",\n "ack": "Perl",\n "ackrc": "Option List",\n "ant.xml": "Ant Build System",\n "apache2.conf": "ApacheConf",\n "api-extractor.json": "JSON",\n "apkbuild": "Shell",\n "app.config": "XML",\n "appraisals": "Ruby",\n "bash_aliases": "Shell",\n "bash_logout": "Shell",\n "bash_profile": "Shell",\n "bashrc": "Shell",\n "berksfile": "Ruby",\n "brewfile": "Ruby",\n "browserslist": "Browserslist",\n "bsdmakefile": "Makefile",\n "buck": "Starlark",\n "build": "Starlark",\n "build.bazel": "Starlark",\n "build.xml": "Ant Build System",\n "buildfile": "Ruby",\n "buildozer.spec": "INI",\n "bun.lock": "JSON",\n "cabal.config": "Cabal Config",\n "cabal.project": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cakefile": "CoffeeScript",\n "capfile": "Ruby",\n "cargo.lock": "TOML",\n "cargo.toml.orig": "TOML",\n "cask": "Emacs Lisp",\n "citation.cff": "YAML",\n "cmakelists.txt": "CMake",\n "commit_editmsg": "Git Commit",\n "composer.lock": "JSON",\n "containerfile": "Dockerfile",\n "contents.lr": "Markdown",\n "cpanfile": "Perl",\n "crontab": "crontab",\n "cshrc": "Shell",\n "dangerfile": "Ruby",\n "deliverfile": "Ruby",\n "deno.lock": "JSON",\n "deps": "Python",\n "dev-requirements.txt": "Pip Requirements",\n "devcontainer.json": "JSON",\n "dockerfile": "Dockerfile",\n "dune-project": "Dune",\n "earthfile": "Earthly",\n "eask": "Emacs Lisp",\n "emakefile": "Erlang",\n "eqnrc": "Roff",\n "expr-dist": "R",\n "fakefile": "Fancy",\n "fastfile": "Ruby",\n "firestore.rules": "Cloud Firestore Security Rules",\n "flake.lock": "JSON",\n "fp-lib-table": "KiCad Layout",\n "gemfile": "Ruby",\n "gemfile.lock": "Gemfile.lock",\n "gitignore-global": "Ignore List",\n "gitignore_global": "Ignore List",\n "glide.lock": "YAML",\n "gnumakefile": "Makefile",\n "go.mod": "Go Module",\n "go.sum": "Go Checksums",\n "go.work": "Go Workspace",\n "go.work.sum": "Go Checksums",\n "gopkg.lock": "TOML",\n "gradlew": "Shell",\n "gradlew.bat": "Batchfile",\n "guardfile": "Ruby",\n "gvimrc": "Vim Script",\n "haproxy.cfg": "HAProxy",\n "hosts": "Hosts File",\n "hosts.txt": "Hosts File",\n "httpd.conf": "ApacheConf",\n "installscript.qs": "Qt Script",\n "jakefile": "JavaScript",\n "jarfile": "Ruby",\n "jenkinsfile": "Groovy",\n "jsconfig.json": "JSON",\n "justfile": "Just",\n "kakrc": "KakouneScript",\n "kbuild": "Makefile",\n "kcl.mod": "KCL",\n "kcl.mod.lock": "KCL",\n "kshrc": "Shell",\n "language-configuration.json": "JSON",\n "language-subtag-registry.txt": "Record Jar",\n "latexmkrc": "Perl",\n "lexer.x": "Lex",\n "login": "Shell",\n "m3makefile": "Quake",\n "m3overrides": "Quake",\n "makefile": "Makefile",\n "makefile.am": "Makefile",\n "makefile.boot": "Makefile",\n "makefile.frag": "Makefile",\n "makefile.in": "Makefile",\n "makefile.inc": "Makefile",\n "makefile.pl": "Perl",\n "makefile.sco": "Makefile",\n "makefile.wat": "Makefile",\n "man": "Shell",\n "manifest.mf": "JAR Manifest",\n "mavenfile": "Ruby",\n "mcmod.info": "JSON",\n "meson.build": "Meson",\n "meson_options.txt": "Meson",\n "mise.local.lock": "TOML",\n "mise.lock": "TOML",\n "mix.lock": "Elixir",\n "mkfile": "Makefile",\n "mmn": "Roff",\n "mmt": "Roff",\n "mocha.opts": "Option List",\n "module.bazel": "Starlark",\n "module.bazel.lock": "JSON",\n "modulefile": "Puppet",\n "mvnw": "Shell",\n "mvnw.cmd": "Batchfile",\n "nanorc": "INI",\n "nextflow.config": "Nextflow",\n "nginx.conf": "Nginx",\n "nim.cfg": "Nim",\n "notebook": "Jupyter Notebook",\n "nuget.config": "XML",\n "nukefile": "Nu",\n "nvimrc": "Vim Script",\n "owh": "Tcl",\n "package.resolved": "JSON",\n "packages.config": "XML",\n "pdm.lock": "TOML",\n "phakefile": "PHP",\n "pipfile": "TOML",\n "pipfile.lock": "JSON",\n "pixi.lock": "YAML",\n "pkgbuild": "Shell",\n "podfile": "Ruby",\n "poetry.lock": "TOML",\n "procfile": "Procfile",\n "profile": "Shell",\n "project.ede": "Emacs Lisp",\n "project.godot": "Godot Resource",\n "puppetfile": "Ruby",\n "pylintrc": "INI",\n "rakefile": "Ruby",\n "rebar.config": "Erlang",\n "rebar.config.lock": "Erlang",\n "rebar.lock": "Erlang",\n "requirements-dev.txt": "Pip Requirements",\n "requirements.lock.txt": "Pip Requirements",\n "requirements.txt": "Pip Requirements",\n "rexfile": "Perl",\n "riemann.config": "Clojure",\n "root": "Isabelle",\n "sconscript": "Python",\n "sconstruct": "Python",\n "settings.stylecop": "XML",\n "singularity": "Singularity",\n "slakefile": "LiveScript",\n "snakefile": "Python",\n "snapfile": "Ruby",\n "starfield": "Tcl",\n "steepfile": "Ruby",\n "suite.rc": "INI",\n "thorfile": "Ruby",\n "tiltfile": "Starlark",\n "tmux.conf": "Shell",\n "toolchain_installscript.qs": "Qt Script",\n "torrc": "Tor Config",\n "troffrc": "Roff",\n "troffrc-end": "Roff",\n "tsconfig.json": "JSON",\n "tslint.json": "JSON",\n "uv.lock": "TOML",\n "vagrantfile": "Ruby",\n "vimrc": "Vim Script",\n "vlcrc": "INI",\n "web.config": "XML",\n "web.debug.config": "XML",\n "web.release.config": "XML",\n "workspace": "Starlark",\n "workspace.bazel": "Starlark",\n "workspace.bzlmod": "Starlark",\n "wscript": "Python",\n "xinitrc": "Shell",\n "xmake.lua": "Xmake",\n "xsession": "Shell",\n "yarn.lock": "YAML",\n "zlogin": "Shell",\n "zlogout": "Shell",\n "zprofile": "Shell",\n "zshenv": "Shell",\n "zshrc": "Shell"\n }\n },\n "vendor": [\n "(^|/)cache/",\n "^[Dd]ependencies/",\n "(^|/)dist/",\n "^deps/",\n "(^|/)configure$",\n "(^|/)config\\\\.guess$",\n "(^|/)config\\\\.sub$",\n "(^|/)aclocal\\\\.m4",\n "(^|/)libtool\\\\.m4",\n "(^|/)ltoptions\\\\.m4",\n "(^|/)ltsugar\\\\.m4",\n "(^|/)ltversion\\\\.m4",\n "(^|/)lt~obsolete\\\\.m4",\n "(^|/)dotnet-install\\\\.(ps1|sh)$",\n "(^|/)cpplint\\\\.py",\n "(^|/)node_modules/",\n "(^|/)\\\\.yarn/releases/",\n "(^|/)\\\\.yarn/plugins/",\n "(^|/)\\\\.yarn/sdks/",\n "(^|/)\\\\.yarn/versions/",\n "(^|/)\\\\.yarn/unplugged/",\n "(^|/)_esy$",\n "(^|/)bower_components/",\n "^rebar$",\n "(^|/)erlang\\\\.mk",\n "(^|/)Godeps/_workspace/",\n "(^|/)testdata/",\n "(^|/)\\\\.indent\\\\.pro",\n "(\\\\.|-)min\\\\.(js|css)$",\n "([^\\\\s]*)import\\\\.(css|less|scss|styl)$",\n "(^|/)bootstrap([^/.]*)(\\\\..*)?\\\\.(js|css|less|scss|styl)$",\n "(^|/)custom\\\\.bootstrap([^\\\\s]*)(js|css|less|scss|styl)$",\n "(^|/)font-?awesome\\\\.(css|less|scss|styl)$",\n "(^|/)font-?awesome/.*\\\\.(css|less|scss|styl)$",\n "(^|/)foundation\\\\.(css|less|scss|styl)$",\n "(^|/)normalize\\\\.(css|less|scss|styl)$",\n "(^|/)skeleton\\\\.(css|less|scss|styl)$",\n "(^|/)[Bb]ourbon/.*\\\\.(css|less|scss|styl)$",\n "(^|/)animate\\\\.(css|less|scss|styl)$",\n "(^|/)materialize\\\\.(css|less|scss|styl|js)$",\n "(^|/)select2/.*\\\\.(css|scss|js)$",\n "(^|/)bulma\\\\.(css|sass|scss)$",\n "(3rd|[Tt]hird)[-_]?[Pp]arty/",\n "(^|/)vendors?/",\n "(^|/)[Ee]xtern(als?)?/",\n "(^|/)[Vv]+endor/",\n "^debian/",\n "(^|/)run\\\\.n$",\n "(^|/)bootstrap-datepicker/",\n "(^|/)jquery([^.]*)\\\\.js$",\n "(^|/)jquery\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)jquery\\\\-ui(\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?)?(\\\\.\\\\w+)?\\\\.(js|css)$",\n "(^|/)jquery\\\\.(ui|effects)\\\\.([^.]*)\\\\.(js|css)$",\n "(^|/)jquery\\\\.fn\\\\.gantt\\\\.js",\n "(^|/)jquery\\\\.fancybox\\\\.(js|css)",\n "(^|/)fuelux\\\\.js",\n "(^|/)jquery\\\\.fileupload(-\\\\w+)?\\\\.js$",\n "(^|/)jquery\\\\.dataTables\\\\.js",\n "(^|/)bootbox\\\\.js",\n "(^|/)pdf\\\\.worker\\\\.js",\n "(^|/)slick\\\\.\\\\w+.js$",\n "(^|/)Leaflet\\\\.Coordinates-\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.src\\\\.js$",\n "(^|/)leaflet\\\\.draw-src\\\\.js",\n "(^|/)leaflet\\\\.draw\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.js",\n "(^|/)leaflet\\\\.spin\\\\.js",\n "(^|/)wicket-leaflet\\\\.js",\n "(^|/)\\\\.sublime-project",\n "(^|/)\\\\.sublime-workspace",\n "(^|/)\\\\.vscode/",\n "(^|/)prototype(.*)\\\\.js$",\n "(^|/)effects\\\\.js$",\n "(^|/)controls\\\\.js$",\n "(^|/)dragdrop\\\\.js$",\n "(.*?)\\\\.d\\\\.ts$",\n "(^|/)mootools([^.]*)\\\\d+\\\\.\\\\d+.\\\\d+([^.]*)\\\\.js$",\n "(^|/)dojo\\\\.js$",\n "(^|/)MochiKit\\\\.js$",\n "(^|/)yahoo-([^.]*)\\\\.js$",\n "(^|/)yui([^.]*)\\\\.js$",\n "(^|/)ckeditor\\\\.js$",\n "(^|/)tiny_mce([^.]*)\\\\.js$",\n "(^|/)tiny_mce/(langs|plugins|themes|utils)",\n "(^|/)ace-builds/",\n "(^|/)fontello(.*?)\\\\.css$",\n "(^|/)MathJax/",\n "(^|/)Chart\\\\.js$",\n "(^|/)[Cc]ode[Mm]irror/(\\\\d+\\\\.\\\\d+/)?(lib|mode|theme|addon|keymap|demo)",\n "(^|/)shBrush([^.]*)\\\\.js$",\n "(^|/)shCore\\\\.js$",\n "(^|/)shLegacy\\\\.js$",\n "(^|/)angular([^.]*)\\\\.js$",\n "(^|\\\\/)d3(\\\\.v\\\\d+)?([^.]*)\\\\.js$",\n "(^|/)react(-[^.]*)?\\\\.js$",\n "(^|/)flow-typed/.*\\\\.js$",\n "(^|/)modernizr\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)modernizr\\\\.custom\\\\.\\\\d+\\\\.js$",\n "(^|/)knockout-(\\\\d+\\\\.){3}(debug\\\\.)?js$",\n "(^|/)docs?/_?(build|themes?|templates?|static)/",\n "(^|/)admin_media/",\n "(^|/)env/",\n "(^|/)fabfile\\\\.py$",\n "(^|/)waf$",\n "(^|/)\\\\.osx$",\n "\\\\.xctemplate/",\n "\\\\.imageset/",\n "(^|/)Carthage/",\n "(^|/)Sparkle/",\n "(^|/)Crashlytics\\\\.framework/",\n "(^|/)Fabric\\\\.framework/",\n "(^|/)BuddyBuildSDK\\\\.framework/",\n "(^|/)Realm\\\\.framework",\n "(^|/)RealmSwift\\\\.framework",\n "(^|/)\\\\.gitattributes$",\n "(^|/)\\\\.gitignore$",\n "(^|/)\\\\.gitmodules$",\n "(^|/)gradlew$",\n "(^|/)gradlew\\\\.bat$",\n "(^|/)gradle/wrapper/",\n "(^|/)mvnw$",\n "(^|/)mvnw\\\\.cmd$",\n "(^|/)\\\\.mvn/wrapper/",\n "-vsdoc\\\\.js$",\n "\\\\.intellisense\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.validate(\\\\.unobtrusive)?\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.unobtrusive\\\\-ajax\\\\.js$",\n "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\\\.debug)?\\\\.js$",\n "(^|/)[Pp]ackages\\\\/.+\\\\.\\\\d+\\\\/",\n "(^|/)extjs/.*?\\\\.js$",\n "(^|/)extjs/.*?\\\\.xml$",\n "(^|/)extjs/.*?\\\\.txt$",\n "(^|/)extjs/.*?\\\\.html$",\n "(^|/)extjs/.*?\\\\.properties$",\n "(^|/)extjs/\\\\.sencha/",\n "(^|/)extjs/docs/",\n "(^|/)extjs/builds/",\n "(^|/)extjs/cmd/",\n "(^|/)extjs/examples/",\n "(^|/)extjs/locale/",\n "(^|/)extjs/packages/",\n "(^|/)extjs/plugins/",\n "(^|/)extjs/resources/",\n "(^|/)extjs/src/",\n "(^|/)extjs/welcome/",\n "(^|/)html5shiv\\\\.js$",\n "(^|/)[Tt]ests?/fixtures/",\n "(^|/)[Ss]pecs?/fixtures/",\n "(^|/)cordova([^.]*)\\\\.js$",\n "(^|/)cordova\\\\-\\\\d\\\\.\\\\d(\\\\.\\\\d)?\\\\.js$",\n "(^|/)foundation(\\\\..*)?\\\\.js$",\n "(^|/)Vagrantfile$",\n "(^|/)\\\\.[Dd][Ss]_[Ss]tore$",\n "(^|/)inst/extdata/",\n "(^|/)octicons\\\\.css",\n "(^|/)sprockets-octicons\\\\.scss",\n "(^|/)activator$",\n "(^|/)activator\\\\.bat$",\n "(^|/)proguard\\\\.pro$",\n "(^|/)proguard-rules\\\\.pro$",\n "(^|/)puphpet/",\n "(^|/)\\\\.google_apis/",\n "(^|/)Jenkinsfile$",\n "(^|/)\\\\.gitpod\\\\.Dockerfile$",\n "(^|/)\\\\.github/",\n "(^|/)\\\\.obsidian/",\n "(^|/)\\\\.teamcity/",\n "(^|/)xvba_modules/"\n ]\n}' OTHER_LANG = "Other" OTHER_COLOR = "#8b949e" @@ -587,7 +587,13 @@ def _frameworks_from_files(paths, read_file): if base.lower() in by_base: add(js_lang, fw) for base, fw, lang in FW_SENTINELS_OTHER: - if (base in paths) if "/" in base else (base.lower() in by_base): + if base.endswith("/"): # directory-prefix sentinel (e.g. .github/workflows/) + hit = any(p.startswith(base) for p in paths) + elif "/" in base: # exact sub-path + hit = base in paths + else: # basename + hit = base.lower() in by_base + if hit: add(lang, fw) groups = [] From 28214bcc026fe5644a9db8af8817447e4a1bcd51 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 22:28:25 +0100 Subject: [PATCH 13/14] Add --clone flag to repo-intel for bare-clone remote analysis Forces a bare git clone instead of the GitHub GraphQL API even when a token is present, unlocking per-author language churn the API can't provide. Also fixes the previously-broken no-token fallback path: collect_local crashed on bare repos via rev-parse --show-toplevel, and expected-failure git probes leaked stderr. --- src/repo-intel/repo-intel.py | 53 ++++++++++++++++++++++++++++-------- stow/bin/repo-intel | 53 ++++++++++++++++++++++++++++-------- 2 files changed, 82 insertions(+), 24 deletions(-) diff --git a/src/repo-intel/repo-intel.py b/src/repo-intel/repo-intel.py index 4585018..850d825 100755 --- a/src/repo-intel/repo-intel.py +++ b/src/repo-intel/repo-intel.py @@ -5,7 +5,7 @@ repo-intel — generate a contributor stats dashboard for a git repo. Usage: - repo-intel [N] [REPO] [-o PATH] [--no-open] + repo-intel [N] [REPO] [-o PATH] [--no-open] [--clone] repo-intel -h | --help Arguments: @@ -20,6 +20,9 @@ -o, --output PATH Write the dashboard to PATH instead of /tmp/--.html. --no-open Don't open the result in a browser. --no-cache Ignore the local cache and re-fetch all commits. + --clone For a remote REPO, analyse a bare `git clone` instead of + the GitHub GraphQL API (alias: --bare). Slower to fetch + but unlocks per-author language churn the API can't give. --commits SPEC Filter commits by position. SPEC is either N (last N commits, newest) or A-B (positions [A, B), 0-indexed from oldest, half-open like Python slicing). @@ -34,6 +37,7 @@ repo-intel 15 facebook/react # remote, top 15 repo-intel -o ./stats.html # write to a specific path repo-intel --no-open # generate without launching browser + repo-intel facebook/react --clone # analyse via bare clone, not the API repo-intel --commits 100 # only the last 100 commits repo-intel --commits 0-100 # the first 100 commits repo-intel --commits 400-800 # commits at positions 400..799 (oldest-first) @@ -45,7 +49,8 @@ recommended — when authenticated it unlocks GraphQL remote fetching and author hovercard enrichment (avatar, bio, follower counts). Lookup order: `gh auth token -h github.com`, then $GITHUB_TOKEN. - Falls back to `git clone --bare` into /tmp if neither is available. + Falls back to `git clone --bare` into /tmp if neither is available; + pass --clone to force that bare-clone path even when a token is present. Output: /tmp/--.html (or --output PATH), opened in default browser @@ -173,6 +178,7 @@ def parse_args(argv): sys.stdout.write(HELP) sys.exit(0) top_n, remote, output, no_open, no_cache = 10, None, None, False, False + clone = False commits_filter, since, until = None, None, None i = 0 @@ -198,6 +204,10 @@ def take_value(name): no_cache = True i += 1 continue + if tok in ("--clone", "--bare"): + clone = True + i += 1 + continue if tok == "-o": if i + 1 >= len(argv): sys.stderr.write("repo-intel: -o requires a value\n") @@ -253,7 +263,7 @@ def take_value(name): if since and until and since > until: sys.stderr.write(f"repo-intel: --since {since} is after --until {until}\n") sys.exit(2) - return top_n, remote, output, no_open, no_cache, commits_filter, since, until + return top_n, remote, output, no_open, no_cache, clone, commits_filter, since, until def login_from_email(email): @@ -454,8 +464,15 @@ def top_languages(langs, limit=6): return out -def git(*args, cwd=None): - return subprocess.check_output(["git", *args], text=True, cwd=cwd) +def git(*args, cwd=None, quiet=False): + # quiet=True hides git's stderr — for best-effort probes that are expected + # to fail (e.g. work-tree-only commands run against a bare clone). + return subprocess.check_output( + ["git", *args], + text=True, + cwd=cwd, + stderr=subprocess.DEVNULL if quiet else None, + ) def _git_show(path, cwd=None): @@ -708,7 +725,7 @@ def repo_disk_kb(cwd=None): def detect_default_branch(cwd=None): try: ref = git( - "symbolic-ref", "--short", "refs/remotes/origin/HEAD", cwd=cwd + "symbolic-ref", "--short", "refs/remotes/origin/HEAD", cwd=cwd, quiet=True ).strip() if ref.startswith("origin/"): return ref[len("origin/") :] @@ -754,7 +771,12 @@ def collect_local_tags(cwd=None): def collect_local(cwd=None, suppress_current_user=False): - repo_root = git("rev-parse", "--show-toplevel", cwd=cwd).strip() + try: + repo_root = git("rev-parse", "--show-toplevel", cwd=cwd, quiet=True).strip() + except subprocess.CalledProcessError: + # Bare clone (no work tree): --show-toplevel fails. Fall back to the + # repo directory name — overridden by the origin match below anyway. + repo_root = (cwd or os.getcwd()).rstrip("/") repo_name = os.path.basename(repo_root) github_base = "" try: @@ -1795,7 +1817,7 @@ def enrich_contributor_profiles(contributors, commits_meta, github_base, token=N def main(): - top_n, remote, output, no_open, no_cache, commits_filter, since, until = parse_args( + top_n, remote, output, no_open, no_cache, clone, commits_filter, since, until = parse_args( sys.argv[1:] ) @@ -1803,8 +1825,13 @@ def main(): if remote: owner, repo = remote.split("/", 1) token = get_github_token() + # --clone forces the bare-clone path even when a token is present: a + # local clone unlocks per-author language churn the GraphQL history API + # can't provide. The token (if any) is still used below for hovercard + # enrichment, so `use_graphql` — not `token` — gates the API path. + use_graphql = bool(token) and not clone - if not token: + if not use_graphql and not clone: print("No GitHub token — falling back to bare clone.", file=sys.stderr) # Subset prompt only in the GraphQL path: probing total via the API is @@ -1812,7 +1839,7 @@ def main(): # bare-clone path the full clone runs regardless, so the prompt would # only trim local display — pass `--commits` / `--since` for that. if ( - token + use_graphql and not (commits_filter or since or until) and sys.stdin.isatty() and sys.stderr.isatty() @@ -1822,8 +1849,10 @@ def main(): if total and total > 1000: commits_filter, since, until = prompt_subset(total) - if token: + if use_graphql: print(f"Fetching {remote} via GitHub GraphQL…", file=sys.stderr) + else: + print(f"Cloning {remote} (bare) for local analysis…", file=sys.stderr) ( repo_name, github_base, @@ -1838,7 +1867,7 @@ def main(): extras, ) = collect_remote( remote, - token, + token if use_graphql else None, no_cache=no_cache, commits_filter=commits_filter, since=since, diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 1918654..4b4cb20 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -5,7 +5,7 @@ HELP = """\ repo-intel — generate a contributor stats dashboard for a git repo. Usage: - repo-intel [N] [REPO] [-o PATH] [--no-open] + repo-intel [N] [REPO] [-o PATH] [--no-open] [--clone] repo-intel -h | --help Arguments: @@ -20,6 +20,9 @@ Options: -o, --output PATH Write the dashboard to PATH instead of /tmp/--.html. --no-open Don't open the result in a browser. --no-cache Ignore the local cache and re-fetch all commits. + --clone For a remote REPO, analyse a bare `git clone` instead of + the GitHub GraphQL API (alias: --bare). Slower to fetch + but unlocks per-author language churn the API can't give. --commits SPEC Filter commits by position. SPEC is either N (last N commits, newest) or A-B (positions [A, B), 0-indexed from oldest, half-open like Python slicing). @@ -34,6 +37,7 @@ Examples: repo-intel 15 facebook/react # remote, top 15 repo-intel -o ./stats.html # write to a specific path repo-intel --no-open # generate without launching browser + repo-intel facebook/react --clone # analyse via bare clone, not the API repo-intel --commits 100 # only the last 100 commits repo-intel --commits 0-100 # the first 100 commits repo-intel --commits 400-800 # commits at positions 400..799 (oldest-first) @@ -45,7 +49,8 @@ Remote auth: recommended — when authenticated it unlocks GraphQL remote fetching and author hovercard enrichment (avatar, bio, follower counts). Lookup order: `gh auth token -h github.com`, then $GITHUB_TOKEN. - Falls back to `git clone --bare` into /tmp if neither is available. + Falls back to `git clone --bare` into /tmp if neither is available; + pass --clone to force that bare-clone path even when a token is present. Output: /tmp/--.html (or --output PATH), opened in default browser @@ -173,6 +178,7 @@ def parse_args(argv): sys.stdout.write(HELP) sys.exit(0) top_n, remote, output, no_open, no_cache = 10, None, None, False, False + clone = False commits_filter, since, until = None, None, None i = 0 @@ -198,6 +204,10 @@ def parse_args(argv): no_cache = True i += 1 continue + if tok in ("--clone", "--bare"): + clone = True + i += 1 + continue if tok == "-o": if i + 1 >= len(argv): sys.stderr.write("repo-intel: -o requires a value\n") @@ -253,7 +263,7 @@ def parse_args(argv): if since and until and since > until: sys.stderr.write(f"repo-intel: --since {since} is after --until {until}\n") sys.exit(2) - return top_n, remote, output, no_open, no_cache, commits_filter, since, until + return top_n, remote, output, no_open, no_cache, clone, commits_filter, since, until def login_from_email(email): @@ -454,8 +464,15 @@ def top_languages(langs, limit=6): return out -def git(*args, cwd=None): - return subprocess.check_output(["git", *args], text=True, cwd=cwd) +def git(*args, cwd=None, quiet=False): + # quiet=True hides git's stderr — for best-effort probes that are expected + # to fail (e.g. work-tree-only commands run against a bare clone). + return subprocess.check_output( + ["git", *args], + text=True, + cwd=cwd, + stderr=subprocess.DEVNULL if quiet else None, + ) def _git_show(path, cwd=None): @@ -708,7 +725,7 @@ def repo_disk_kb(cwd=None): def detect_default_branch(cwd=None): try: ref = git( - "symbolic-ref", "--short", "refs/remotes/origin/HEAD", cwd=cwd + "symbolic-ref", "--short", "refs/remotes/origin/HEAD", cwd=cwd, quiet=True ).strip() if ref.startswith("origin/"): return ref[len("origin/") :] @@ -754,7 +771,12 @@ def collect_local_tags(cwd=None): def collect_local(cwd=None, suppress_current_user=False): - repo_root = git("rev-parse", "--show-toplevel", cwd=cwd).strip() + try: + repo_root = git("rev-parse", "--show-toplevel", cwd=cwd, quiet=True).strip() + except subprocess.CalledProcessError: + # Bare clone (no work tree): --show-toplevel fails. Fall back to the + # repo directory name — overridden by the origin match below anyway. + repo_root = (cwd or os.getcwd()).rstrip("/") repo_name = os.path.basename(repo_root) github_base = "" try: @@ -1795,7 +1817,7 @@ def enrich_contributor_profiles(contributors, commits_meta, github_base, token=N def main(): - top_n, remote, output, no_open, no_cache, commits_filter, since, until = parse_args( + top_n, remote, output, no_open, no_cache, clone, commits_filter, since, until = parse_args( sys.argv[1:] ) @@ -1803,8 +1825,13 @@ def main(): if remote: owner, repo = remote.split("/", 1) token = get_github_token() + # --clone forces the bare-clone path even when a token is present: a + # local clone unlocks per-author language churn the GraphQL history API + # can't provide. The token (if any) is still used below for hovercard + # enrichment, so `use_graphql` — not `token` — gates the API path. + use_graphql = bool(token) and not clone - if not token: + if not use_graphql and not clone: print("No GitHub token — falling back to bare clone.", file=sys.stderr) # Subset prompt only in the GraphQL path: probing total via the API is @@ -1812,7 +1839,7 @@ def main(): # bare-clone path the full clone runs regardless, so the prompt would # only trim local display — pass `--commits` / `--since` for that. if ( - token + use_graphql and not (commits_filter or since or until) and sys.stdin.isatty() and sys.stderr.isatty() @@ -1822,8 +1849,10 @@ def main(): if total and total > 1000: commits_filter, since, until = prompt_subset(total) - if token: + if use_graphql: print(f"Fetching {remote} via GitHub GraphQL…", file=sys.stderr) + else: + print(f"Cloning {remote} (bare) for local analysis…", file=sys.stderr) ( repo_name, github_base, @@ -1838,7 +1867,7 @@ def main(): extras, ) = collect_remote( remote, - token, + token if use_graphql else None, no_cache=no_cache, commits_filter=commits_filter, since=since, From 34d8cb75a37cfb74632dcead8a340415005ff3d3 Mon Sep 17 00:00:00 2001 From: Tyom Semonov Date: Thu, 21 May 2026 22:52:33 +0100 Subject: [PATCH 14/14] Stop classifying .txt as Adblock Filter List in repo-intel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The canonical Linguist owner of .txt is the colorless 'Text' language, which the table builder drops — letting a niche colored claimant (Adblock Filter List, type=data) win the extension. LICENSE.txt and friends were mislabeled on the local/clone path. Add an EXT_EXCLUDE set so generic 'Text' extensions stay unassigned and fall into 'Other', matching GitHub. --- src/repo-intel/gen_techdata.py | 9 +++++++++ src/repo-intel/techdata.json | 1 - stow/bin/repo-intel | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/repo-intel/gen_techdata.py b/src/repo-intel/gen_techdata.py index 6a1e7ce..439bd28 100644 --- a/src/repo-intel/gen_techdata.py +++ b/src/repo-intel/gen_techdata.py @@ -43,6 +43,13 @@ "ts": "TypeScript", "rs": "Rust", "cs": "C#", "sql": "SQL", } +# Generic extensions whose canonical Linguist owner is the colorless "Text" +# language. Because color-less languages are dropped from the tables, a niche +# *colored* claimant would otherwise win the slot (e.g. `.txt` → "Adblock Filter +# List") — Linguist itself resolves these via a content classifier we can't run, +# so we leave them unassigned and let classify_path bucket them as "Other". +EXT_EXCLUDE = {"txt"} + # Curated web/npm dependency → framework display name. Vercel/Netlify answer a # different question (deploy presets), so this is maintained directly. CURATED_WEB = { @@ -250,6 +257,8 @@ def build_language_tables(langs): for ext, lang in EXT_OVERRIDE.items(): if lang in name_color: ext_lang[ext] = lang + for ext in EXT_EXCLUDE: + ext_lang.pop(ext, None) name_color.update(SYNTHETIC_COLORS) # synthetic buckets Linguist doesn't color return name_color, ext_lang, filename_lang diff --git a/src/repo-intel/techdata.json b/src/repo-intel/techdata.json index 9cb3d20..5eba008 100644 --- a/src/repo-intel/techdata.json +++ b/src/repo-intel/techdata.json @@ -2094,7 +2094,6 @@ "tu": "Turing", "twig": "Twig", "txl": "TXL", - "txt": "Adblock Filter List", "txx": "C++", "typ": "Typst", "uc": "UnrealScript", diff --git a/stow/bin/repo-intel b/stow/bin/repo-intel index 4b4cb20..dad1785 100755 --- a/stow/bin/repo-intel +++ b/stow/bin/repo-intel @@ -291,7 +291,7 @@ def iso_week_label(dt): # build.py inlines the JSON here; when unbuilt we read the sibling file. Used # only on the local + bare-clone paths — the GraphQL remote path lacks per-file # data, so these maps go unused there. -TECHDATA = '{\n "_source": {\n "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml",\n "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml"\n },\n "fw_deps": {\n "Go": {\n "github.com/gin-gonic/gin": "Gin",\n "github.com/go-chi/chi": "chi",\n "github.com/gofiber/fiber": "Fiber",\n "github.com/gorilla/mux": "Gorilla",\n "github.com/labstack/echo": "Echo",\n "github.com/spf13/cobra": "Cobra",\n "google.golang.org/grpc": "gRPC",\n "gorm.io/gorm": "GORM"\n },\n "PHP": {\n "cakephp/cakephp": "CakePHP",\n "laravel/framework": "Laravel",\n "slim/slim": "Slim",\n "symfony/framework-bundle": "Symfony",\n "symfony/symfony": "Symfony",\n "yiisoft/yii2": "Yii"\n },\n "Python": {\n "aiohttp": "aiohttp",\n "celery": "Celery",\n "click": "Click",\n "django": "Django",\n "djangorestframework": "Django REST",\n "fastapi": "FastAPI",\n "flask": "Flask",\n "httpx": "HTTPX",\n "keras": "Keras",\n "matplotlib": "Matplotlib",\n "numpy": "NumPy",\n "pandas": "pandas",\n "pydantic": "Pydantic",\n "pyramid": "Pyramid",\n "pytest": "pytest",\n "requests": "Requests",\n "sanic": "Sanic",\n "scikit-learn": "scikit-learn",\n "scipy": "SciPy",\n "scrapy": "Scrapy",\n "sqlalchemy": "SQLAlchemy",\n "starlette": "Starlette",\n "tensorflow": "TensorFlow",\n "torch": "PyTorch",\n "tornado": "Tornado",\n "transformers": "Transformers",\n "typer": "Typer"\n },\n "Ruby": {\n "devise": "Devise",\n "hanami": "Hanami",\n "puma": "Puma",\n "rails": "Rails",\n "rspec": "RSpec",\n "sidekiq": "Sidekiq",\n "sinatra": "Sinatra"\n },\n "Rust": {\n "actix-web": "Actix Web",\n "axum": "Axum",\n "bevy": "Bevy",\n "clap": "clap",\n "diesel": "Diesel",\n "rocket": "Rocket",\n "serde": "Serde",\n "tauri": "Tauri",\n "tokio": "Tokio",\n "tonic": "Tonic",\n "warp": "warp"\n },\n "npm": {\n "@angular/core": "Angular",\n "@apollo/client": "Apollo",\n "@babel/core": "Babel",\n "@biomejs/biome": "Biome",\n "@chakra-ui/react": "Chakra UI",\n "@hapi/hapi": "hapi",\n "@ionic/core": "Ionic",\n "@mui/material": "MUI",\n "@nestjs/core": "NestJS",\n "@nx/workspace": "Nx",\n "@playwright/test": "Playwright",\n "@prisma/client": "Prisma",\n "@reduxjs/toolkit": "Redux",\n "@remix-run/react": "Remix",\n "@storybook/angular": "Storybook",\n "@storybook/html": "Storybook",\n "@storybook/preact": "Storybook",\n "@storybook/react": "Storybook",\n "@storybook/svelte": "Storybook",\n "@storybook/vue3": "Storybook",\n "@storybook/web-components": "Storybook",\n "@sveltejs/kit": "SvelteKit",\n "@swc/core": "SWC",\n "@testing-library/dom": "Testing Library",\n "@testing-library/react": "Testing Library",\n "@testing-library/vue": "Testing Library",\n "@trpc/client": "tRPC",\n "@trpc/server": "tRPC",\n "astro": "Astro",\n "bootstrap": "Bootstrap",\n "chart.js": "Chart.js",\n "cypress": "Cypress",\n "d3": "D3",\n "drizzle-orm": "Drizzle",\n "electron": "Electron",\n "esbuild": "esbuild",\n "eslint": "ESLint",\n "expo": "Expo",\n "express": "Express",\n "fastify": "Fastify",\n "gatsby": "Gatsby",\n "graphql": "GraphQL",\n "jest": "Jest",\n "koa": "Koa",\n "mocha": "Mocha",\n "mongoose": "Mongoose",\n "next": "Next.js",\n "nuxt": "Nuxt",\n "nx": "Nx",\n "parcel": "Parcel",\n "playwright": "Playwright",\n "preact": "Preact",\n "prettier": "Prettier",\n "prisma": "Prisma",\n "puppeteer": "Puppeteer",\n "react": "React",\n "react-dom": "React",\n "react-native": "React Native",\n "redux": "Redux",\n "rollup": "Rollup",\n "sequelize": "Sequelize",\n "solid-js": "SolidJS",\n "storybook": "Storybook",\n "styled-components": "styled-components",\n "svelte": "Svelte",\n "tailwindcss": "Tailwind CSS",\n "testcafe": "TestCafe",\n "three": "three.js",\n "turbo": "Turborepo",\n "typeorm": "TypeORM",\n "vite": "Vite",\n "vitest": "Vitest",\n "vue": "Vue",\n "webpack": "webpack",\n "zustand": "Zustand"\n }\n },\n "fw_sentinels_js": [\n [\n "next.config.js",\n "Next.js"\n ],\n [\n "next.config.ts",\n "Next.js"\n ],\n [\n "next.config.mjs",\n "Next.js"\n ],\n [\n "nuxt.config.js",\n "Nuxt"\n ],\n [\n "nuxt.config.ts",\n "Nuxt"\n ],\n [\n "svelte.config.js",\n "Svelte"\n ],\n [\n "astro.config.mjs",\n "Astro"\n ],\n [\n "vue.config.js",\n "Vue"\n ],\n [\n "gatsby-config.js",\n "Gatsby"\n ],\n [\n "angular.json",\n "Angular"\n ]\n ],\n "fw_sentinels_other": [\n [\n "manage.py",\n "Django",\n "Python"\n ],\n [\n "artisan",\n "Laravel",\n "PHP"\n ],\n [\n "config/application.rb",\n "Rails",\n "Ruby"\n ],\n [\n "Dockerfile",\n "Docker",\n "Tools"\n ],\n [\n "docker-compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "docker-compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "Makefile",\n "Make",\n "Tools"\n ],\n [\n "GNUmakefile",\n "Make",\n "Tools"\n ],\n [\n "pnpm-lock.yaml",\n "pnpm",\n "Tools"\n ],\n [\n "yarn.lock",\n "Yarn",\n "Tools"\n ],\n [\n "bun.lockb",\n "Bun",\n "Tools"\n ],\n [\n "bun.lock",\n "Bun",\n "Tools"\n ],\n [\n ".gitlab-ci.yml",\n "GitLab CI",\n "Tools"\n ],\n [\n "vercel.json",\n "Vercel",\n "Tools"\n ],\n [\n "netlify.toml",\n "Netlify",\n "Tools"\n ],\n [\n ".github/workflows/",\n "GitHub Actions",\n "Tools"\n ]\n ],\n "lang": {\n "color": {\n "1C Enterprise": "#814CCC",\n "2-Dimensional Array": "#38761D",\n "4D": "#004289",\n "ABAP": "#E8274B",\n "ABAP CDS": "#555e25",\n "AGS Script": "#B9D9FF",\n "AIDL": "#34EB6B",\n "AL": "#3AA2B5",\n "ALGOL": "#D1E0DB",\n "AMPL": "#E6EFBB",\n "ANTLR": "#9DC3FF",\n "API Blueprint": "#2ACCA8",\n "APL": "#5A8164",\n "ASP.NET": "#9400ff",\n "ATS": "#1ac620",\n "ActionScript": "#882B0F",\n "Ada": "#02f88c",\n "Adblock Filter List": "#800000",\n "Adobe Font Metrics": "#fa0f00",\n "Agda": "#315665",\n "Aiken": "#640ff8",\n "Alloy": "#64C800",\n "Alpine Abuild": "#0D597F",\n "Altium Designer": "#A89663",\n "AngelScript": "#C7D7DC",\n "Answer Set Programming": "#A9CC29",\n "Ant Build System": "#A9157E",\n "Antlers": "#ff269e",\n "ApacheConf": "#d12127",\n "Apex": "#1797c0",\n "Apollo Guidance Computer": "#0B3D91",\n "AppleScript": "#101F1F",\n "Arc": "#aa2afe",\n "AsciiDoc": "#73a0c5",\n "AspectJ": "#a957b0",\n "Assembly": "#6E4C13",\n "Astro": "#ff5a03",\n "Asymptote": "#ff0000",\n "Augeas": "#9CC134",\n "AutoHotkey": "#6594b9",\n "AutoIt": "#1C3552",\n "Avro IDL": "#0040FF",\n "Awk": "#c30e9b",\n "B (Formal Method)": "#8aa8c5",\n "B4X": "#00e4ff",\n "BASIC": "#ff0000",\n "BQN": "#2b7067",\n "Ballerina": "#FF5000",\n "Batchfile": "#C1F12E",\n "Beef": "#a52f4e",\n "Berry": "#15A13C",\n "BibTeX": "#778899",\n "Bicep": "#519aba",\n "Bikeshed": "#5562ac",\n "Bison": "#6A463F",\n "BitBake": "#00bce4",\n "Blade": "#f7523f",\n "BlitzBasic": "#00FFAE",\n "BlitzMax": "#cd6400",\n "Bluespec": "#12223c",\n "Bluespec BH": "#12223c",\n "Boo": "#d4bec1",\n "Boogie": "#c80fa0",\n "Brainfuck": "#2F2530",\n "BrighterScript": "#66AABB",\n "Brightscript": "#662D91",\n "Browserslist": "#ffd539",\n "Bru": "#F4AA41",\n "BuildStream": "#006bff",\n "C": "#555555",\n "C#": "#178600",\n "C++": "#f34b7d",\n "C3": "#2563eb",\n "CAP CDS": "#0092d1",\n "CLIPS": "#00A300",\n "CMake": "#DA3434",\n "COLLADA": "#F1A42B",\n "CQL": "#006091",\n "CSON": "#244776",\n "CSS": "#663399",\n "CSV": "#237346",\n "CUE": "#5886E1",\n "CWeb": "#00007a",\n "Cabal Config": "#483465",\n "Caddyfile": "#22b638",\n "Cadence": "#00ef8b",\n "Cairo": "#ff4a48",\n "Cairo Zero": "#ff4a48",\n "CameLIGO": "#3be133",\n "Cangjie": "#00868B",\n "Cap\'n Proto": "#c42727",\n "Carbon": "#222222",\n "Ceylon": "#dfa535",\n "Chapel": "#8dc63f",\n "ChucK": "#3f8000",\n "Circom": "#707575",\n "Cirru": "#ccccff",\n "Clarion": "#db901e",\n "Clarity": "#5546ff",\n "Classic ASP": "#6a40fd",\n "Clean": "#3F85AF",\n "Click": "#E4E6F3",\n "Clojure": "#db5855",\n "Closure Templates": "#0d948f",\n "Cloud Firestore Security Rules": "#FFA000",\n "Clue": "#0009b5",\n "CodeQL": "#140f46",\n "CoffeeScript": "#244776",\n "ColdFusion": "#ed2cd6",\n "ColdFusion CFC": "#ed2cd6",\n "Common Lisp": "#3fb68b",\n "Common Workflow Language": "#B5314C",\n "Component Pascal": "#B0CE4E",\n "Cooklang": "#E15A29",\n "Crystal": "#000100",\n "Csound": "#1a1a1a",\n "Csound Document": "#1a1a1a",\n "Csound Score": "#1a1a1a",\n "Cuda": "#3A4E3A",\n "Curry": "#531242",\n "Cylc": "#00b3fd",\n "Cypher": "#34c0eb",\n "Cython": "#fedf5b",\n "D": "#ba595e",\n "D2": "#526ee8",\n "DM": "#447265",\n "Dafny": "#FFEC25",\n "Darcs Patch": "#8eff23",\n "Dart": "#00B4AB",\n "Daslang": "#d3d3d3",\n "DataWeave": "#003a52",\n "Debian Package Control File": "#D70751",\n "DenizenScript": "#FBEE96",\n "Dhall": "#dfafff",\n "DirectX 3D File": "#aace60",\n "Dockerfile": "#384d54",\n "Dogescript": "#cca760",\n "Dotenv": "#e5d559",\n "Dune": "#89421e",\n "Dylan": "#6c616e",\n "E": "#ccce35",\n "ECL": "#8a1267",\n "ECLiPSe": "#001d9d",\n "EJS": "#a91e50",\n "EQ": "#a78649",\n "Earthly": "#2af0ff",\n "Easybuild": "#069406",\n "Ecere Projects": "#913960",\n "Ecmarkup": "#eb8131",\n "Edge": "#0dffe0",\n "EdgeQL": "#31A7FF",\n "EditorConfig": "#fff1f2",\n "Eiffel": "#4d6977",\n "Elixir": "#6e4a7e",\n "Elm": "#60B5CC",\n "Elvish": "#55BB55",\n "Elvish Transcript": "#55BB55",\n "Emacs Lisp": "#c065db",\n "EmberScript": "#FFF4F3",\n "Erlang": "#B83998",\n "Euphoria": "#FF790B",\n "F#": "#b845fc",\n "F*": "#572e30",\n "FIGlet Font": "#FFDDBB",\n "FIRRTL": "#2f632f",\n "FLUX": "#88ccff",\n "Factor": "#636746",\n "Fancy": "#7b9db4",\n "Fantom": "#14253c",\n "Faust": "#c37240",\n "Fennel": "#fff3d7",\n "Filebench WML": "#F6B900",\n "FlatBuffers": "#ed284a",\n "Flix": "#d44a45",\n "Fluent": "#ffcc33",\n "Forth": "#341708",\n "Fortran": "#4d41b1",\n "Fortran Free Form": "#4d41b1",\n "FreeBASIC": "#141AC9",\n "FreeMarker": "#0050b2",\n "Frege": "#00cafe",\n "Futhark": "#5f021f",\n "G-code": "#D08CF2",\n "GAML": "#FFC766",\n "GAMS": "#f49a22",\n "GAP": "#0000cc",\n "GCC Machine Description": "#FFCFAB",\n "GDScript": "#355570",\n "GDShader": "#478CBF",\n "GEDCOM": "#003058",\n "GLSL": "#5686a5",\n "GSC": "#FF6800",\n "Game Maker Language": "#71b417",\n "Gemfile.lock": "#701516",\n "Gemini": "#ff6900",\n "Genero 4gl": "#63408e",\n "Genero per": "#d8df39",\n "Genie": "#fb855d",\n "Genshi": "#951531",\n "Gentoo Ebuild": "#9400ff",\n "Gentoo Eclass": "#9400ff",\n "Gerber Image": "#d20b00",\n "Gherkin": "#5B2063",\n "Git Attributes": "#F44D27",\n "Git Commit": "#F44D27",\n "Git Config": "#F44D27",\n "Git Revision List": "#F44D27",\n "Gleam": "#ffaff3",\n "Glimmer JS": "#F5835F",\n "Glimmer TS": "#3178c6",\n "Glyph": "#c1ac7f",\n "Gnuplot": "#f0a9f0",\n "Go": "#00ADD8",\n "Go Checksums": "#00ADD8",\n "Go Module": "#00ADD8",\n "Go Template": "#00ADD8",\n "Go Workspace": "#00ADD8",\n "Godot Resource": "#355570",\n "Golo": "#88562A",\n "Gosu": "#82937f",\n "Grace": "#615f8b",\n "Gradle": "#02303a",\n "Gradle Kotlin DSL": "#02303a",\n "Grammatical Framework": "#ff0000",\n "GraphQL": "#e10098",\n "Graphviz (DOT)": "#2596be",\n "Groovy": "#4298b8",\n "Groovy Server Pages": "#4298b8",\n "HAProxy": "#106da9",\n "HCL": "#844FBA",\n "HIP": "#4F3A4F",\n "HLSL": "#aace60",\n "HOCON": "#9ff8ee",\n "HTML": "#e34c26",\n "HTML+ECR": "#2e1052",\n "HTML+EEX": "#6e4a7e",\n "HTML+ERB": "#701516",\n "HTML+PHP": "#4f5d95",\n "HTML+Razor": "#512be4",\n "HTTP": "#005C9C",\n "HXML": "#f68712",\n "Hack": "#878787",\n "Haml": "#ece2a9",\n "Handlebars": "#f7931e",\n "Harbour": "#0e60e3",\n "Hare": "#9d7424",\n "Haskell": "#5e5086",\n "Haxe": "#df7900",\n "HiveQL": "#dce200",\n "HolyC": "#ffefaf",\n "Hosts File": "#308888",\n "Hurl": "#FF0288",\n "Hy": "#7790B2",\n "IDL": "#a3522f",\n "IGOR Pro": "#0000cc",\n "IL Assembly": "#512BD4",\n "INI": "#d1dbe0",\n "ISPC": "#2D68B1",\n "Idris": "#b30000",\n "Ignore List": "#000000",\n "ImageJ Macro": "#99AAFF",\n "Imba": "#16cec6",\n "Inno Setup": "#264b99",\n "Io": "#a9188d",\n "Ioke": "#078193",\n "Isabelle": "#FEFE00",\n "Isabelle ROOT": "#FEFE00",\n "J": "#9EEDFF",\n "JAR Manifest": "#b07219",\n "JCL": "#d90e09",\n "JFlex": "#DBCA00",\n "JSON": "#292929",\n "JSON with Comments": "#292929",\n "JSON5": "#267CB9",\n "JSONLD": "#0c479c",\n "JSONiq": "#40d47e",\n "Jac": "#FC792D",\n "Jai": "#ab8b4b",\n "Janet": "#0886a5",\n "Jasmin": "#d03600",\n "Java": "#b07219",\n "Java Properties": "#2A6277",\n "Java Server Pages": "#2A6277",\n "Java Template Engine": "#2A6277",\n "JavaScript": "#f1e05a",\n "JavaScript+ERB": "#f1e05a",\n "Jest Snapshot": "#15c213",\n "JetBrains MPS": "#21D789",\n "Jinja": "#a52a22",\n "Jison": "#56b3cb",\n "Jison Lex": "#56b3cb",\n "Jolie": "#843179",\n "Jsonnet": "#0064bd",\n "Julia": "#a270ba",\n "Julia REPL": "#a270ba",\n "Jupyter Notebook": "#DA5B0B",\n "Just": "#384d54",\n "KCL": "#7ABABF",\n "KDL": "#ffb3b3",\n "KFramework": "#4195c5",\n "KRL": "#28430A",\n "Kaitai Struct": "#773b37",\n "KakouneScript": "#6f8042",\n "KerboScript": "#41adf0",\n "KiCad Layout": "#2f4aab",\n "KiCad Legacy Layout": "#2f4aab",\n "KiCad Schematic": "#2f4aab",\n "KoLmafia ASH": "#B9D9B9",\n "Koka": "#215166",\n "Kotlin": "#A97BFF",\n "LFE": "#4C3023",\n "LLVM": "#185619",\n "LOLCODE": "#cc9900",\n "LSL": "#3d9970",\n "LabVIEW": "#fede06",\n "Lambdapi": "#8027a3",\n "Langium": "#2c8c87",\n "Lark": "#2980B9",\n "Lasso": "#999999",\n "Latte": "#f2a542",\n "Leo": "#C4FFC2",\n "Less": "#1d365d",\n "Lex": "#DBCA00",\n "LigoLANG": "#0e74ff",\n "LilyPond": "#9ccc7c",\n "Liquid": "#67b8de",\n "Liquidsoap": "#990066",\n "Literate Agda": "#315665",\n "Literate CoffeeScript": "#244776",\n "Literate Haskell": "#5e5086",\n "LiveCode Script": "#0c5ba5",\n "LiveScript": "#499886",\n "Logtalk": "#295b9a",\n "LookML": "#652B81",\n "Lua": "#000080",\n "Luau": "#00A2FF",\n "M3U": "#179C7D",\n "MATLAB": "#e16737",\n "MAXScript": "#00a6a6",\n "MDX": "#fcb32c",\n "MLIR": "#5EC8DB",\n "MQL4": "#62A8D6",\n "MQL5": "#4A76B8",\n "MTML": "#b7e1f4",\n "Macaulay2": "#d8ffff",\n "Makefile": "#427819",\n "Mako": "#7e858d",\n "Markdown": "#083fa1",\n "Marko": "#42bff2",\n "Mask": "#f97732",\n "Mathematical Programming System": "#0530ad",\n "Max": "#c4a79c",\n "MeTTa": "#6a5acd",\n "Mercury": "#ff2b2b",\n "Mermaid": "#ff3670",\n "Meson": "#007800",\n "Metal": "#8f14e9",\n "MiniYAML": "#ff1111",\n "MiniZinc": "#06a9e6",\n "Mint": "#02b046",\n "Mirah": "#c7a938",\n "Modelica": "#de1d31",\n "Modula-2": "#10253f",\n "Modula-3": "#223388",\n "Mojo": "#ff4c1f",\n "Monkey C": "#8D6747",\n "MoonBit": "#b92381",\n "MoonScript": "#ff4585",\n "Motoko": "#fbb03b",\n "Motorola 68K Assembly": "#005daa",\n "Move": "#4a137a",\n "Mustache": "#724b3b",\n "NCL": "#28431f",\n "NMODL": "#00356B",\n "NPM Config": "#cb3837",\n "NWScript": "#111522",\n "Nasal": "#1d2c4e",\n "Nearley": "#990000",\n "Nemerle": "#3d3c6e",\n "NetLinx": "#0aa0ff",\n "NetLinx+ERB": "#747faa",\n "NetLogo": "#ff6375",\n "NewLisp": "#87AED7",\n "Nextflow": "#3ac486",\n "Nginx": "#009639",\n "Nickel": "#E0C3FC",\n "Nim": "#ffc200",\n "Nit": "#009917",\n "Nix": "#7e7eff",\n "Noir": "#2f1f49",\n "Nu": "#c9df40",\n "NumPy": "#9C8AF9",\n "Nunjucks": "#3d8137",\n "Nushell": "#4E9906",\n "OASv2-json": "#85ea2d",\n "OASv2-yaml": "#85ea2d",\n "OASv3-json": "#85ea2d",\n "OASv3-yaml": "#85ea2d",\n "OCaml": "#ef7a08",\n "OMNeT++ MSG": "#a0e0a0",\n "OMNeT++ NED": "#08607c",\n "ObjectScript": "#424893",\n "Objective-C": "#438eff",\n "Objective-C++": "#6866fb",\n "Objective-J": "#ff0c5a",\n "Odin": "#60AFFE",\n "Omgrofl": "#cabbff",\n "Opal": "#f7ede0",\n "Open Policy Agent": "#7d9199",\n "OpenAPI Specification v2": "#85ea2d",\n "OpenAPI Specification v3": "#85ea2d",\n "OpenCL": "#ed2e2d",\n "OpenEdge ABL": "#5ce600",\n "OpenQASM": "#AA70FF",\n "OpenSCAD": "#e5cd45",\n "Option List": "#476732",\n "Org": "#77aa99",\n "OverpassQL": "#cce2aa",\n "Oxygene": "#cdd0e3",\n "Oz": "#fab738",\n "P4": "#7055b5",\n "PDDL": "#0d00ff",\n "PEG.js": "#234d6b",\n "PHP": "#4F5D95",\n "PLSQL": "#dad8d8",\n "PLpgSQL": "#336790",\n "POV-Ray SDL": "#6bac65",\n "Pact": "#F7A8B8",\n "Pan": "#cc0000",\n "Papyrus": "#6600cc",\n "Parrot": "#f3ca0a",\n "Pascal": "#E3F171",\n "Pawn": "#dbb284",\n "Pep8": "#C76F5B",\n "Perl": "#0298c3",\n "PicoLisp": "#6067af",\n "PigLatin": "#fcd7de",\n "Pike": "#005390",\n "Pip Requirements": "#FFD343",\n "Pkl": "#6b9543",\n "PlantUML": "#fbbd16",\n "PogoScript": "#d80074",\n "Polar": "#ae81ff",\n "Portugol": "#f8bd00",\n "PostCSS": "#dc3a0c",\n "PostScript": "#da291c",\n "PowerBuilder": "#8f0f8d",\n "PowerShell": "#012456",\n "Praat": "#c8506d",\n "Prisma": "#0c344b",\n "Processing": "#0096D8",\n "Procfile": "#3B2F63",\n "Prolog": "#74283c",\n "Promela": "#de0000",\n "Propeller Spin": "#7fa2a7",\n "Pug": "#a86454",\n "Puppet": "#302B6D",\n "PureBasic": "#5a6986",\n "PureScript": "#1D222D",\n "Pyret": "#ee1e10",\n "Python": "#3572A5",\n "Python console": "#3572A5",\n "Python traceback": "#3572A5",\n "Q#": "#fed659",\n "QML": "#44a51c",\n "Qt Script": "#00b841",\n "Quake": "#882233",\n "QuakeC": "#975777",\n "QuickBASIC": "#008080",\n "Quint": "#9d6ce5",\n "R": "#198CE7",\n "RAML": "#77d9fb",\n "RAScript": "#2C97FA",\n "RBS": "#701516",\n "RDoc": "#701516",\n "REXX": "#d90e09",\n "RMarkdown": "#198ce7",\n "RON": "#a62c00",\n "ROS Interface": "#22314e",\n "RPGLE": "#2BDE21",\n "RUNOFF": "#665a4e",\n "Racket": "#3c5caa",\n "Ragel": "#9d5200",\n "Raku": "#0000fb",\n "Rascal": "#fffaa0",\n "ReScript": "#ed5051",\n "Reason": "#ff5847",\n "ReasonLIGO": "#ff5847",\n "Rebol": "#358a5b",\n "Record Jar": "#0673ba",\n "Red": "#f50000",\n "Regular Expression": "#009a00",\n "Ren\'Py": "#ff7f7f",\n "Rez": "#FFDAB3",\n "Ring": "#2D54CB",\n "Riot": "#A71E49",\n "RobotFramework": "#00c0b5",\n "Roc": "#7c38f5",\n "Rocq Prover": "#d0b68c",\n "Roff": "#ecdebe",\n "Roff Manpage": "#ecdebe",\n "Rouge": "#cc0088",\n "RouterOS Script": "#DE3941",\n "Ruby": "#701516",\n "Rust": "#dea584",\n "SAS": "#B34936",\n "SCSS": "#c6538c",\n "SPARQL": "#0C4597",\n "SQF": "#3F3F3F",\n "SQL": "#e38c00",\n "SQLPL": "#e38c00",\n "SRecode Template": "#348a34",\n "STL": "#373b5e",\n "SVG": "#ff9900",\n "Sail": "#259dd5",\n "SaltStack": "#646464",\n "Sass": "#a53b70",\n "Scala": "#c22d40",\n "Scaml": "#bd181a",\n "Scenic": "#fdc700",\n "Scheme": "#1e4aec",\n "Scilab": "#ca0f21",\n "Self": "#0579aa",\n "ShaderLab": "#222c37",\n "Shell": "#89e051",\n "ShellCheck Config": "#cecfcb",\n "Shen": "#120F14",\n "Simple File Verification": "#C9BFED",\n "Singularity": "#64E6AD",\n "Slang": "#1fbec9",\n "Slash": "#007eff",\n "Slice": "#003fa2",\n "Slim": "#2b2b2b",\n "Slint": "#2379F4",\n "SmPL": "#c94949",\n "Smalltalk": "#596706",\n "Smarty": "#f0c040",\n "Smithy": "#c44536",\n "Snakemake": "#419179",\n "Solidity": "#AA6746",\n "SourcePawn": "#f69e1d",\n "SpiceDB Schema": "#a5318a",\n "Squirrel": "#800000",\n "Stan": "#b2011d",\n "Standard ML": "#dc566d",\n "Starlark": "#76d275",\n "Stata": "#1a5f91",\n "StringTemplate": "#3fb34f",\n "Stylus": "#ff6347",\n "SubRip Text": "#9e0101",\n "SugarSS": "#2fcc9f",\n "SuperCollider": "#46390b",\n "SurrealQL": "#ff00a0",\n "Survex data": "#ffcc99",\n "Svelte": "#ff3e00",\n "Sway": "#00F58C",\n "Sweave": "#198ce7",\n "Swift": "#F05138",\n "SystemVerilog": "#DAE1C2",\n "TI Program": "#A0AA87",\n "TL-Verilog": "#C40023",\n "TLA": "#4b0079",\n "TMDL": "#f0c913",\n "TOML": "#9c4221",\n "TSQL": "#e38c00",\n "TSV": "#237346",\n "TSX": "#3178c6",\n "TXL": "#0178b8",\n "Tact": "#48b5ff",\n "Talon": "#333333",\n "Tcl": "#e4cc98",\n "TeX": "#3D6117",\n "Teal": "#00B1BC",\n "Terra": "#00004c",\n "Terraform Template": "#7b42bb",\n "TextGrid": "#c8506d",\n "TextMate Properties": "#df66e4",\n "Textile": "#ffe7ac",\n "Thrift": "#D12127",\n "Toit": "#c2c9fb",\n "Tools": "#a371f7",\n "Tor Config": "#59316b",\n "Tree-sitter Query": "#8ea64c",\n "Turing": "#cf142b",\n "Twig": "#c1d026",\n "TypeScript": "#3178c6",\n "TypeSpec": "#4A3665",\n "Typst": "#239dad",\n "Unified Parallel C": "#4e3617",\n "Unity3D Asset": "#222c37",\n "Uno": "#9933cc",\n "UnrealScript": "#a54c4d",\n "Untyped Plutus Core": "#36adbd",\n "UrWeb": "#ccccee",\n "V": "#4f87c4",\n "VBA": "#867db1",\n "VBScript": "#15dcdc",\n "VCL": "#148AA8",\n "VHDL": "#adb2cb",\n "Vala": "#a56de2",\n "Valve Data Format": "#f26025",\n "Velocity Template Language": "#507cff",\n "Vento": "#ff0080",\n "Verilog": "#b2b7f8",\n "Vim Help File": "#199f4b",\n "Vim Script": "#199f4b",\n "Vim Snippet": "#199f4b",\n "Visual Basic .NET": "#945db7",\n "Visual Basic 6.0": "#2c6353",\n "Volt": "#1F1F1F",\n "Vue": "#41b883",\n "Vyper": "#9F4CF2",\n "WDL": "#42f1f4",\n "WGSL": "#1a5e9a",\n "Web Ontology Language": "#5b70bd",\n "WebAssembly": "#04133b",\n "WebAssembly Interface Type": "#6250e7",\n "Whiley": "#d5c397",\n "Wikitext": "#fc5757",\n "Windows Registry Entries": "#52d5ff",\n "Witcher Script": "#ff0000",\n "Wolfram Language": "#dd1100",\n "Wollok": "#a23738",\n "World of Warcraft Addon Data": "#f7e43f",\n "Wren": "#383838",\n "X10": "#4B6BEF",\n "XC": "#99DA07",\n "XML": "#0060ac",\n "XML Property List": "#0060ac",\n "XQuery": "#5232e7",\n "XSLT": "#EB8CEB",\n "Xmake": "#22a079",\n "Xojo": "#81bd41",\n "Xonsh": "#285EEF",\n "Xtend": "#24255d",\n "YAML": "#cb171e",\n "YARA": "#220000",\n "YASnippet": "#32AB90",\n "Yacc": "#4B6C4B",\n "Yul": "#794932",\n "ZAP": "#0d665e",\n "ZIL": "#dc75e5",\n "ZenScript": "#00BCD1",\n "Zephir": "#118f9e",\n "Zig": "#ec915c",\n "Zimpl": "#d67711",\n "Zmodel": "#ff7100",\n "crontab": "#ead7ac",\n "eC": "#913960",\n "fish": "#4aae47",\n "hoon": "#00b171",\n "iCalendar": "#ec564c",\n "jq": "#c7254e",\n "kvlang": "#1da6e0",\n "mIRC Script": "#3d57c3",\n "mcfunction": "#E22837",\n "mdsvex": "#5f9ea0",\n "mupad": "#244963",\n "nanorc": "#2d004d",\n "nesC": "#94B0C7",\n "ooc": "#b0b77e",\n "q": "#0040cd",\n "reStructuredText": "#141414",\n "sed": "#64b970",\n "templ": "#66D0DD",\n "vCard": "#ee2647",\n "wisp": "#7582D1",\n "xBase": "#403a40"\n },\n "ext": {\n "1": "Roff",\n "1in": "Roff",\n "1m": "Roff",\n "1x": "Roff",\n "2": "Roff",\n "2da": "2-Dimensional Array",\n "3": "Roff",\n "3in": "Roff",\n "3m": "Roff",\n "3p": "Roff",\n "3pm": "Roff",\n "3qt": "Roff",\n "3x": "Roff",\n "4": "Roff",\n "4dform": "JSON",\n "4dm": "4D",\n "4dproject": "JSON",\n "4gl": "Genero 4gl",\n "4th": "Forth",\n "5": "Roff",\n "6": "Roff",\n "6pl": "Raku",\n "6pm": "Raku",\n "7": "Roff",\n "8": "Roff",\n "8xp": "TI Program",\n "8xp.txt": "TI Program",\n "9": "Roff",\n "_coffee": "CoffeeScript",\n "_js": "JavaScript",\n "_ls": "LiveScript",\n "a51": "Assembly",\n "abap": "ABAP",\n "action": "ROS Interface",\n "ada": "Ada",\n "adb": "Ada",\n "adml": "XML",\n "admx": "XML",\n "ado": "Stata",\n "adoc": "AsciiDoc",\n "adp": "Tcl",\n "ads": "Ada",\n "afm": "Adobe Font Metrics",\n "agc": "Assembly",\n "agda": "Agda",\n "ahk": "AutoHotkey",\n "ahkl": "AutoHotkey",\n "aidl": "AIDL",\n "aj": "AspectJ",\n "ak": "Aiken",\n "al": "AL",\n "alg": "ALGOL",\n "als": "Alloy",\n "ampl": "AMPL",\n "angelscript": "AngelScript",\n "anim": "Unity3D Asset",\n "ant": "XML",\n "antlers.html": "Antlers",\n "antlers.php": "Antlers",\n "antlers.xml": "Antlers",\n "apacheconf": "ApacheConf",\n "apex": "Apex",\n "apib": "API Blueprint",\n "apl": "APL",\n "app": "Erlang",\n "app.src": "Erlang",\n "applescript": "AppleScript",\n "arc": "Arc",\n "arr": "Pyret",\n "as": "ActionScript",\n "asax": "ASP.NET",\n "asc": "AGS Script",\n "asciidoc": "AsciiDoc",\n "ascx": "ASP.NET",\n "asd": "Common Lisp",\n "asddls": "ABAP CDS",\n "ash": "KoLmafia ASH",\n "ashx": "ASP.NET",\n "asm": "Assembly",\n "asmx": "ASP.NET",\n "asp": "Classic ASP",\n "aspx": "ASP.NET",\n "asset": "Unity3D Asset",\n "astro": "Astro",\n "asy": "Asymptote",\n "au3": "AutoIt",\n "aug": "Augeas",\n "auk": "Awk",\n "aux": "TeX",\n "avdl": "Avro IDL",\n "avsc": "JSON",\n "aw": "PHP",\n "awk": "Awk",\n "axaml": "XML",\n "axd": "ASP.NET",\n "axi": "NetLinx",\n "axi.erb": "NetLinx+ERB",\n "axml": "XML",\n "axs": "NetLinx",\n "axs.erb": "NetLinx+ERB",\n "b": "Brainfuck",\n "bal": "Ballerina",\n "bas": "B4X",\n "bash": "Shell",\n "bat": "Batchfile",\n "bats": "Shell",\n "bb": "BitBake",\n "bbappend": "BitBake",\n "bbclass": "BitBake",\n "bbx": "TeX",\n "bdy": "PLSQL",\n "be": "Berry",\n "bf": "Beef",\n "bi": "FreeBASIC",\n "bib": "TeX",\n "bibtex": "TeX",\n "bicep": "Bicep",\n "bicepparam": "Bicep",\n "bison": "Yacc",\n "blade": "Blade",\n "blade.php": "Blade",\n "bmx": "BlitzMax",\n "bones": "JavaScript",\n "boo": "Boo",\n "boot": "Clojure",\n "bpl": "Boogie",\n "bqn": "BQN",\n "brd": "KiCad Legacy Layout",\n "brs": "Brightscript",\n "bru": "Bru",\n "bs": "Bluespec",\n "bsl": "1C Enterprise",\n "bst": "BuildStream",\n "bsv": "Bluespec",\n "builder": "Ruby",\n "builds": "XML",\n "bzl": "Starlark",\n "c": "C",\n "c++": "C++",\n "c3": "C3",\n "cabal": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cairo": "Cairo",\n "cake": "C#",\n "capnp": "Cap\'n Proto",\n "carbon": "Carbon",\n "cats": "C",\n "cbx": "TeX",\n "cc": "C++",\n "ccproj": "XML",\n "ccxml": "XML",\n "cdc": "Cadence",\n "cdf": "Wolfram Language",\n "cds": "CAP CDS",\n "ceylon": "Ceylon",\n "cfc": "ColdFusion",\n "cfg": "HAProxy",\n "cfm": "ColdFusion",\n "cfml": "ColdFusion",\n "cgi": "Perl",\n "cginc": "HLSL",\n "ch": "xBase",\n "chpl": "Chapel",\n "circom": "Circom",\n "cirru": "Cirru",\n "cj": "Cangjie",\n "cjs": "JavaScript",\n "cjsx": "CoffeeScript",\n "ck": "ChucK",\n "cl": "C",\n "cl2": "Clojure",\n "clar": "Clarity",\n "click": "Click",\n "clixml": "XML",\n "clj": "Clojure",\n "cljc": "Clojure",\n "cljs": "Clojure",\n "cljs.hl": "Clojure",\n "cljscm": "Clojure",\n "cljx": "Clojure",\n "clp": "CLIPS",\n "cls": "Apex",\n "clue": "Clue",\n "clw": "Clarion",\n "cmake": "CMake",\n "cmake.in": "CMake",\n "cmd": "Batchfile",\n "cmp": "Gerber Image",\n "cnc": "G-code",\n "cnf": "INI",\n "cocci": "SmPL",\n "code-snippets": "JSON",\n "code-workspace": "JSON",\n "coffee": "CoffeeScript",\n "coffee.md": "CoffeeScript",\n "command": "Shell",\n "containerfile": "Dockerfile",\n "cook": "Cooklang",\n "coq": "Rocq Prover",\n "cp": "Component Pascal",\n "cpp": "C++",\n "cppm": "C++",\n "cproject": "XML",\n "cps": "Component Pascal",\n "cql": "CQL",\n "cr": "Crystal",\n "cs": "C#",\n "cs.pp": "C#",\n "csc": "GSC",\n "cscfg": "XML",\n "csd": "Csound Document",\n "csdef": "XML",\n "cshtml": "HTML",\n "csl": "XML",\n "cson": "CSON",\n "csproj": "XML",\n "css": "CSS",\n "csv": "CSV",\n "csx": "C#",\n "ct": "XML",\n "ctl": "Visual Basic 6.0",\n "ctp": "PHP",\n "cts": "TypeScript",\n "cu": "Cuda",\n "cue": "CUE",\n "cuh": "Cuda",\n "curry": "Curry",\n "cwl": "Common Workflow Language",\n "cxx": "C++",\n "cylc": "INI",\n "cyp": "Cypher",\n "cypher": "Cypher",\n "d": "D",\n "d2": "D2",\n "dae": "COLLADA",\n "darcspatch": "Darcs Patch",\n "dart": "Dart",\n "das": "Daslang",\n "dats": "ATS",\n "db2": "SQLPL",\n "dcl": "Clean",\n "ddl": "PLSQL",\n "decls": "BlitzBasic",\n "depproj": "XML",\n "dfm": "Pascal",\n "dfy": "Dafny",\n "dhall": "Dhall",\n "di": "D",\n "dita": "XML",\n "ditamap": "XML",\n "ditaval": "XML",\n "djs": "Dogescript",\n "dll.config": "XML",\n "dlm": "IDL",\n "dm": "DM",\n "do": "Stata",\n "dockerfile": "Dockerfile",\n "dof": "INI",\n "doh": "Stata",\n "dot": "Graphviz (DOT)",\n "dotsettings": "XML",\n "dpatch": "Darcs Patch",\n "dpr": "Pascal",\n "druby": "Mirah",\n "dsc": "DenizenScript",\n "dsp": "Faust",\n "dsr": "Visual Basic 6.0",\n "dtx": "TeX",\n "duby": "Mirah",\n "dwl": "DataWeave",\n "dyalog": "APL",\n "dyl": "Dylan",\n "dylan": "Dylan",\n "e": "E",\n "eb": "Python",\n "ebuild": "Shell",\n "ec": "eC",\n "ecl": "ECL",\n "eclass": "Shell",\n "eclxml": "ECL",\n "ecr": "HTML",\n "ect": "EJS",\n "edge": "Edge",\n "edgeql": "EdgeQL",\n "editorconfig": "INI",\n "eh": "eC",\n "ejs": "EJS",\n "ejs.t": "EJS",\n "el": "Emacs Lisp",\n "eliom": "OCaml",\n "eliomi": "OCaml",\n "elm": "Elm",\n "elv": "Elvish",\n "em": "EmberScript",\n "emacs": "Emacs Lisp",\n "emacs.desktop": "Emacs Lisp",\n "emberscript": "EmberScript",\n "env": "Dotenv",\n "epj": "JavaScript",\n "eps": "PostScript",\n "epsi": "PostScript",\n "eq": "EQ",\n "erb": "HTML",\n "erb.deface": "HTML",\n "erl": "Erlang",\n "es": "Erlang",\n "es6": "JavaScript",\n "escript": "Erlang",\n "esdl": "EdgeQL",\n "ex": "Elixir",\n "exs": "Elixir",\n "eye": "Ruby",\n "f": "Fortran",\n "f03": "Fortran",\n "f08": "Fortran",\n "f77": "Fortran",\n "f90": "Fortran",\n "f95": "Fortran",\n "factor": "Factor",\n "fan": "Fantom",\n "fancypack": "Fancy",\n "fbs": "FlatBuffers",\n "fcgi": "Lua",\n "feature": "Gherkin",\n "filters": "XML",\n "fir": "FIRRTL",\n "fish": "Shell",\n "flex": "Lex",\n "flf": "FIGlet Font",\n "flix": "Flix",\n "flux": "FLUX",\n "fnc": "PLSQL",\n "fnl": "Fennel",\n "for": "Fortran",\n "forth": "Forth",\n "fp": "GLSL",\n "fpp": "Fortran",\n "fr": "Frege",\n "frag": "GLSL",\n "frg": "GLSL",\n "frm": "VBA",\n "frt": "Forth",\n "fs": "F#",\n "fsh": "GLSL",\n "fshader": "GLSL",\n "fsi": "F#",\n "fsproj": "XML",\n "fst": "F*",\n "fsti": "F*",\n "fsx": "F#",\n "fth": "Forth",\n "ftl": "Fluent",\n "ftlh": "FreeMarker",\n "fun": "Standard ML",\n "fut": "Futhark",\n "fx": "FLUX",\n "fxh": "HLSL",\n "fxml": "XML",\n "fy": "Fancy",\n "g": "G-code",\n "g4": "ANTLR",\n "gaml": "GAML",\n "gap": "GAP",\n "gawk": "Awk",\n "gbl": "Gerber Image",\n "gbo": "Gerber Image",\n "gbp": "Gerber Image",\n "gbr": "Gerber Image",\n "gbs": "Gerber Image",\n "gco": "G-code",\n "gcode": "G-code",\n "gd": "GDScript",\n "gdnlib": "Godot Resource",\n "gdns": "Godot Resource",\n "gdshader": "GDShader",\n "gdshaderinc": "GDShader",\n "ged": "GEDCOM",\n "gemspec": "Ruby",\n "geo": "GLSL",\n "geojson": "JSON",\n "geom": "GLSL",\n "gf": "Grammatical Framework",\n "gi": "GAP",\n "gitconfig": "INI",\n "gitignore": "Ignore List",\n "gjs": "JavaScript",\n "gko": "Gerber Image",\n "glade": "XML",\n "gleam": "Gleam",\n "glf": "Glyph",\n "glsl": "GLSL",\n "glslf": "GLSL",\n "glslv": "GLSL",\n "gltf": "JSON",\n "gmi": "Gemini",\n "gml": "Game Maker Language",\n "gms": "GAMS",\n "gmx": "XML",\n "gnu": "Gnuplot",\n "gnuplot": "Gnuplot",\n "go": "Go",\n "god": "Ruby",\n "gohtml": "Go Template",\n "golo": "Golo",\n "gotmpl": "Go Template",\n "gp": "Gnuplot",\n "gpb": "Gerber Image",\n "gpt": "Gerber Image",\n "gpx": "XML",\n "gql": "GraphQL",\n "grace": "Grace",\n "gradle": "Gradle",\n "gradle.kts": "Gradle",\n "graphql": "GraphQL",\n "graphqls": "GraphQL",\n "groovy": "Groovy",\n "grt": "Groovy",\n "grxml": "XML",\n "gs": "Genie",\n "gsc": "GSC",\n "gsh": "GSC",\n "gshader": "GLSL",\n "gsp": "Groovy",\n "gst": "Gosu",\n "gsx": "Gosu",\n "gtl": "Gerber Image",\n "gto": "Gerber Image",\n "gtp": "Gerber Image",\n "gtpl": "Groovy",\n "gts": "TypeScript",\n "gv": "Graphviz (DOT)",\n "gvy": "Groovy",\n "gyp": "Python",\n "gypi": "Python",\n "h": "C",\n "h++": "C++",\n "h.in": "C",\n "ha": "Hare",\n "hack": "Hack",\n "haml": "Haml",\n "haml.deface": "Haml",\n "handlebars": "Handlebars",\n "har": "JSON",\n "hats": "ATS",\n "hb": "Harbour",\n "hbs": "Handlebars",\n "hc": "HolyC",\n "hcl": "HCL",\n "heex": "HTML",\n "hh": "C++",\n "hhi": "Hack",\n "hic": "Clojure",\n "hip": "HIP",\n "hlsl": "HLSL",\n "hlsli": "HLSL",\n "hocon": "HOCON",\n "hoon": "hoon",\n "hpp": "C++",\n "hqf": "SQF",\n "hql": "HiveQL",\n "hrl": "Erlang",\n "hs": "Haskell",\n "hs-boot": "Haskell",\n "hsc": "Haskell",\n "hta": "HTML",\n "htm": "HTML",\n "html": "HTML",\n "html.eex": "HTML",\n "html.hl": "HTML",\n "html.tmpl": "Go Template",\n "http": "HTTP",\n "hurl": "Hurl",\n "hx": "Haxe",\n "hxml": "HXML",\n "hxsl": "Haxe",\n "hxx": "C++",\n "hy": "Hy",\n "hzp": "XML",\n "i": "Assembly",\n "i3": "Modula-3",\n "ical": "iCalendar",\n "ice": "Slice",\n "iced": "CoffeeScript",\n "icl": "Clean",\n "icls": "XML",\n "ics": "iCalendar",\n "idc": "C",\n "idr": "Idris",\n "ig": "Modula-3",\n "ihlp": "Stata",\n "ijm": "ImageJ Macro",\n "ijs": "J",\n "ik": "Ioke",\n "il": "IL Assembly",\n "ily": "LilyPond",\n "imba": "Imba",\n "iml": "XML",\n "inc": "Assembly",\n "ini": "INI",\n "inl": "C++",\n "ino": "C++",\n "ins": "TeX",\n "intr": "Dylan",\n "io": "Io",\n "iol": "Jolie",\n "ipf": "IGOR Pro",\n "ipp": "C++",\n "ipynb": "Jupyter Notebook",\n "isl": "Inno Setup",\n "ispc": "ISPC",\n "iss": "Inno Setup",\n "iuml": "PlantUML",\n "ivy": "XML",\n "ixx": "C++",\n "j": "Jasmin",\n "j2": "Jinja",\n "jac": "Jac",\n "jade": "Pug",\n "jai": "Jai",\n "jake": "JavaScript",\n "janet": "Janet",\n "jav": "Java",\n "java": "Java",\n "javascript": "JavaScript",\n "jbuilder": "Ruby",\n "jcl": "JCL",\n "jelly": "XML",\n "jflex": "Lex",\n "jinja": "Jinja",\n "jinja2": "Jinja",\n "jison": "Yacc",\n "jisonlex": "Lex",\n "jl": "Julia",\n "jq": "JSONiq",\n "js": "JavaScript",\n "js.erb": "JavaScript",\n "jsb": "JavaScript",\n "jscad": "JavaScript",\n "jsfl": "JavaScript",\n "jsh": "Java",\n "jslib": "JavaScript",\n "jsm": "JavaScript",\n "json": "JSON",\n "json-tmlanguage": "JSON",\n "json.example": "JSON",\n "json5": "JSON5",\n "jsonc": "JSON",\n "jsonl": "JSON",\n "jsonld": "JSONLD",\n "jsonnet": "Jsonnet",\n "jsp": "Java",\n "jspre": "JavaScript",\n "jsproj": "XML",\n "jss": "JavaScript",\n "jst": "EJS",\n "jsx": "JavaScript",\n "jte": "Java",\n "just": "Just",\n "k": "KCL",\n "kak": "KakouneScript",\n "kdl": "KDL",\n "kicad_mod": "KiCad Layout",\n "kicad_pcb": "KiCad Layout",\n "kicad_sch": "KiCad Schematic",\n "kicad_sym": "KiCad Schematic",\n "kicad_wks": "KiCad Layout",\n "kid": "Genshi",\n "kk": "Koka",\n "kml": "XML",\n "kojo": "Scala",\n "krl": "KRL",\n "ks": "KerboScript",\n "ksh": "Shell",\n "ksy": "Kaitai Struct",\n "kt": "Kotlin",\n "ktm": "Kotlin",\n "kts": "Kotlin",\n "kv": "kvlang",\n "l": "Common Lisp",\n "lagda": "Agda",\n "langium": "Langium",\n "lark": "Lark",\n "las": "Lasso",\n "lasso": "Lasso",\n "lasso8": "Lasso",\n "lasso9": "Lasso",\n "latte": "Latte",\n "launch": "XML",\n "lbx": "TeX",\n "leex": "HTML",\n "lektorproject": "INI",\n "leo": "Leo",\n "less": "Less",\n "lex": "Lex",\n "lfe": "LFE",\n "lgt": "Logtalk",\n "lhs": "Haskell",\n "libsonnet": "Jsonnet",\n "lid": "Dylan",\n "lidr": "Idris",\n "ligo": "LigoLANG",\n "linq": "C#",\n "liq": "Liquidsoap",\n "liquid": "Liquid",\n "lisp": "Common Lisp",\n "litcoffee": "CoffeeScript",\n "livecodescript": "LiveCode Script",\n "livemd": "Markdown",\n "lkml": "LookML",\n "ll": "LLVM",\n "lmi": "Python",\n "logtalk": "Logtalk",\n "lol": "LOLCODE",\n "lookml": "LookML",\n "lp": "Answer Set Programming",\n "lpr": "Pascal",\n "ls": "LiveScript",\n "lsl": "LSL",\n "lslp": "LSL",\n "lsp": "Common Lisp",\n "ltx": "TeX",\n "lua": "Lua",\n "luau": "Luau",\n "lvclass": "LabVIEW",\n "lvlib": "LabVIEW",\n "lvproj": "LabVIEW",\n "ly": "LilyPond",\n "m": "Objective-C",\n "m2": "Macaulay2",\n "m3": "Modula-3",\n "m3u": "M3U",\n "m3u8": "M3U",\n "ma": "Wolfram Language",\n "mak": "Makefile",\n "make": "Makefile",\n "makefile": "Makefile",\n "mako": "Mako",\n "man": "Roff",\n "mao": "Mako",\n "markdown": "Markdown",\n "marko": "Marko",\n "mask": "Mask",\n "mat": "Unity3D Asset",\n "mata": "Stata",\n "matah": "Stata",\n "mathematica": "Wolfram Language",\n "matlab": "MATLAB",\n "mawk": "Awk",\n "maxhelp": "Max",\n "maxpat": "Max",\n "maxproj": "Max",\n "mbt": "MoonBit",\n "mc": "Monkey C",\n "mcfunction": "mcfunction",\n "mch": "B (Formal Method)",\n "mcmeta": "JSON",\n "mcr": "MAXScript",\n "md": "Markdown",\n "mdoc": "Roff",\n "mdown": "Markdown",\n "mdpolicy": "XML",\n "mdwn": "Markdown",\n "mdx": "MDX",\n "me": "Roff",\n "mediawiki": "Wikitext",\n "mermaid": "Mermaid",\n "meta": "Unity3D Asset",\n "metal": "Metal",\n "metta": "MeTTa",\n "mg": "Modula-3",\n "mint": "Mint",\n "mir": "YAML",\n "mirah": "Mirah",\n "mjml": "XML",\n "mjs": "JavaScript",\n "mk": "Makefile",\n "mkd": "Markdown",\n "mkdn": "Markdown",\n "mkdown": "Markdown",\n "mkfile": "Makefile",\n "mkii": "TeX",\n "mkiv": "TeX",\n "mkvi": "TeX",\n "ml": "OCaml",\n "ml4": "OCaml",\n "mli": "OCaml",\n "mligo": "LigoLANG",\n "mlir": "MLIR",\n "mll": "OCaml",\n "mly": "OCaml",\n "mm": "Objective-C++",\n "mmd": "Mermaid",\n "mo": "Modelica",\n "mod": "Modula-2",\n "mojo": "Mojo",\n "moo": "Mercury",\n "moon": "MoonScript",\n "move": "Move",\n "mpl": "JetBrains MPS",\n "mps": "JetBrains MPS",\n "mq4": "MQL4",\n "mq5": "MQL5",\n "mqh": "MQL4",\n "mrc": "mIRC Script",\n "ms": "MAXScript",\n "msd": "JetBrains MPS",\n "msg": "OMNeT++ MSG",\n "mspec": "Ruby",\n "mt": "Wolfram Language",\n "mtml": "MTML",\n "mts": "TypeScript",\n "mu": "mupad",\n "mud": "ZIL",\n "mustache": "Mustache",\n "mxml": "XML",\n "mxt": "Max",\n "mysql": "SQL",\n "mzn": "MiniZinc",\n "n": "Nemerle",\n "nanorc": "INI",\n "nas": "Nasal",\n "nasm": "Assembly",\n "natvis": "XML",\n "nawk": "Awk",\n "nb": "Wolfram Language",\n "nbp": "Wolfram Language",\n "nc": "nesC",\n "ncl": "NCL",\n "ndproj": "XML",\n "ne": "Nearley",\n "nearley": "Nearley",\n "ned": "OMNeT++ NED",\n "nf": "Nextflow",\n "nginx": "Nginx",\n "nginxconf": "Nginx",\n "nim": "Nim",\n "nim.cfg": "Nim",\n "nimble": "Nim",\n "nimrod": "Nim",\n "nims": "Nim",\n "nit": "Nit",\n "nix": "Nix",\n "njk": "Nunjucks",\n "njs": "JavaScript",\n "nl": "NewLisp",\n "nlogo": "NetLogo",\n "nomad": "HCL",\n "nproj": "XML",\n "nqp": "Raku",\n "nr": "Noir",\n "nse": "Lua",\n "nss": "NWScript",\n "nu": "Nu",\n "numpy": "Python",\n "numpyw": "Python",\n "numsc": "Python",\n "nuspec": "XML",\n "nut": "Squirrel",\n "ny": "Common Lisp",\n "odd": "XML",\n "odin": "Odin",\n "ol": "Jolie",\n "omgrofl": "Omgrofl",\n "ooc": "ooc",\n "opal": "Opal",\n "opencl": "C",\n "orc": "Csound",\n "org": "Org",\n "os": "1C Enterprise",\n "osm": "XML",\n "outjob": "Altium Designer",\n "overpassql": "OverpassQL",\n "owl": "Web Ontology Language",\n "oxygene": "Oxygene",\n "oz": "Oz",\n "p": "OpenEdge ABL",\n "p4": "P4",\n "p6": "Raku",\n "p6l": "Raku",\n "p6m": "Raku",\n "p8": "Lua",\n "pac": "JavaScript",\n "pact": "Pact",\n "pan": "Pan",\n "parrot": "Parrot",\n "pas": "Pascal",\n "pascal": "Pascal",\n "pat": "Max",\n "pb": "PureBasic",\n "pbi": "PureBasic",\n "pbt": "PowerBuilder",\n "pcbdoc": "Altium Designer",\n "pck": "PLSQL",\n "pcss": "CSS",\n "pd_lua": "Lua",\n "pddl": "PDDL",\n "pde": "Processing",\n "peggy": "PEG.js",\n "pegjs": "PEG.js",\n "pep": "Pep8",\n "per": "Genero per",\n "perl": "Perl",\n "pfa": "PostScript",\n "pgsql": "PLpgSQL",\n "ph": "Perl",\n "php": "PHP",\n "php3": "PHP",\n "php4": "PHP",\n "php5": "PHP",\n "phps": "PHP",\n "phpt": "PHP",\n "phtml": "HTML",\n "pig": "PigLatin",\n "pike": "Pike",\n "pkb": "PLSQL",\n "pkgproj": "XML",\n "pkl": "Pkl",\n "pks": "PLSQL",\n "pl": "Perl",\n "pl6": "Raku",\n "plantuml": "PlantUML",\n "plb": "PLSQL",\n "plist": "XML",\n "plot": "Gnuplot",\n "pls": "PLSQL",\n "plsql": "PLSQL",\n "plt": "Gnuplot",\n "pluginspec": "Ruby",\n "plx": "Perl",\n "pm": "Perl",\n "pm6": "Raku",\n "pml": "Promela",\n "pmod": "Pike",\n "podsl": "Common Lisp",\n "podspec": "Ruby",\n "pogo": "PogoScript",\n "polar": "Polar",\n "por": "Portugol",\n "postcss": "CSS",\n "pov": "POV-Ray SDL",\n "pp": "Puppet",\n "pprx": "REXX",\n "praat": "Praat",\n "prawn": "Ruby",\n "prc": "PLSQL",\n "prefab": "Unity3D Asset",\n "prefs": "INI",\n "prg": "xBase",\n "prisma": "Prisma",\n "prjpcb": "Altium Designer",\n "pro": "Prolog",\n "proj": "XML",\n "prolog": "Prolog",\n "properties": "Java Properties",\n "props": "XML",\n "prw": "xBase",\n "ps": "PostScript",\n "ps1": "PowerShell",\n "ps1xml": "XML",\n "psc": "Papyrus",\n "psc1": "XML",\n "psd1": "PowerShell",\n "psgi": "Perl",\n "psm1": "PowerShell",\n "pt": "XML",\n "pubxml": "XML",\n "pug": "Pug",\n "puml": "PlantUML",\n "purs": "PureScript",\n "pwn": "Pawn",\n "pxd": "Cython",\n "pxi": "Cython",\n "py": "Python",\n "py3": "Python",\n "pyde": "Python",\n "pyi": "Python",\n "pyp": "Python",\n "pyt": "Python",\n "pytb": "Python",\n "pyw": "Python",\n "pyx": "Cython",\n "q": "HiveQL",\n "qasm": "OpenQASM",\n "qbs": "QML",\n "qc": "QuakeC",\n "qhelp": "XML",\n "ql": "CodeQL",\n "qll": "CodeQL",\n "qmd": "RMarkdown",\n "qml": "QML",\n "qnt": "Quint",\n "qs": "Q#",\n "r": "R",\n "r2": "Rebol",\n "r3": "Rebol",\n "rabl": "Ruby",\n "rake": "Ruby",\n "raku": "Raku",\n "rakumod": "Raku",\n "raml": "RAML",\n "rascript": "RAScript",\n "razor": "HTML",\n "rb": "Ruby",\n "rbi": "Ruby",\n "rbs": "Ruby",\n "rbuild": "Ruby",\n "rbw": "Ruby",\n "rbx": "Ruby",\n "rbxs": "Lua",\n "rchit": "GLSL",\n "rd": "R",\n "rdf": "XML",\n "rdoc": "RDoc",\n "re": "Reason",\n "reb": "Rebol",\n "rebol": "Rebol",\n "red": "Red",\n "reds": "Red",\n "reek": "YAML",\n "reg": "Windows Registry Entries",\n "regex": "Regular Expression",\n "regexp": "Regular Expression",\n "rego": "Open Policy Agent",\n "rei": "Reason",\n "religo": "LigoLANG",\n "res": "ReScript",\n "resi": "ReScript",\n "resource": "RobotFramework",\n "rest": "reStructuredText",\n "rest.txt": "reStructuredText",\n "resx": "XML",\n "rex": "REXX",\n "rexx": "REXX",\n "rg": "Rouge",\n "rhtml": "HTML",\n "ring": "Ring",\n "riot": "Riot",\n "rkt": "Racket",\n "rktd": "Racket",\n "rktl": "Racket",\n "rl": "Ragel",\n "rmd": "RMarkdown",\n "rmiss": "GLSL",\n "rnh": "RUNOFF",\n "rno": "RUNOFF",\n "rnw": "Sweave",\n "robot": "RobotFramework",\n "roc": "Roc",\n "rockspec": "Lua",\n "roff": "Roff",\n "ron": "RON",\n "ronn": "Markdown",\n "rpgle": "RPGLE",\n "rpy": "Ren\'Py",\n "rq": "SPARQL",\n "rs": "Rust",\n "rs.in": "Rust",\n "rsc": "Rascal",\n "rss": "XML",\n "rst": "reStructuredText",\n "rst.txt": "reStructuredText",\n "rsx": "R",\n "ru": "Ruby",\n "ruby": "Ruby",\n "rviz": "YAML",\n "s": "Assembly",\n "sail": "Sail",\n "sarif": "JSON",\n "sas": "SAS",\n "sass": "Sass",\n "sats": "ATS",\n "sbatch": "Shell",\n "sbt": "Scala",\n "sc": "SuperCollider",\n "scad": "OpenSCAD",\n "scala": "Scala",\n "scaml": "Scaml",\n "scd": "SuperCollider",\n "sce": "Scilab",\n "scenic": "Scenic",\n "sch": "Scheme",\n "schdoc": "Altium Designer",\n "sci": "Scilab",\n "scm": "Scheme",\n "sco": "Csound Score",\n "scpt": "AppleScript",\n "scrbl": "Racket",\n "scss": "SCSS",\n "scxml": "XML",\n "sdc": "Tcl",\n "sed": "sed",\n "self": "Self",\n "sexp": "Common Lisp",\n "sfproj": "XML",\n "sfv": "Simple File Verification",\n "sh": "Shell",\n "sh.in": "Shell",\n "shader": "ShaderLab",\n "shen": "Shen",\n "shproj": "XML",\n "sig": "Standard ML",\n "sj": "Objective-J",\n "sjs": "JavaScript",\n "sl": "Slash",\n "slang": "Slang",\n "sld": "Scheme",\n "slim": "Slim",\n "slint": "Slint",\n "slnx": "XML",\n "sls": "SaltStack",\n "slurm": "Shell",\n "sma": "Pawn",\n "smithy": "Smithy",\n "smk": "Python",\n "sml": "Standard ML",\n "snakefile": "Python",\n "snap": "Jest Snapshot",\n "snip": "Vim Snippet",\n "snippet": "Vim Snippet",\n "snippets": "Vim Snippet",\n "sol": "Solidity",\n "soy": "Closure Templates",\n "sp": "SourcePawn",\n "sparql": "SPARQL",\n "spc": "PLSQL",\n "spec": "Python",\n "spin": "Propeller Spin",\n "sps": "Scheme",\n "sqf": "SQF",\n "sql": "SQL",\n "sqlrpgle": "RPGLE",\n "sra": "PowerBuilder",\n "srdf": "XML",\n "srt": "SRecode Template",\n "sru": "PowerBuilder",\n "srv": "ROS Interface",\n "srw": "PowerBuilder",\n "ss": "Scheme",\n "ssjs": "JavaScript",\n "sss": "SugarSS",\n "st": "Smalltalk",\n "stan": "Stan",\n "star": "Starlark",\n "sthlp": "Stata",\n "stl": "STL",\n "story": "Gherkin",\n "storyboard": "XML",\n "sttheme": "XML",\n "sty": "TeX",\n "styl": "Stylus",\n "sublime-build": "JSON",\n "sublime-color-scheme": "JSON",\n "sublime-commands": "JSON",\n "sublime-completions": "JSON",\n "sublime-keymap": "JSON",\n "sublime-macro": "JSON",\n "sublime-menu": "JSON",\n "sublime-mousemap": "JSON",\n "sublime-project": "JSON",\n "sublime-settings": "JSON",\n "sublime-snippet": "XML",\n "sublime-syntax": "YAML",\n "sublime-theme": "JSON",\n "sublime-workspace": "JSON",\n "sublime_metrics": "JSON",\n "sublime_session": "JSON",\n "surql": "SurrealQL",\n "sv": "SystemVerilog",\n "svelte": "Svelte",\n "svg": "SVG",\n "svh": "SystemVerilog",\n "svx": "mdsvex",\n "sw": "Sway",\n "swift": "Swift",\n "syntax": "YAML",\n "t": "Perl",\n "tab": "SQL",\n "tac": "Python",\n "tact": "Tact",\n "tag": "Java",\n "talon": "Talon",\n "targets": "XML",\n "tcc": "C++",\n "tcl": "Tcl",\n "tcl.in": "Tcl",\n "templ": "templ",\n "tesc": "GLSL",\n "tese": "GLSL",\n "tex": "TeX",\n "textgrid": "TextGrid",\n "textile": "Textile",\n "tf": "HCL",\n "tfstate": "JSON",\n "tfstate.backup": "JSON",\n "tftpl": "HCL",\n "tfvars": "HCL",\n "thor": "Ruby",\n "thrift": "Thrift",\n "thy": "Isabelle",\n "tl": "Teal",\n "tla": "TLA",\n "tlv": "TL-Verilog",\n "tm": "Tcl",\n "tmac": "Roff",\n "tmcommand": "XML",\n "tmdl": "TMDL",\n "tml": "XML",\n "tmlanguage": "XML",\n "tmpl": "Go Template",\n "tmpreferences": "XML",\n "tmsnippet": "XML",\n "tmtheme": "XML",\n "tmux": "Shell",\n "toc": "TeX",\n "tofu": "HCL",\n "toit": "Toit",\n "toml": "TOML",\n "toml.example": "TOML",\n "tool": "Shell",\n "topojson": "JSON",\n "tpb": "PLSQL",\n "tpl": "Smarty",\n "tpp": "C++",\n "tps": "PLSQL",\n "tres": "Godot Resource",\n "trg": "PLSQL",\n "trigger": "Apex",\n "ts": "TypeScript",\n "tscn": "Godot Resource",\n "tsconfig.json": "JSON",\n "tsp": "TypeSpec",\n "tst": "GAP",\n "tsv": "TSV",\n "tsx": "TypeScript",\n "tu": "Turing",\n "twig": "Twig",\n "txl": "TXL",\n "txt": "Adblock Filter List",\n "txx": "C++",\n "typ": "Typst",\n "uc": "UnrealScript",\n "udf": "SQL",\n "udo": "Csound",\n "ui": "XML",\n "unity": "Unity3D Asset",\n "uno": "Uno",\n "upc": "C",\n "uplc": "Untyped Plutus Core",\n "ur": "UrWeb",\n "urdf": "XML",\n "url": "INI",\n "urs": "UrWeb",\n "ux": "XML",\n "v": "Verilog",\n "vala": "Vala",\n "vapi": "Vala",\n "vark": "Gosu",\n "vb": "Visual Basic .NET",\n "vba": "VBA",\n "vbhtml": "Visual Basic .NET",\n "vbproj": "XML",\n "vbs": "VBScript",\n "vcf": "vCard",\n "vcl": "VCL",\n "vcxproj": "XML",\n "vdf": "Valve Data Format",\n "veo": "Verilog",\n "vert": "GLSL",\n "vh": "SystemVerilog",\n "vhd": "VHDL",\n "vhdl": "VHDL",\n "vhf": "VHDL",\n "vhi": "VHDL",\n "vho": "VHDL",\n "vhost": "ApacheConf",\n "vhs": "VHDL",\n "vht": "VHDL",\n "vhw": "VHDL",\n "vim": "Vim Script",\n "vimrc": "Vim Script",\n "viw": "SQL",\n "vmb": "Vim Script",\n "volt": "Volt",\n "vrx": "GLSL",\n "vs": "GLSL",\n "vsh": "GLSL",\n "vshader": "GLSL",\n "vsixmanifest": "XML",\n "vssettings": "XML",\n "vstemplate": "XML",\n "vtl": "Velocity Template Language",\n "vto": "Vento",\n "vue": "Vue",\n "vw": "PLSQL",\n "vxml": "XML",\n "vy": "Vyper",\n "w": "CWeb",\n "wast": "WebAssembly",\n "wat": "WebAssembly",\n "watchr": "Ruby",\n "wdl": "WDL",\n "webapp": "JSON",\n "webmanifest": "JSON",\n "wgsl": "WGSL",\n "whiley": "Whiley",\n "wiki": "Wikitext",\n "wikitext": "Wikitext",\n "wisp": "wisp",\n "wit": "WebAssembly Interface Type",\n "wixproj": "XML",\n "wl": "Wolfram Language",\n "wlk": "Wollok",\n "wls": "Wolfram Language",\n "wlt": "Wolfram Language",\n "wlua": "Lua",\n "workbook": "Markdown",\n "workflow": "HCL",\n "wren": "Wren",\n "ws": "Witcher Script",\n "wsdl": "XML",\n "wsf": "XML",\n "wsgi": "Python",\n "wxi": "XML",\n "wxl": "XML",\n "wxs": "XML",\n "x": "DirectX 3D File",\n "x10": "X10",\n "x3d": "XML",\n "x68": "Assembly",\n "xacro": "XML",\n "xaml": "XML",\n "xc": "XC",\n "xdc": "Tcl",\n "xht": "HTML",\n "xhtml": "HTML",\n "xib": "XML",\n "xlf": "XML",\n "xliff": "XML",\n "xmi": "XML",\n "xml": "XML",\n "xml.dist": "XML",\n "xmp": "XML",\n "xojo_code": "Xojo",\n "xojo_menu": "Xojo",\n "xojo_report": "Xojo",\n "xojo_script": "Xojo",\n "xojo_toolbar": "Xojo",\n "xojo_window": "Xojo",\n "xproj": "XML",\n "xpy": "Python",\n "xq": "XQuery",\n "xql": "XQuery",\n "xqm": "XQuery",\n "xquery": "XQuery",\n "xqy": "XQuery",\n "xrl": "Erlang",\n "xsd": "XML",\n "xsh": "Xonsh",\n "xsjs": "JavaScript",\n "xsjslib": "JavaScript",\n "xsl": "XSLT",\n "xslt": "XSLT",\n "xspec": "XML",\n "xtend": "Xtend",\n "xul": "XML",\n "xzap": "ZAP",\n "y": "Yacc",\n "yacc": "Yacc",\n "yaml": "MiniYAML",\n "yaml-tmlanguage": "YAML",\n "yaml.sed": "YAML",\n "yap": "Prolog",\n "yar": "YARA",\n "yara": "YARA",\n "yasnippet": "YASnippet",\n "yml": "YAML",\n "yml.mysql": "YAML",\n "yrl": "Erlang",\n "yul": "Yul",\n "yy": "Yacc",\n "yyp": "JSON",\n "zap": "ZAP",\n "zcml": "XML",\n "zed": "SpiceDB Schema",\n "zep": "Zephir",\n "zig": "Zig",\n "zig.zon": "Zig",\n "zil": "ZIL",\n "zimpl": "Zimpl",\n "zmodel": "Zmodel",\n "zmpl": "Zimpl",\n "zpl": "Zimpl",\n "zs": "ZenScript",\n "zsh": "Shell",\n "zsh-theme": "Shell"\n },\n "filename": {\n ".abbrev_defs": "Emacs Lisp",\n ".ackrc": "Option List",\n ".all-contributorsrc": "JSON",\n ".arcconfig": "JSON",\n ".atomignore": "Ignore List",\n ".auto-changelog": "JSON",\n ".babelignore": "Ignore List",\n ".babelrc": "JSON",\n ".bash_aliases": "Shell",\n ".bash_functions": "Shell",\n ".bash_history": "Shell",\n ".bash_logout": "Shell",\n ".bash_profile": "Shell",\n ".bashrc": "Shell",\n ".browserslistrc": "Browserslist",\n ".buckconfig": "INI",\n ".bzrignore": "Ignore List",\n ".c8rc": "JSON",\n ".clang-format": "YAML",\n ".clang-tidy": "YAML",\n ".clangd": "YAML",\n ".classpath": "XML",\n ".coffeelintignore": "Ignore List",\n ".coveragerc": "INI",\n ".cproject": "XML",\n ".cshrc": "Shell",\n ".cvsignore": "Ignore List",\n ".devcontainer.json": "JSON",\n ".dockerignore": "Ignore List",\n ".easignore": "Ignore List",\n ".editorconfig": "INI",\n ".eleventyignore": "Ignore List",\n ".emacs": "Emacs Lisp",\n ".emacs.desktop": "Emacs Lisp",\n ".env": "Dotenv",\n ".env.ci": "Dotenv",\n ".env.dev": "Dotenv",\n ".env.development": "Dotenv",\n ".env.development.local": "Dotenv",\n ".env.example": "Dotenv",\n ".env.local": "Dotenv",\n ".env.prod": "Dotenv",\n ".env.production": "Dotenv",\n ".env.sample": "Dotenv",\n ".env.staging": "Dotenv",\n ".env.template": "Dotenv",\n ".env.test": "Dotenv",\n ".env.testing": "Dotenv",\n ".envrc": "Shell",\n ".eslintignore": "Ignore List",\n ".eslintrc.json": "JSON",\n ".exrc": "Vim Script",\n ".factor-boot-rc": "Factor",\n ".factor-rc": "Factor",\n ".flake8": "INI",\n ".flaskenv": "Shell",\n ".gclient": "Python",\n ".gemrc": "YAML",\n ".git-blame-ignore-revs": "Git Revision List",\n ".gitattributes": "Git Attributes",\n ".gitconfig": "INI",\n ".gitignore": "Ignore List",\n ".gitmodules": "INI",\n ".gnus": "Emacs Lisp",\n ".gvimrc": "Vim Script",\n ".htaccess": "ApacheConf",\n ".htmlhintrc": "JSON",\n ".ignore": "Ignore List",\n ".imgbotconfig": "JSON",\n ".irbrc": "Ruby",\n ".jscsrc": "JSON",\n ".jshintrc": "JSON",\n ".jslintrc": "JSON",\n ".justfile": "Just",\n ".kshrc": "Shell",\n ".latexmkrc": "Perl",\n ".login": "Shell",\n ".luacheckrc": "Lua",\n ".markdownlintignore": "Ignore List",\n ".nanorc": "INI",\n ".nodemonignore": "Ignore List",\n ".npmignore": "Ignore List",\n ".npmrc": "INI",\n ".nvimrc": "Vim Script",\n ".nycrc": "JSON",\n ".oxlintrc.json": "JSON",\n ".php": "PHP",\n ".php_cs": "PHP",\n ".php_cs.dist": "PHP",\n ".prettierignore": "Ignore List",\n ".profile": "Shell",\n ".project": "XML",\n ".pryrc": "Ruby",\n ".pylintrc": "INI",\n ".rprofile": "R",\n ".rspec": "Option List",\n ".scalafix.conf": "HOCON",\n ".scalafmt.conf": "HOCON",\n ".shellcheckrc": "ShellCheck Config",\n ".simplecov": "Ruby",\n ".spacemacs": "Emacs Lisp",\n ".stylelintignore": "Ignore List",\n ".swcrc": "JSON",\n ".tern-config": "JSON",\n ".tern-project": "JSON",\n ".tm_properties": "TextMate Properties",\n ".tmux.conf": "Shell",\n ".vercelignore": "Ignore List",\n ".vimrc": "Vim Script",\n ".viper": "Emacs Lisp",\n ".vscodeignore": "Ignore List",\n ".watchmanconfig": "JSON",\n ".xinitrc": "Shell",\n ".xsession": "Shell",\n ".yardopts": "Option List",\n ".zlogin": "Shell",\n ".zlogout": "Shell",\n ".zprofile": "Shell",\n ".zshenv": "Shell",\n ".zshrc": "Shell",\n "9fs": "Shell",\n "_emacs": "Emacs Lisp",\n "_helpers.tpl": "Go Template",\n "_vimrc": "Vim Script",\n "abbrev_defs": "Emacs Lisp",\n "ack": "Perl",\n "ackrc": "Option List",\n "ant.xml": "Ant Build System",\n "apache2.conf": "ApacheConf",\n "api-extractor.json": "JSON",\n "apkbuild": "Shell",\n "app.config": "XML",\n "appraisals": "Ruby",\n "bash_aliases": "Shell",\n "bash_logout": "Shell",\n "bash_profile": "Shell",\n "bashrc": "Shell",\n "berksfile": "Ruby",\n "brewfile": "Ruby",\n "browserslist": "Browserslist",\n "bsdmakefile": "Makefile",\n "buck": "Starlark",\n "build": "Starlark",\n "build.bazel": "Starlark",\n "build.xml": "Ant Build System",\n "buildfile": "Ruby",\n "buildozer.spec": "INI",\n "bun.lock": "JSON",\n "cabal.config": "Cabal Config",\n "cabal.project": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cakefile": "CoffeeScript",\n "capfile": "Ruby",\n "cargo.lock": "TOML",\n "cargo.toml.orig": "TOML",\n "cask": "Emacs Lisp",\n "citation.cff": "YAML",\n "cmakelists.txt": "CMake",\n "commit_editmsg": "Git Commit",\n "composer.lock": "JSON",\n "containerfile": "Dockerfile",\n "contents.lr": "Markdown",\n "cpanfile": "Perl",\n "crontab": "crontab",\n "cshrc": "Shell",\n "dangerfile": "Ruby",\n "deliverfile": "Ruby",\n "deno.lock": "JSON",\n "deps": "Python",\n "dev-requirements.txt": "Pip Requirements",\n "devcontainer.json": "JSON",\n "dockerfile": "Dockerfile",\n "dune-project": "Dune",\n "earthfile": "Earthly",\n "eask": "Emacs Lisp",\n "emakefile": "Erlang",\n "eqnrc": "Roff",\n "expr-dist": "R",\n "fakefile": "Fancy",\n "fastfile": "Ruby",\n "firestore.rules": "Cloud Firestore Security Rules",\n "flake.lock": "JSON",\n "fp-lib-table": "KiCad Layout",\n "gemfile": "Ruby",\n "gemfile.lock": "Gemfile.lock",\n "gitignore-global": "Ignore List",\n "gitignore_global": "Ignore List",\n "glide.lock": "YAML",\n "gnumakefile": "Makefile",\n "go.mod": "Go Module",\n "go.sum": "Go Checksums",\n "go.work": "Go Workspace",\n "go.work.sum": "Go Checksums",\n "gopkg.lock": "TOML",\n "gradlew": "Shell",\n "gradlew.bat": "Batchfile",\n "guardfile": "Ruby",\n "gvimrc": "Vim Script",\n "haproxy.cfg": "HAProxy",\n "hosts": "Hosts File",\n "hosts.txt": "Hosts File",\n "httpd.conf": "ApacheConf",\n "installscript.qs": "Qt Script",\n "jakefile": "JavaScript",\n "jarfile": "Ruby",\n "jenkinsfile": "Groovy",\n "jsconfig.json": "JSON",\n "justfile": "Just",\n "kakrc": "KakouneScript",\n "kbuild": "Makefile",\n "kcl.mod": "KCL",\n "kcl.mod.lock": "KCL",\n "kshrc": "Shell",\n "language-configuration.json": "JSON",\n "language-subtag-registry.txt": "Record Jar",\n "latexmkrc": "Perl",\n "lexer.x": "Lex",\n "login": "Shell",\n "m3makefile": "Quake",\n "m3overrides": "Quake",\n "makefile": "Makefile",\n "makefile.am": "Makefile",\n "makefile.boot": "Makefile",\n "makefile.frag": "Makefile",\n "makefile.in": "Makefile",\n "makefile.inc": "Makefile",\n "makefile.pl": "Perl",\n "makefile.sco": "Makefile",\n "makefile.wat": "Makefile",\n "man": "Shell",\n "manifest.mf": "JAR Manifest",\n "mavenfile": "Ruby",\n "mcmod.info": "JSON",\n "meson.build": "Meson",\n "meson_options.txt": "Meson",\n "mise.local.lock": "TOML",\n "mise.lock": "TOML",\n "mix.lock": "Elixir",\n "mkfile": "Makefile",\n "mmn": "Roff",\n "mmt": "Roff",\n "mocha.opts": "Option List",\n "module.bazel": "Starlark",\n "module.bazel.lock": "JSON",\n "modulefile": "Puppet",\n "mvnw": "Shell",\n "mvnw.cmd": "Batchfile",\n "nanorc": "INI",\n "nextflow.config": "Nextflow",\n "nginx.conf": "Nginx",\n "nim.cfg": "Nim",\n "notebook": "Jupyter Notebook",\n "nuget.config": "XML",\n "nukefile": "Nu",\n "nvimrc": "Vim Script",\n "owh": "Tcl",\n "package.resolved": "JSON",\n "packages.config": "XML",\n "pdm.lock": "TOML",\n "phakefile": "PHP",\n "pipfile": "TOML",\n "pipfile.lock": "JSON",\n "pixi.lock": "YAML",\n "pkgbuild": "Shell",\n "podfile": "Ruby",\n "poetry.lock": "TOML",\n "procfile": "Procfile",\n "profile": "Shell",\n "project.ede": "Emacs Lisp",\n "project.godot": "Godot Resource",\n "puppetfile": "Ruby",\n "pylintrc": "INI",\n "rakefile": "Ruby",\n "rebar.config": "Erlang",\n "rebar.config.lock": "Erlang",\n "rebar.lock": "Erlang",\n "requirements-dev.txt": "Pip Requirements",\n "requirements.lock.txt": "Pip Requirements",\n "requirements.txt": "Pip Requirements",\n "rexfile": "Perl",\n "riemann.config": "Clojure",\n "root": "Isabelle",\n "sconscript": "Python",\n "sconstruct": "Python",\n "settings.stylecop": "XML",\n "singularity": "Singularity",\n "slakefile": "LiveScript",\n "snakefile": "Python",\n "snapfile": "Ruby",\n "starfield": "Tcl",\n "steepfile": "Ruby",\n "suite.rc": "INI",\n "thorfile": "Ruby",\n "tiltfile": "Starlark",\n "tmux.conf": "Shell",\n "toolchain_installscript.qs": "Qt Script",\n "torrc": "Tor Config",\n "troffrc": "Roff",\n "troffrc-end": "Roff",\n "tsconfig.json": "JSON",\n "tslint.json": "JSON",\n "uv.lock": "TOML",\n "vagrantfile": "Ruby",\n "vimrc": "Vim Script",\n "vlcrc": "INI",\n "web.config": "XML",\n "web.debug.config": "XML",\n "web.release.config": "XML",\n "workspace": "Starlark",\n "workspace.bazel": "Starlark",\n "workspace.bzlmod": "Starlark",\n "wscript": "Python",\n "xinitrc": "Shell",\n "xmake.lua": "Xmake",\n "xsession": "Shell",\n "yarn.lock": "YAML",\n "zlogin": "Shell",\n "zlogout": "Shell",\n "zprofile": "Shell",\n "zshenv": "Shell",\n "zshrc": "Shell"\n }\n },\n "vendor": [\n "(^|/)cache/",\n "^[Dd]ependencies/",\n "(^|/)dist/",\n "^deps/",\n "(^|/)configure$",\n "(^|/)config\\\\.guess$",\n "(^|/)config\\\\.sub$",\n "(^|/)aclocal\\\\.m4",\n "(^|/)libtool\\\\.m4",\n "(^|/)ltoptions\\\\.m4",\n "(^|/)ltsugar\\\\.m4",\n "(^|/)ltversion\\\\.m4",\n "(^|/)lt~obsolete\\\\.m4",\n "(^|/)dotnet-install\\\\.(ps1|sh)$",\n "(^|/)cpplint\\\\.py",\n "(^|/)node_modules/",\n "(^|/)\\\\.yarn/releases/",\n "(^|/)\\\\.yarn/plugins/",\n "(^|/)\\\\.yarn/sdks/",\n "(^|/)\\\\.yarn/versions/",\n "(^|/)\\\\.yarn/unplugged/",\n "(^|/)_esy$",\n "(^|/)bower_components/",\n "^rebar$",\n "(^|/)erlang\\\\.mk",\n "(^|/)Godeps/_workspace/",\n "(^|/)testdata/",\n "(^|/)\\\\.indent\\\\.pro",\n "(\\\\.|-)min\\\\.(js|css)$",\n "([^\\\\s]*)import\\\\.(css|less|scss|styl)$",\n "(^|/)bootstrap([^/.]*)(\\\\..*)?\\\\.(js|css|less|scss|styl)$",\n "(^|/)custom\\\\.bootstrap([^\\\\s]*)(js|css|less|scss|styl)$",\n "(^|/)font-?awesome\\\\.(css|less|scss|styl)$",\n "(^|/)font-?awesome/.*\\\\.(css|less|scss|styl)$",\n "(^|/)foundation\\\\.(css|less|scss|styl)$",\n "(^|/)normalize\\\\.(css|less|scss|styl)$",\n "(^|/)skeleton\\\\.(css|less|scss|styl)$",\n "(^|/)[Bb]ourbon/.*\\\\.(css|less|scss|styl)$",\n "(^|/)animate\\\\.(css|less|scss|styl)$",\n "(^|/)materialize\\\\.(css|less|scss|styl|js)$",\n "(^|/)select2/.*\\\\.(css|scss|js)$",\n "(^|/)bulma\\\\.(css|sass|scss)$",\n "(3rd|[Tt]hird)[-_]?[Pp]arty/",\n "(^|/)vendors?/",\n "(^|/)[Ee]xtern(als?)?/",\n "(^|/)[Vv]+endor/",\n "^debian/",\n "(^|/)run\\\\.n$",\n "(^|/)bootstrap-datepicker/",\n "(^|/)jquery([^.]*)\\\\.js$",\n "(^|/)jquery\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)jquery\\\\-ui(\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?)?(\\\\.\\\\w+)?\\\\.(js|css)$",\n "(^|/)jquery\\\\.(ui|effects)\\\\.([^.]*)\\\\.(js|css)$",\n "(^|/)jquery\\\\.fn\\\\.gantt\\\\.js",\n "(^|/)jquery\\\\.fancybox\\\\.(js|css)",\n "(^|/)fuelux\\\\.js",\n "(^|/)jquery\\\\.fileupload(-\\\\w+)?\\\\.js$",\n "(^|/)jquery\\\\.dataTables\\\\.js",\n "(^|/)bootbox\\\\.js",\n "(^|/)pdf\\\\.worker\\\\.js",\n "(^|/)slick\\\\.\\\\w+.js$",\n "(^|/)Leaflet\\\\.Coordinates-\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.src\\\\.js$",\n "(^|/)leaflet\\\\.draw-src\\\\.js",\n "(^|/)leaflet\\\\.draw\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.js",\n "(^|/)leaflet\\\\.spin\\\\.js",\n "(^|/)wicket-leaflet\\\\.js",\n "(^|/)\\\\.sublime-project",\n "(^|/)\\\\.sublime-workspace",\n "(^|/)\\\\.vscode/",\n "(^|/)prototype(.*)\\\\.js$",\n "(^|/)effects\\\\.js$",\n "(^|/)controls\\\\.js$",\n "(^|/)dragdrop\\\\.js$",\n "(.*?)\\\\.d\\\\.ts$",\n "(^|/)mootools([^.]*)\\\\d+\\\\.\\\\d+.\\\\d+([^.]*)\\\\.js$",\n "(^|/)dojo\\\\.js$",\n "(^|/)MochiKit\\\\.js$",\n "(^|/)yahoo-([^.]*)\\\\.js$",\n "(^|/)yui([^.]*)\\\\.js$",\n "(^|/)ckeditor\\\\.js$",\n "(^|/)tiny_mce([^.]*)\\\\.js$",\n "(^|/)tiny_mce/(langs|plugins|themes|utils)",\n "(^|/)ace-builds/",\n "(^|/)fontello(.*?)\\\\.css$",\n "(^|/)MathJax/",\n "(^|/)Chart\\\\.js$",\n "(^|/)[Cc]ode[Mm]irror/(\\\\d+\\\\.\\\\d+/)?(lib|mode|theme|addon|keymap|demo)",\n "(^|/)shBrush([^.]*)\\\\.js$",\n "(^|/)shCore\\\\.js$",\n "(^|/)shLegacy\\\\.js$",\n "(^|/)angular([^.]*)\\\\.js$",\n "(^|\\\\/)d3(\\\\.v\\\\d+)?([^.]*)\\\\.js$",\n "(^|/)react(-[^.]*)?\\\\.js$",\n "(^|/)flow-typed/.*\\\\.js$",\n "(^|/)modernizr\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)modernizr\\\\.custom\\\\.\\\\d+\\\\.js$",\n "(^|/)knockout-(\\\\d+\\\\.){3}(debug\\\\.)?js$",\n "(^|/)docs?/_?(build|themes?|templates?|static)/",\n "(^|/)admin_media/",\n "(^|/)env/",\n "(^|/)fabfile\\\\.py$",\n "(^|/)waf$",\n "(^|/)\\\\.osx$",\n "\\\\.xctemplate/",\n "\\\\.imageset/",\n "(^|/)Carthage/",\n "(^|/)Sparkle/",\n "(^|/)Crashlytics\\\\.framework/",\n "(^|/)Fabric\\\\.framework/",\n "(^|/)BuddyBuildSDK\\\\.framework/",\n "(^|/)Realm\\\\.framework",\n "(^|/)RealmSwift\\\\.framework",\n "(^|/)\\\\.gitattributes$",\n "(^|/)\\\\.gitignore$",\n "(^|/)\\\\.gitmodules$",\n "(^|/)gradlew$",\n "(^|/)gradlew\\\\.bat$",\n "(^|/)gradle/wrapper/",\n "(^|/)mvnw$",\n "(^|/)mvnw\\\\.cmd$",\n "(^|/)\\\\.mvn/wrapper/",\n "-vsdoc\\\\.js$",\n "\\\\.intellisense\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.validate(\\\\.unobtrusive)?\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.unobtrusive\\\\-ajax\\\\.js$",\n "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\\\.debug)?\\\\.js$",\n "(^|/)[Pp]ackages\\\\/.+\\\\.\\\\d+\\\\/",\n "(^|/)extjs/.*?\\\\.js$",\n "(^|/)extjs/.*?\\\\.xml$",\n "(^|/)extjs/.*?\\\\.txt$",\n "(^|/)extjs/.*?\\\\.html$",\n "(^|/)extjs/.*?\\\\.properties$",\n "(^|/)extjs/\\\\.sencha/",\n "(^|/)extjs/docs/",\n "(^|/)extjs/builds/",\n "(^|/)extjs/cmd/",\n "(^|/)extjs/examples/",\n "(^|/)extjs/locale/",\n "(^|/)extjs/packages/",\n "(^|/)extjs/plugins/",\n "(^|/)extjs/resources/",\n "(^|/)extjs/src/",\n "(^|/)extjs/welcome/",\n "(^|/)html5shiv\\\\.js$",\n "(^|/)[Tt]ests?/fixtures/",\n "(^|/)[Ss]pecs?/fixtures/",\n "(^|/)cordova([^.]*)\\\\.js$",\n "(^|/)cordova\\\\-\\\\d\\\\.\\\\d(\\\\.\\\\d)?\\\\.js$",\n "(^|/)foundation(\\\\..*)?\\\\.js$",\n "(^|/)Vagrantfile$",\n "(^|/)\\\\.[Dd][Ss]_[Ss]tore$",\n "(^|/)inst/extdata/",\n "(^|/)octicons\\\\.css",\n "(^|/)sprockets-octicons\\\\.scss",\n "(^|/)activator$",\n "(^|/)activator\\\\.bat$",\n "(^|/)proguard\\\\.pro$",\n "(^|/)proguard-rules\\\\.pro$",\n "(^|/)puphpet/",\n "(^|/)\\\\.google_apis/",\n "(^|/)Jenkinsfile$",\n "(^|/)\\\\.gitpod\\\\.Dockerfile$",\n "(^|/)\\\\.github/",\n "(^|/)\\\\.obsidian/",\n "(^|/)\\\\.teamcity/",\n "(^|/)xvba_modules/"\n ]\n}' +TECHDATA = '{\n "_source": {\n "languages": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/languages.yml",\n "vendor": "https://raw.githubusercontent.com/github-linguist/linguist/master/lib/linguist/vendor.yml"\n },\n "fw_deps": {\n "Go": {\n "github.com/gin-gonic/gin": "Gin",\n "github.com/go-chi/chi": "chi",\n "github.com/gofiber/fiber": "Fiber",\n "github.com/gorilla/mux": "Gorilla",\n "github.com/labstack/echo": "Echo",\n "github.com/spf13/cobra": "Cobra",\n "google.golang.org/grpc": "gRPC",\n "gorm.io/gorm": "GORM"\n },\n "PHP": {\n "cakephp/cakephp": "CakePHP",\n "laravel/framework": "Laravel",\n "slim/slim": "Slim",\n "symfony/framework-bundle": "Symfony",\n "symfony/symfony": "Symfony",\n "yiisoft/yii2": "Yii"\n },\n "Python": {\n "aiohttp": "aiohttp",\n "celery": "Celery",\n "click": "Click",\n "django": "Django",\n "djangorestframework": "Django REST",\n "fastapi": "FastAPI",\n "flask": "Flask",\n "httpx": "HTTPX",\n "keras": "Keras",\n "matplotlib": "Matplotlib",\n "numpy": "NumPy",\n "pandas": "pandas",\n "pydantic": "Pydantic",\n "pyramid": "Pyramid",\n "pytest": "pytest",\n "requests": "Requests",\n "sanic": "Sanic",\n "scikit-learn": "scikit-learn",\n "scipy": "SciPy",\n "scrapy": "Scrapy",\n "sqlalchemy": "SQLAlchemy",\n "starlette": "Starlette",\n "tensorflow": "TensorFlow",\n "torch": "PyTorch",\n "tornado": "Tornado",\n "transformers": "Transformers",\n "typer": "Typer"\n },\n "Ruby": {\n "devise": "Devise",\n "hanami": "Hanami",\n "puma": "Puma",\n "rails": "Rails",\n "rspec": "RSpec",\n "sidekiq": "Sidekiq",\n "sinatra": "Sinatra"\n },\n "Rust": {\n "actix-web": "Actix Web",\n "axum": "Axum",\n "bevy": "Bevy",\n "clap": "clap",\n "diesel": "Diesel",\n "rocket": "Rocket",\n "serde": "Serde",\n "tauri": "Tauri",\n "tokio": "Tokio",\n "tonic": "Tonic",\n "warp": "warp"\n },\n "npm": {\n "@angular/core": "Angular",\n "@apollo/client": "Apollo",\n "@babel/core": "Babel",\n "@biomejs/biome": "Biome",\n "@chakra-ui/react": "Chakra UI",\n "@hapi/hapi": "hapi",\n "@ionic/core": "Ionic",\n "@mui/material": "MUI",\n "@nestjs/core": "NestJS",\n "@nx/workspace": "Nx",\n "@playwright/test": "Playwright",\n "@prisma/client": "Prisma",\n "@reduxjs/toolkit": "Redux",\n "@remix-run/react": "Remix",\n "@storybook/angular": "Storybook",\n "@storybook/html": "Storybook",\n "@storybook/preact": "Storybook",\n "@storybook/react": "Storybook",\n "@storybook/svelte": "Storybook",\n "@storybook/vue3": "Storybook",\n "@storybook/web-components": "Storybook",\n "@sveltejs/kit": "SvelteKit",\n "@swc/core": "SWC",\n "@testing-library/dom": "Testing Library",\n "@testing-library/react": "Testing Library",\n "@testing-library/vue": "Testing Library",\n "@trpc/client": "tRPC",\n "@trpc/server": "tRPC",\n "astro": "Astro",\n "bootstrap": "Bootstrap",\n "chart.js": "Chart.js",\n "cypress": "Cypress",\n "d3": "D3",\n "drizzle-orm": "Drizzle",\n "electron": "Electron",\n "esbuild": "esbuild",\n "eslint": "ESLint",\n "expo": "Expo",\n "express": "Express",\n "fastify": "Fastify",\n "gatsby": "Gatsby",\n "graphql": "GraphQL",\n "jest": "Jest",\n "koa": "Koa",\n "mocha": "Mocha",\n "mongoose": "Mongoose",\n "next": "Next.js",\n "nuxt": "Nuxt",\n "nx": "Nx",\n "parcel": "Parcel",\n "playwright": "Playwright",\n "preact": "Preact",\n "prettier": "Prettier",\n "prisma": "Prisma",\n "puppeteer": "Puppeteer",\n "react": "React",\n "react-dom": "React",\n "react-native": "React Native",\n "redux": "Redux",\n "rollup": "Rollup",\n "sequelize": "Sequelize",\n "solid-js": "SolidJS",\n "storybook": "Storybook",\n "styled-components": "styled-components",\n "svelte": "Svelte",\n "tailwindcss": "Tailwind CSS",\n "testcafe": "TestCafe",\n "three": "three.js",\n "turbo": "Turborepo",\n "typeorm": "TypeORM",\n "vite": "Vite",\n "vitest": "Vitest",\n "vue": "Vue",\n "webpack": "webpack",\n "zustand": "Zustand"\n }\n },\n "fw_sentinels_js": [\n [\n "next.config.js",\n "Next.js"\n ],\n [\n "next.config.ts",\n "Next.js"\n ],\n [\n "next.config.mjs",\n "Next.js"\n ],\n [\n "nuxt.config.js",\n "Nuxt"\n ],\n [\n "nuxt.config.ts",\n "Nuxt"\n ],\n [\n "svelte.config.js",\n "Svelte"\n ],\n [\n "astro.config.mjs",\n "Astro"\n ],\n [\n "vue.config.js",\n "Vue"\n ],\n [\n "gatsby-config.js",\n "Gatsby"\n ],\n [\n "angular.json",\n "Angular"\n ]\n ],\n "fw_sentinels_other": [\n [\n "manage.py",\n "Django",\n "Python"\n ],\n [\n "artisan",\n "Laravel",\n "PHP"\n ],\n [\n "config/application.rb",\n "Rails",\n "Ruby"\n ],\n [\n "Dockerfile",\n "Docker",\n "Tools"\n ],\n [\n "docker-compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "docker-compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yml",\n "Docker Compose",\n "Tools"\n ],\n [\n "compose.yaml",\n "Docker Compose",\n "Tools"\n ],\n [\n "Makefile",\n "Make",\n "Tools"\n ],\n [\n "GNUmakefile",\n "Make",\n "Tools"\n ],\n [\n "pnpm-lock.yaml",\n "pnpm",\n "Tools"\n ],\n [\n "yarn.lock",\n "Yarn",\n "Tools"\n ],\n [\n "bun.lockb",\n "Bun",\n "Tools"\n ],\n [\n "bun.lock",\n "Bun",\n "Tools"\n ],\n [\n ".gitlab-ci.yml",\n "GitLab CI",\n "Tools"\n ],\n [\n "vercel.json",\n "Vercel",\n "Tools"\n ],\n [\n "netlify.toml",\n "Netlify",\n "Tools"\n ],\n [\n ".github/workflows/",\n "GitHub Actions",\n "Tools"\n ]\n ],\n "lang": {\n "color": {\n "1C Enterprise": "#814CCC",\n "2-Dimensional Array": "#38761D",\n "4D": "#004289",\n "ABAP": "#E8274B",\n "ABAP CDS": "#555e25",\n "AGS Script": "#B9D9FF",\n "AIDL": "#34EB6B",\n "AL": "#3AA2B5",\n "ALGOL": "#D1E0DB",\n "AMPL": "#E6EFBB",\n "ANTLR": "#9DC3FF",\n "API Blueprint": "#2ACCA8",\n "APL": "#5A8164",\n "ASP.NET": "#9400ff",\n "ATS": "#1ac620",\n "ActionScript": "#882B0F",\n "Ada": "#02f88c",\n "Adblock Filter List": "#800000",\n "Adobe Font Metrics": "#fa0f00",\n "Agda": "#315665",\n "Aiken": "#640ff8",\n "Alloy": "#64C800",\n "Alpine Abuild": "#0D597F",\n "Altium Designer": "#A89663",\n "AngelScript": "#C7D7DC",\n "Answer Set Programming": "#A9CC29",\n "Ant Build System": "#A9157E",\n "Antlers": "#ff269e",\n "ApacheConf": "#d12127",\n "Apex": "#1797c0",\n "Apollo Guidance Computer": "#0B3D91",\n "AppleScript": "#101F1F",\n "Arc": "#aa2afe",\n "AsciiDoc": "#73a0c5",\n "AspectJ": "#a957b0",\n "Assembly": "#6E4C13",\n "Astro": "#ff5a03",\n "Asymptote": "#ff0000",\n "Augeas": "#9CC134",\n "AutoHotkey": "#6594b9",\n "AutoIt": "#1C3552",\n "Avro IDL": "#0040FF",\n "Awk": "#c30e9b",\n "B (Formal Method)": "#8aa8c5",\n "B4X": "#00e4ff",\n "BASIC": "#ff0000",\n "BQN": "#2b7067",\n "Ballerina": "#FF5000",\n "Batchfile": "#C1F12E",\n "Beef": "#a52f4e",\n "Berry": "#15A13C",\n "BibTeX": "#778899",\n "Bicep": "#519aba",\n "Bikeshed": "#5562ac",\n "Bison": "#6A463F",\n "BitBake": "#00bce4",\n "Blade": "#f7523f",\n "BlitzBasic": "#00FFAE",\n "BlitzMax": "#cd6400",\n "Bluespec": "#12223c",\n "Bluespec BH": "#12223c",\n "Boo": "#d4bec1",\n "Boogie": "#c80fa0",\n "Brainfuck": "#2F2530",\n "BrighterScript": "#66AABB",\n "Brightscript": "#662D91",\n "Browserslist": "#ffd539",\n "Bru": "#F4AA41",\n "BuildStream": "#006bff",\n "C": "#555555",\n "C#": "#178600",\n "C++": "#f34b7d",\n "C3": "#2563eb",\n "CAP CDS": "#0092d1",\n "CLIPS": "#00A300",\n "CMake": "#DA3434",\n "COLLADA": "#F1A42B",\n "CQL": "#006091",\n "CSON": "#244776",\n "CSS": "#663399",\n "CSV": "#237346",\n "CUE": "#5886E1",\n "CWeb": "#00007a",\n "Cabal Config": "#483465",\n "Caddyfile": "#22b638",\n "Cadence": "#00ef8b",\n "Cairo": "#ff4a48",\n "Cairo Zero": "#ff4a48",\n "CameLIGO": "#3be133",\n "Cangjie": "#00868B",\n "Cap\'n Proto": "#c42727",\n "Carbon": "#222222",\n "Ceylon": "#dfa535",\n "Chapel": "#8dc63f",\n "ChucK": "#3f8000",\n "Circom": "#707575",\n "Cirru": "#ccccff",\n "Clarion": "#db901e",\n "Clarity": "#5546ff",\n "Classic ASP": "#6a40fd",\n "Clean": "#3F85AF",\n "Click": "#E4E6F3",\n "Clojure": "#db5855",\n "Closure Templates": "#0d948f",\n "Cloud Firestore Security Rules": "#FFA000",\n "Clue": "#0009b5",\n "CodeQL": "#140f46",\n "CoffeeScript": "#244776",\n "ColdFusion": "#ed2cd6",\n "ColdFusion CFC": "#ed2cd6",\n "Common Lisp": "#3fb68b",\n "Common Workflow Language": "#B5314C",\n "Component Pascal": "#B0CE4E",\n "Cooklang": "#E15A29",\n "Crystal": "#000100",\n "Csound": "#1a1a1a",\n "Csound Document": "#1a1a1a",\n "Csound Score": "#1a1a1a",\n "Cuda": "#3A4E3A",\n "Curry": "#531242",\n "Cylc": "#00b3fd",\n "Cypher": "#34c0eb",\n "Cython": "#fedf5b",\n "D": "#ba595e",\n "D2": "#526ee8",\n "DM": "#447265",\n "Dafny": "#FFEC25",\n "Darcs Patch": "#8eff23",\n "Dart": "#00B4AB",\n "Daslang": "#d3d3d3",\n "DataWeave": "#003a52",\n "Debian Package Control File": "#D70751",\n "DenizenScript": "#FBEE96",\n "Dhall": "#dfafff",\n "DirectX 3D File": "#aace60",\n "Dockerfile": "#384d54",\n "Dogescript": "#cca760",\n "Dotenv": "#e5d559",\n "Dune": "#89421e",\n "Dylan": "#6c616e",\n "E": "#ccce35",\n "ECL": "#8a1267",\n "ECLiPSe": "#001d9d",\n "EJS": "#a91e50",\n "EQ": "#a78649",\n "Earthly": "#2af0ff",\n "Easybuild": "#069406",\n "Ecere Projects": "#913960",\n "Ecmarkup": "#eb8131",\n "Edge": "#0dffe0",\n "EdgeQL": "#31A7FF",\n "EditorConfig": "#fff1f2",\n "Eiffel": "#4d6977",\n "Elixir": "#6e4a7e",\n "Elm": "#60B5CC",\n "Elvish": "#55BB55",\n "Elvish Transcript": "#55BB55",\n "Emacs Lisp": "#c065db",\n "EmberScript": "#FFF4F3",\n "Erlang": "#B83998",\n "Euphoria": "#FF790B",\n "F#": "#b845fc",\n "F*": "#572e30",\n "FIGlet Font": "#FFDDBB",\n "FIRRTL": "#2f632f",\n "FLUX": "#88ccff",\n "Factor": "#636746",\n "Fancy": "#7b9db4",\n "Fantom": "#14253c",\n "Faust": "#c37240",\n "Fennel": "#fff3d7",\n "Filebench WML": "#F6B900",\n "FlatBuffers": "#ed284a",\n "Flix": "#d44a45",\n "Fluent": "#ffcc33",\n "Forth": "#341708",\n "Fortran": "#4d41b1",\n "Fortran Free Form": "#4d41b1",\n "FreeBASIC": "#141AC9",\n "FreeMarker": "#0050b2",\n "Frege": "#00cafe",\n "Futhark": "#5f021f",\n "G-code": "#D08CF2",\n "GAML": "#FFC766",\n "GAMS": "#f49a22",\n "GAP": "#0000cc",\n "GCC Machine Description": "#FFCFAB",\n "GDScript": "#355570",\n "GDShader": "#478CBF",\n "GEDCOM": "#003058",\n "GLSL": "#5686a5",\n "GSC": "#FF6800",\n "Game Maker Language": "#71b417",\n "Gemfile.lock": "#701516",\n "Gemini": "#ff6900",\n "Genero 4gl": "#63408e",\n "Genero per": "#d8df39",\n "Genie": "#fb855d",\n "Genshi": "#951531",\n "Gentoo Ebuild": "#9400ff",\n "Gentoo Eclass": "#9400ff",\n "Gerber Image": "#d20b00",\n "Gherkin": "#5B2063",\n "Git Attributes": "#F44D27",\n "Git Commit": "#F44D27",\n "Git Config": "#F44D27",\n "Git Revision List": "#F44D27",\n "Gleam": "#ffaff3",\n "Glimmer JS": "#F5835F",\n "Glimmer TS": "#3178c6",\n "Glyph": "#c1ac7f",\n "Gnuplot": "#f0a9f0",\n "Go": "#00ADD8",\n "Go Checksums": "#00ADD8",\n "Go Module": "#00ADD8",\n "Go Template": "#00ADD8",\n "Go Workspace": "#00ADD8",\n "Godot Resource": "#355570",\n "Golo": "#88562A",\n "Gosu": "#82937f",\n "Grace": "#615f8b",\n "Gradle": "#02303a",\n "Gradle Kotlin DSL": "#02303a",\n "Grammatical Framework": "#ff0000",\n "GraphQL": "#e10098",\n "Graphviz (DOT)": "#2596be",\n "Groovy": "#4298b8",\n "Groovy Server Pages": "#4298b8",\n "HAProxy": "#106da9",\n "HCL": "#844FBA",\n "HIP": "#4F3A4F",\n "HLSL": "#aace60",\n "HOCON": "#9ff8ee",\n "HTML": "#e34c26",\n "HTML+ECR": "#2e1052",\n "HTML+EEX": "#6e4a7e",\n "HTML+ERB": "#701516",\n "HTML+PHP": "#4f5d95",\n "HTML+Razor": "#512be4",\n "HTTP": "#005C9C",\n "HXML": "#f68712",\n "Hack": "#878787",\n "Haml": "#ece2a9",\n "Handlebars": "#f7931e",\n "Harbour": "#0e60e3",\n "Hare": "#9d7424",\n "Haskell": "#5e5086",\n "Haxe": "#df7900",\n "HiveQL": "#dce200",\n "HolyC": "#ffefaf",\n "Hosts File": "#308888",\n "Hurl": "#FF0288",\n "Hy": "#7790B2",\n "IDL": "#a3522f",\n "IGOR Pro": "#0000cc",\n "IL Assembly": "#512BD4",\n "INI": "#d1dbe0",\n "ISPC": "#2D68B1",\n "Idris": "#b30000",\n "Ignore List": "#000000",\n "ImageJ Macro": "#99AAFF",\n "Imba": "#16cec6",\n "Inno Setup": "#264b99",\n "Io": "#a9188d",\n "Ioke": "#078193",\n "Isabelle": "#FEFE00",\n "Isabelle ROOT": "#FEFE00",\n "J": "#9EEDFF",\n "JAR Manifest": "#b07219",\n "JCL": "#d90e09",\n "JFlex": "#DBCA00",\n "JSON": "#292929",\n "JSON with Comments": "#292929",\n "JSON5": "#267CB9",\n "JSONLD": "#0c479c",\n "JSONiq": "#40d47e",\n "Jac": "#FC792D",\n "Jai": "#ab8b4b",\n "Janet": "#0886a5",\n "Jasmin": "#d03600",\n "Java": "#b07219",\n "Java Properties": "#2A6277",\n "Java Server Pages": "#2A6277",\n "Java Template Engine": "#2A6277",\n "JavaScript": "#f1e05a",\n "JavaScript+ERB": "#f1e05a",\n "Jest Snapshot": "#15c213",\n "JetBrains MPS": "#21D789",\n "Jinja": "#a52a22",\n "Jison": "#56b3cb",\n "Jison Lex": "#56b3cb",\n "Jolie": "#843179",\n "Jsonnet": "#0064bd",\n "Julia": "#a270ba",\n "Julia REPL": "#a270ba",\n "Jupyter Notebook": "#DA5B0B",\n "Just": "#384d54",\n "KCL": "#7ABABF",\n "KDL": "#ffb3b3",\n "KFramework": "#4195c5",\n "KRL": "#28430A",\n "Kaitai Struct": "#773b37",\n "KakouneScript": "#6f8042",\n "KerboScript": "#41adf0",\n "KiCad Layout": "#2f4aab",\n "KiCad Legacy Layout": "#2f4aab",\n "KiCad Schematic": "#2f4aab",\n "KoLmafia ASH": "#B9D9B9",\n "Koka": "#215166",\n "Kotlin": "#A97BFF",\n "LFE": "#4C3023",\n "LLVM": "#185619",\n "LOLCODE": "#cc9900",\n "LSL": "#3d9970",\n "LabVIEW": "#fede06",\n "Lambdapi": "#8027a3",\n "Langium": "#2c8c87",\n "Lark": "#2980B9",\n "Lasso": "#999999",\n "Latte": "#f2a542",\n "Leo": "#C4FFC2",\n "Less": "#1d365d",\n "Lex": "#DBCA00",\n "LigoLANG": "#0e74ff",\n "LilyPond": "#9ccc7c",\n "Liquid": "#67b8de",\n "Liquidsoap": "#990066",\n "Literate Agda": "#315665",\n "Literate CoffeeScript": "#244776",\n "Literate Haskell": "#5e5086",\n "LiveCode Script": "#0c5ba5",\n "LiveScript": "#499886",\n "Logtalk": "#295b9a",\n "LookML": "#652B81",\n "Lua": "#000080",\n "Luau": "#00A2FF",\n "M3U": "#179C7D",\n "MATLAB": "#e16737",\n "MAXScript": "#00a6a6",\n "MDX": "#fcb32c",\n "MLIR": "#5EC8DB",\n "MQL4": "#62A8D6",\n "MQL5": "#4A76B8",\n "MTML": "#b7e1f4",\n "Macaulay2": "#d8ffff",\n "Makefile": "#427819",\n "Mako": "#7e858d",\n "Markdown": "#083fa1",\n "Marko": "#42bff2",\n "Mask": "#f97732",\n "Mathematical Programming System": "#0530ad",\n "Max": "#c4a79c",\n "MeTTa": "#6a5acd",\n "Mercury": "#ff2b2b",\n "Mermaid": "#ff3670",\n "Meson": "#007800",\n "Metal": "#8f14e9",\n "MiniYAML": "#ff1111",\n "MiniZinc": "#06a9e6",\n "Mint": "#02b046",\n "Mirah": "#c7a938",\n "Modelica": "#de1d31",\n "Modula-2": "#10253f",\n "Modula-3": "#223388",\n "Mojo": "#ff4c1f",\n "Monkey C": "#8D6747",\n "MoonBit": "#b92381",\n "MoonScript": "#ff4585",\n "Motoko": "#fbb03b",\n "Motorola 68K Assembly": "#005daa",\n "Move": "#4a137a",\n "Mustache": "#724b3b",\n "NCL": "#28431f",\n "NMODL": "#00356B",\n "NPM Config": "#cb3837",\n "NWScript": "#111522",\n "Nasal": "#1d2c4e",\n "Nearley": "#990000",\n "Nemerle": "#3d3c6e",\n "NetLinx": "#0aa0ff",\n "NetLinx+ERB": "#747faa",\n "NetLogo": "#ff6375",\n "NewLisp": "#87AED7",\n "Nextflow": "#3ac486",\n "Nginx": "#009639",\n "Nickel": "#E0C3FC",\n "Nim": "#ffc200",\n "Nit": "#009917",\n "Nix": "#7e7eff",\n "Noir": "#2f1f49",\n "Nu": "#c9df40",\n "NumPy": "#9C8AF9",\n "Nunjucks": "#3d8137",\n "Nushell": "#4E9906",\n "OASv2-json": "#85ea2d",\n "OASv2-yaml": "#85ea2d",\n "OASv3-json": "#85ea2d",\n "OASv3-yaml": "#85ea2d",\n "OCaml": "#ef7a08",\n "OMNeT++ MSG": "#a0e0a0",\n "OMNeT++ NED": "#08607c",\n "ObjectScript": "#424893",\n "Objective-C": "#438eff",\n "Objective-C++": "#6866fb",\n "Objective-J": "#ff0c5a",\n "Odin": "#60AFFE",\n "Omgrofl": "#cabbff",\n "Opal": "#f7ede0",\n "Open Policy Agent": "#7d9199",\n "OpenAPI Specification v2": "#85ea2d",\n "OpenAPI Specification v3": "#85ea2d",\n "OpenCL": "#ed2e2d",\n "OpenEdge ABL": "#5ce600",\n "OpenQASM": "#AA70FF",\n "OpenSCAD": "#e5cd45",\n "Option List": "#476732",\n "Org": "#77aa99",\n "OverpassQL": "#cce2aa",\n "Oxygene": "#cdd0e3",\n "Oz": "#fab738",\n "P4": "#7055b5",\n "PDDL": "#0d00ff",\n "PEG.js": "#234d6b",\n "PHP": "#4F5D95",\n "PLSQL": "#dad8d8",\n "PLpgSQL": "#336790",\n "POV-Ray SDL": "#6bac65",\n "Pact": "#F7A8B8",\n "Pan": "#cc0000",\n "Papyrus": "#6600cc",\n "Parrot": "#f3ca0a",\n "Pascal": "#E3F171",\n "Pawn": "#dbb284",\n "Pep8": "#C76F5B",\n "Perl": "#0298c3",\n "PicoLisp": "#6067af",\n "PigLatin": "#fcd7de",\n "Pike": "#005390",\n "Pip Requirements": "#FFD343",\n "Pkl": "#6b9543",\n "PlantUML": "#fbbd16",\n "PogoScript": "#d80074",\n "Polar": "#ae81ff",\n "Portugol": "#f8bd00",\n "PostCSS": "#dc3a0c",\n "PostScript": "#da291c",\n "PowerBuilder": "#8f0f8d",\n "PowerShell": "#012456",\n "Praat": "#c8506d",\n "Prisma": "#0c344b",\n "Processing": "#0096D8",\n "Procfile": "#3B2F63",\n "Prolog": "#74283c",\n "Promela": "#de0000",\n "Propeller Spin": "#7fa2a7",\n "Pug": "#a86454",\n "Puppet": "#302B6D",\n "PureBasic": "#5a6986",\n "PureScript": "#1D222D",\n "Pyret": "#ee1e10",\n "Python": "#3572A5",\n "Python console": "#3572A5",\n "Python traceback": "#3572A5",\n "Q#": "#fed659",\n "QML": "#44a51c",\n "Qt Script": "#00b841",\n "Quake": "#882233",\n "QuakeC": "#975777",\n "QuickBASIC": "#008080",\n "Quint": "#9d6ce5",\n "R": "#198CE7",\n "RAML": "#77d9fb",\n "RAScript": "#2C97FA",\n "RBS": "#701516",\n "RDoc": "#701516",\n "REXX": "#d90e09",\n "RMarkdown": "#198ce7",\n "RON": "#a62c00",\n "ROS Interface": "#22314e",\n "RPGLE": "#2BDE21",\n "RUNOFF": "#665a4e",\n "Racket": "#3c5caa",\n "Ragel": "#9d5200",\n "Raku": "#0000fb",\n "Rascal": "#fffaa0",\n "ReScript": "#ed5051",\n "Reason": "#ff5847",\n "ReasonLIGO": "#ff5847",\n "Rebol": "#358a5b",\n "Record Jar": "#0673ba",\n "Red": "#f50000",\n "Regular Expression": "#009a00",\n "Ren\'Py": "#ff7f7f",\n "Rez": "#FFDAB3",\n "Ring": "#2D54CB",\n "Riot": "#A71E49",\n "RobotFramework": "#00c0b5",\n "Roc": "#7c38f5",\n "Rocq Prover": "#d0b68c",\n "Roff": "#ecdebe",\n "Roff Manpage": "#ecdebe",\n "Rouge": "#cc0088",\n "RouterOS Script": "#DE3941",\n "Ruby": "#701516",\n "Rust": "#dea584",\n "SAS": "#B34936",\n "SCSS": "#c6538c",\n "SPARQL": "#0C4597",\n "SQF": "#3F3F3F",\n "SQL": "#e38c00",\n "SQLPL": "#e38c00",\n "SRecode Template": "#348a34",\n "STL": "#373b5e",\n "SVG": "#ff9900",\n "Sail": "#259dd5",\n "SaltStack": "#646464",\n "Sass": "#a53b70",\n "Scala": "#c22d40",\n "Scaml": "#bd181a",\n "Scenic": "#fdc700",\n "Scheme": "#1e4aec",\n "Scilab": "#ca0f21",\n "Self": "#0579aa",\n "ShaderLab": "#222c37",\n "Shell": "#89e051",\n "ShellCheck Config": "#cecfcb",\n "Shen": "#120F14",\n "Simple File Verification": "#C9BFED",\n "Singularity": "#64E6AD",\n "Slang": "#1fbec9",\n "Slash": "#007eff",\n "Slice": "#003fa2",\n "Slim": "#2b2b2b",\n "Slint": "#2379F4",\n "SmPL": "#c94949",\n "Smalltalk": "#596706",\n "Smarty": "#f0c040",\n "Smithy": "#c44536",\n "Snakemake": "#419179",\n "Solidity": "#AA6746",\n "SourcePawn": "#f69e1d",\n "SpiceDB Schema": "#a5318a",\n "Squirrel": "#800000",\n "Stan": "#b2011d",\n "Standard ML": "#dc566d",\n "Starlark": "#76d275",\n "Stata": "#1a5f91",\n "StringTemplate": "#3fb34f",\n "Stylus": "#ff6347",\n "SubRip Text": "#9e0101",\n "SugarSS": "#2fcc9f",\n "SuperCollider": "#46390b",\n "SurrealQL": "#ff00a0",\n "Survex data": "#ffcc99",\n "Svelte": "#ff3e00",\n "Sway": "#00F58C",\n "Sweave": "#198ce7",\n "Swift": "#F05138",\n "SystemVerilog": "#DAE1C2",\n "TI Program": "#A0AA87",\n "TL-Verilog": "#C40023",\n "TLA": "#4b0079",\n "TMDL": "#f0c913",\n "TOML": "#9c4221",\n "TSQL": "#e38c00",\n "TSV": "#237346",\n "TSX": "#3178c6",\n "TXL": "#0178b8",\n "Tact": "#48b5ff",\n "Talon": "#333333",\n "Tcl": "#e4cc98",\n "TeX": "#3D6117",\n "Teal": "#00B1BC",\n "Terra": "#00004c",\n "Terraform Template": "#7b42bb",\n "TextGrid": "#c8506d",\n "TextMate Properties": "#df66e4",\n "Textile": "#ffe7ac",\n "Thrift": "#D12127",\n "Toit": "#c2c9fb",\n "Tools": "#a371f7",\n "Tor Config": "#59316b",\n "Tree-sitter Query": "#8ea64c",\n "Turing": "#cf142b",\n "Twig": "#c1d026",\n "TypeScript": "#3178c6",\n "TypeSpec": "#4A3665",\n "Typst": "#239dad",\n "Unified Parallel C": "#4e3617",\n "Unity3D Asset": "#222c37",\n "Uno": "#9933cc",\n "UnrealScript": "#a54c4d",\n "Untyped Plutus Core": "#36adbd",\n "UrWeb": "#ccccee",\n "V": "#4f87c4",\n "VBA": "#867db1",\n "VBScript": "#15dcdc",\n "VCL": "#148AA8",\n "VHDL": "#adb2cb",\n "Vala": "#a56de2",\n "Valve Data Format": "#f26025",\n "Velocity Template Language": "#507cff",\n "Vento": "#ff0080",\n "Verilog": "#b2b7f8",\n "Vim Help File": "#199f4b",\n "Vim Script": "#199f4b",\n "Vim Snippet": "#199f4b",\n "Visual Basic .NET": "#945db7",\n "Visual Basic 6.0": "#2c6353",\n "Volt": "#1F1F1F",\n "Vue": "#41b883",\n "Vyper": "#9F4CF2",\n "WDL": "#42f1f4",\n "WGSL": "#1a5e9a",\n "Web Ontology Language": "#5b70bd",\n "WebAssembly": "#04133b",\n "WebAssembly Interface Type": "#6250e7",\n "Whiley": "#d5c397",\n "Wikitext": "#fc5757",\n "Windows Registry Entries": "#52d5ff",\n "Witcher Script": "#ff0000",\n "Wolfram Language": "#dd1100",\n "Wollok": "#a23738",\n "World of Warcraft Addon Data": "#f7e43f",\n "Wren": "#383838",\n "X10": "#4B6BEF",\n "XC": "#99DA07",\n "XML": "#0060ac",\n "XML Property List": "#0060ac",\n "XQuery": "#5232e7",\n "XSLT": "#EB8CEB",\n "Xmake": "#22a079",\n "Xojo": "#81bd41",\n "Xonsh": "#285EEF",\n "Xtend": "#24255d",\n "YAML": "#cb171e",\n "YARA": "#220000",\n "YASnippet": "#32AB90",\n "Yacc": "#4B6C4B",\n "Yul": "#794932",\n "ZAP": "#0d665e",\n "ZIL": "#dc75e5",\n "ZenScript": "#00BCD1",\n "Zephir": "#118f9e",\n "Zig": "#ec915c",\n "Zimpl": "#d67711",\n "Zmodel": "#ff7100",\n "crontab": "#ead7ac",\n "eC": "#913960",\n "fish": "#4aae47",\n "hoon": "#00b171",\n "iCalendar": "#ec564c",\n "jq": "#c7254e",\n "kvlang": "#1da6e0",\n "mIRC Script": "#3d57c3",\n "mcfunction": "#E22837",\n "mdsvex": "#5f9ea0",\n "mupad": "#244963",\n "nanorc": "#2d004d",\n "nesC": "#94B0C7",\n "ooc": "#b0b77e",\n "q": "#0040cd",\n "reStructuredText": "#141414",\n "sed": "#64b970",\n "templ": "#66D0DD",\n "vCard": "#ee2647",\n "wisp": "#7582D1",\n "xBase": "#403a40"\n },\n "ext": {\n "1": "Roff",\n "1in": "Roff",\n "1m": "Roff",\n "1x": "Roff",\n "2": "Roff",\n "2da": "2-Dimensional Array",\n "3": "Roff",\n "3in": "Roff",\n "3m": "Roff",\n "3p": "Roff",\n "3pm": "Roff",\n "3qt": "Roff",\n "3x": "Roff",\n "4": "Roff",\n "4dform": "JSON",\n "4dm": "4D",\n "4dproject": "JSON",\n "4gl": "Genero 4gl",\n "4th": "Forth",\n "5": "Roff",\n "6": "Roff",\n "6pl": "Raku",\n "6pm": "Raku",\n "7": "Roff",\n "8": "Roff",\n "8xp": "TI Program",\n "8xp.txt": "TI Program",\n "9": "Roff",\n "_coffee": "CoffeeScript",\n "_js": "JavaScript",\n "_ls": "LiveScript",\n "a51": "Assembly",\n "abap": "ABAP",\n "action": "ROS Interface",\n "ada": "Ada",\n "adb": "Ada",\n "adml": "XML",\n "admx": "XML",\n "ado": "Stata",\n "adoc": "AsciiDoc",\n "adp": "Tcl",\n "ads": "Ada",\n "afm": "Adobe Font Metrics",\n "agc": "Assembly",\n "agda": "Agda",\n "ahk": "AutoHotkey",\n "ahkl": "AutoHotkey",\n "aidl": "AIDL",\n "aj": "AspectJ",\n "ak": "Aiken",\n "al": "AL",\n "alg": "ALGOL",\n "als": "Alloy",\n "ampl": "AMPL",\n "angelscript": "AngelScript",\n "anim": "Unity3D Asset",\n "ant": "XML",\n "antlers.html": "Antlers",\n "antlers.php": "Antlers",\n "antlers.xml": "Antlers",\n "apacheconf": "ApacheConf",\n "apex": "Apex",\n "apib": "API Blueprint",\n "apl": "APL",\n "app": "Erlang",\n "app.src": "Erlang",\n "applescript": "AppleScript",\n "arc": "Arc",\n "arr": "Pyret",\n "as": "ActionScript",\n "asax": "ASP.NET",\n "asc": "AGS Script",\n "asciidoc": "AsciiDoc",\n "ascx": "ASP.NET",\n "asd": "Common Lisp",\n "asddls": "ABAP CDS",\n "ash": "KoLmafia ASH",\n "ashx": "ASP.NET",\n "asm": "Assembly",\n "asmx": "ASP.NET",\n "asp": "Classic ASP",\n "aspx": "ASP.NET",\n "asset": "Unity3D Asset",\n "astro": "Astro",\n "asy": "Asymptote",\n "au3": "AutoIt",\n "aug": "Augeas",\n "auk": "Awk",\n "aux": "TeX",\n "avdl": "Avro IDL",\n "avsc": "JSON",\n "aw": "PHP",\n "awk": "Awk",\n "axaml": "XML",\n "axd": "ASP.NET",\n "axi": "NetLinx",\n "axi.erb": "NetLinx+ERB",\n "axml": "XML",\n "axs": "NetLinx",\n "axs.erb": "NetLinx+ERB",\n "b": "Brainfuck",\n "bal": "Ballerina",\n "bas": "B4X",\n "bash": "Shell",\n "bat": "Batchfile",\n "bats": "Shell",\n "bb": "BitBake",\n "bbappend": "BitBake",\n "bbclass": "BitBake",\n "bbx": "TeX",\n "bdy": "PLSQL",\n "be": "Berry",\n "bf": "Beef",\n "bi": "FreeBASIC",\n "bib": "TeX",\n "bibtex": "TeX",\n "bicep": "Bicep",\n "bicepparam": "Bicep",\n "bison": "Yacc",\n "blade": "Blade",\n "blade.php": "Blade",\n "bmx": "BlitzMax",\n "bones": "JavaScript",\n "boo": "Boo",\n "boot": "Clojure",\n "bpl": "Boogie",\n "bqn": "BQN",\n "brd": "KiCad Legacy Layout",\n "brs": "Brightscript",\n "bru": "Bru",\n "bs": "Bluespec",\n "bsl": "1C Enterprise",\n "bst": "BuildStream",\n "bsv": "Bluespec",\n "builder": "Ruby",\n "builds": "XML",\n "bzl": "Starlark",\n "c": "C",\n "c++": "C++",\n "c3": "C3",\n "cabal": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cairo": "Cairo",\n "cake": "C#",\n "capnp": "Cap\'n Proto",\n "carbon": "Carbon",\n "cats": "C",\n "cbx": "TeX",\n "cc": "C++",\n "ccproj": "XML",\n "ccxml": "XML",\n "cdc": "Cadence",\n "cdf": "Wolfram Language",\n "cds": "CAP CDS",\n "ceylon": "Ceylon",\n "cfc": "ColdFusion",\n "cfg": "HAProxy",\n "cfm": "ColdFusion",\n "cfml": "ColdFusion",\n "cgi": "Perl",\n "cginc": "HLSL",\n "ch": "xBase",\n "chpl": "Chapel",\n "circom": "Circom",\n "cirru": "Cirru",\n "cj": "Cangjie",\n "cjs": "JavaScript",\n "cjsx": "CoffeeScript",\n "ck": "ChucK",\n "cl": "C",\n "cl2": "Clojure",\n "clar": "Clarity",\n "click": "Click",\n "clixml": "XML",\n "clj": "Clojure",\n "cljc": "Clojure",\n "cljs": "Clojure",\n "cljs.hl": "Clojure",\n "cljscm": "Clojure",\n "cljx": "Clojure",\n "clp": "CLIPS",\n "cls": "Apex",\n "clue": "Clue",\n "clw": "Clarion",\n "cmake": "CMake",\n "cmake.in": "CMake",\n "cmd": "Batchfile",\n "cmp": "Gerber Image",\n "cnc": "G-code",\n "cnf": "INI",\n "cocci": "SmPL",\n "code-snippets": "JSON",\n "code-workspace": "JSON",\n "coffee": "CoffeeScript",\n "coffee.md": "CoffeeScript",\n "command": "Shell",\n "containerfile": "Dockerfile",\n "cook": "Cooklang",\n "coq": "Rocq Prover",\n "cp": "Component Pascal",\n "cpp": "C++",\n "cppm": "C++",\n "cproject": "XML",\n "cps": "Component Pascal",\n "cql": "CQL",\n "cr": "Crystal",\n "cs": "C#",\n "cs.pp": "C#",\n "csc": "GSC",\n "cscfg": "XML",\n "csd": "Csound Document",\n "csdef": "XML",\n "cshtml": "HTML",\n "csl": "XML",\n "cson": "CSON",\n "csproj": "XML",\n "css": "CSS",\n "csv": "CSV",\n "csx": "C#",\n "ct": "XML",\n "ctl": "Visual Basic 6.0",\n "ctp": "PHP",\n "cts": "TypeScript",\n "cu": "Cuda",\n "cue": "CUE",\n "cuh": "Cuda",\n "curry": "Curry",\n "cwl": "Common Workflow Language",\n "cxx": "C++",\n "cylc": "INI",\n "cyp": "Cypher",\n "cypher": "Cypher",\n "d": "D",\n "d2": "D2",\n "dae": "COLLADA",\n "darcspatch": "Darcs Patch",\n "dart": "Dart",\n "das": "Daslang",\n "dats": "ATS",\n "db2": "SQLPL",\n "dcl": "Clean",\n "ddl": "PLSQL",\n "decls": "BlitzBasic",\n "depproj": "XML",\n "dfm": "Pascal",\n "dfy": "Dafny",\n "dhall": "Dhall",\n "di": "D",\n "dita": "XML",\n "ditamap": "XML",\n "ditaval": "XML",\n "djs": "Dogescript",\n "dll.config": "XML",\n "dlm": "IDL",\n "dm": "DM",\n "do": "Stata",\n "dockerfile": "Dockerfile",\n "dof": "INI",\n "doh": "Stata",\n "dot": "Graphviz (DOT)",\n "dotsettings": "XML",\n "dpatch": "Darcs Patch",\n "dpr": "Pascal",\n "druby": "Mirah",\n "dsc": "DenizenScript",\n "dsp": "Faust",\n "dsr": "Visual Basic 6.0",\n "dtx": "TeX",\n "duby": "Mirah",\n "dwl": "DataWeave",\n "dyalog": "APL",\n "dyl": "Dylan",\n "dylan": "Dylan",\n "e": "E",\n "eb": "Python",\n "ebuild": "Shell",\n "ec": "eC",\n "ecl": "ECL",\n "eclass": "Shell",\n "eclxml": "ECL",\n "ecr": "HTML",\n "ect": "EJS",\n "edge": "Edge",\n "edgeql": "EdgeQL",\n "editorconfig": "INI",\n "eh": "eC",\n "ejs": "EJS",\n "ejs.t": "EJS",\n "el": "Emacs Lisp",\n "eliom": "OCaml",\n "eliomi": "OCaml",\n "elm": "Elm",\n "elv": "Elvish",\n "em": "EmberScript",\n "emacs": "Emacs Lisp",\n "emacs.desktop": "Emacs Lisp",\n "emberscript": "EmberScript",\n "env": "Dotenv",\n "epj": "JavaScript",\n "eps": "PostScript",\n "epsi": "PostScript",\n "eq": "EQ",\n "erb": "HTML",\n "erb.deface": "HTML",\n "erl": "Erlang",\n "es": "Erlang",\n "es6": "JavaScript",\n "escript": "Erlang",\n "esdl": "EdgeQL",\n "ex": "Elixir",\n "exs": "Elixir",\n "eye": "Ruby",\n "f": "Fortran",\n "f03": "Fortran",\n "f08": "Fortran",\n "f77": "Fortran",\n "f90": "Fortran",\n "f95": "Fortran",\n "factor": "Factor",\n "fan": "Fantom",\n "fancypack": "Fancy",\n "fbs": "FlatBuffers",\n "fcgi": "Lua",\n "feature": "Gherkin",\n "filters": "XML",\n "fir": "FIRRTL",\n "fish": "Shell",\n "flex": "Lex",\n "flf": "FIGlet Font",\n "flix": "Flix",\n "flux": "FLUX",\n "fnc": "PLSQL",\n "fnl": "Fennel",\n "for": "Fortran",\n "forth": "Forth",\n "fp": "GLSL",\n "fpp": "Fortran",\n "fr": "Frege",\n "frag": "GLSL",\n "frg": "GLSL",\n "frm": "VBA",\n "frt": "Forth",\n "fs": "F#",\n "fsh": "GLSL",\n "fshader": "GLSL",\n "fsi": "F#",\n "fsproj": "XML",\n "fst": "F*",\n "fsti": "F*",\n "fsx": "F#",\n "fth": "Forth",\n "ftl": "Fluent",\n "ftlh": "FreeMarker",\n "fun": "Standard ML",\n "fut": "Futhark",\n "fx": "FLUX",\n "fxh": "HLSL",\n "fxml": "XML",\n "fy": "Fancy",\n "g": "G-code",\n "g4": "ANTLR",\n "gaml": "GAML",\n "gap": "GAP",\n "gawk": "Awk",\n "gbl": "Gerber Image",\n "gbo": "Gerber Image",\n "gbp": "Gerber Image",\n "gbr": "Gerber Image",\n "gbs": "Gerber Image",\n "gco": "G-code",\n "gcode": "G-code",\n "gd": "GDScript",\n "gdnlib": "Godot Resource",\n "gdns": "Godot Resource",\n "gdshader": "GDShader",\n "gdshaderinc": "GDShader",\n "ged": "GEDCOM",\n "gemspec": "Ruby",\n "geo": "GLSL",\n "geojson": "JSON",\n "geom": "GLSL",\n "gf": "Grammatical Framework",\n "gi": "GAP",\n "gitconfig": "INI",\n "gitignore": "Ignore List",\n "gjs": "JavaScript",\n "gko": "Gerber Image",\n "glade": "XML",\n "gleam": "Gleam",\n "glf": "Glyph",\n "glsl": "GLSL",\n "glslf": "GLSL",\n "glslv": "GLSL",\n "gltf": "JSON",\n "gmi": "Gemini",\n "gml": "Game Maker Language",\n "gms": "GAMS",\n "gmx": "XML",\n "gnu": "Gnuplot",\n "gnuplot": "Gnuplot",\n "go": "Go",\n "god": "Ruby",\n "gohtml": "Go Template",\n "golo": "Golo",\n "gotmpl": "Go Template",\n "gp": "Gnuplot",\n "gpb": "Gerber Image",\n "gpt": "Gerber Image",\n "gpx": "XML",\n "gql": "GraphQL",\n "grace": "Grace",\n "gradle": "Gradle",\n "gradle.kts": "Gradle",\n "graphql": "GraphQL",\n "graphqls": "GraphQL",\n "groovy": "Groovy",\n "grt": "Groovy",\n "grxml": "XML",\n "gs": "Genie",\n "gsc": "GSC",\n "gsh": "GSC",\n "gshader": "GLSL",\n "gsp": "Groovy",\n "gst": "Gosu",\n "gsx": "Gosu",\n "gtl": "Gerber Image",\n "gto": "Gerber Image",\n "gtp": "Gerber Image",\n "gtpl": "Groovy",\n "gts": "TypeScript",\n "gv": "Graphviz (DOT)",\n "gvy": "Groovy",\n "gyp": "Python",\n "gypi": "Python",\n "h": "C",\n "h++": "C++",\n "h.in": "C",\n "ha": "Hare",\n "hack": "Hack",\n "haml": "Haml",\n "haml.deface": "Haml",\n "handlebars": "Handlebars",\n "har": "JSON",\n "hats": "ATS",\n "hb": "Harbour",\n "hbs": "Handlebars",\n "hc": "HolyC",\n "hcl": "HCL",\n "heex": "HTML",\n "hh": "C++",\n "hhi": "Hack",\n "hic": "Clojure",\n "hip": "HIP",\n "hlsl": "HLSL",\n "hlsli": "HLSL",\n "hocon": "HOCON",\n "hoon": "hoon",\n "hpp": "C++",\n "hqf": "SQF",\n "hql": "HiveQL",\n "hrl": "Erlang",\n "hs": "Haskell",\n "hs-boot": "Haskell",\n "hsc": "Haskell",\n "hta": "HTML",\n "htm": "HTML",\n "html": "HTML",\n "html.eex": "HTML",\n "html.hl": "HTML",\n "html.tmpl": "Go Template",\n "http": "HTTP",\n "hurl": "Hurl",\n "hx": "Haxe",\n "hxml": "HXML",\n "hxsl": "Haxe",\n "hxx": "C++",\n "hy": "Hy",\n "hzp": "XML",\n "i": "Assembly",\n "i3": "Modula-3",\n "ical": "iCalendar",\n "ice": "Slice",\n "iced": "CoffeeScript",\n "icl": "Clean",\n "icls": "XML",\n "ics": "iCalendar",\n "idc": "C",\n "idr": "Idris",\n "ig": "Modula-3",\n "ihlp": "Stata",\n "ijm": "ImageJ Macro",\n "ijs": "J",\n "ik": "Ioke",\n "il": "IL Assembly",\n "ily": "LilyPond",\n "imba": "Imba",\n "iml": "XML",\n "inc": "Assembly",\n "ini": "INI",\n "inl": "C++",\n "ino": "C++",\n "ins": "TeX",\n "intr": "Dylan",\n "io": "Io",\n "iol": "Jolie",\n "ipf": "IGOR Pro",\n "ipp": "C++",\n "ipynb": "Jupyter Notebook",\n "isl": "Inno Setup",\n "ispc": "ISPC",\n "iss": "Inno Setup",\n "iuml": "PlantUML",\n "ivy": "XML",\n "ixx": "C++",\n "j": "Jasmin",\n "j2": "Jinja",\n "jac": "Jac",\n "jade": "Pug",\n "jai": "Jai",\n "jake": "JavaScript",\n "janet": "Janet",\n "jav": "Java",\n "java": "Java",\n "javascript": "JavaScript",\n "jbuilder": "Ruby",\n "jcl": "JCL",\n "jelly": "XML",\n "jflex": "Lex",\n "jinja": "Jinja",\n "jinja2": "Jinja",\n "jison": "Yacc",\n "jisonlex": "Lex",\n "jl": "Julia",\n "jq": "JSONiq",\n "js": "JavaScript",\n "js.erb": "JavaScript",\n "jsb": "JavaScript",\n "jscad": "JavaScript",\n "jsfl": "JavaScript",\n "jsh": "Java",\n "jslib": "JavaScript",\n "jsm": "JavaScript",\n "json": "JSON",\n "json-tmlanguage": "JSON",\n "json.example": "JSON",\n "json5": "JSON5",\n "jsonc": "JSON",\n "jsonl": "JSON",\n "jsonld": "JSONLD",\n "jsonnet": "Jsonnet",\n "jsp": "Java",\n "jspre": "JavaScript",\n "jsproj": "XML",\n "jss": "JavaScript",\n "jst": "EJS",\n "jsx": "JavaScript",\n "jte": "Java",\n "just": "Just",\n "k": "KCL",\n "kak": "KakouneScript",\n "kdl": "KDL",\n "kicad_mod": "KiCad Layout",\n "kicad_pcb": "KiCad Layout",\n "kicad_sch": "KiCad Schematic",\n "kicad_sym": "KiCad Schematic",\n "kicad_wks": "KiCad Layout",\n "kid": "Genshi",\n "kk": "Koka",\n "kml": "XML",\n "kojo": "Scala",\n "krl": "KRL",\n "ks": "KerboScript",\n "ksh": "Shell",\n "ksy": "Kaitai Struct",\n "kt": "Kotlin",\n "ktm": "Kotlin",\n "kts": "Kotlin",\n "kv": "kvlang",\n "l": "Common Lisp",\n "lagda": "Agda",\n "langium": "Langium",\n "lark": "Lark",\n "las": "Lasso",\n "lasso": "Lasso",\n "lasso8": "Lasso",\n "lasso9": "Lasso",\n "latte": "Latte",\n "launch": "XML",\n "lbx": "TeX",\n "leex": "HTML",\n "lektorproject": "INI",\n "leo": "Leo",\n "less": "Less",\n "lex": "Lex",\n "lfe": "LFE",\n "lgt": "Logtalk",\n "lhs": "Haskell",\n "libsonnet": "Jsonnet",\n "lid": "Dylan",\n "lidr": "Idris",\n "ligo": "LigoLANG",\n "linq": "C#",\n "liq": "Liquidsoap",\n "liquid": "Liquid",\n "lisp": "Common Lisp",\n "litcoffee": "CoffeeScript",\n "livecodescript": "LiveCode Script",\n "livemd": "Markdown",\n "lkml": "LookML",\n "ll": "LLVM",\n "lmi": "Python",\n "logtalk": "Logtalk",\n "lol": "LOLCODE",\n "lookml": "LookML",\n "lp": "Answer Set Programming",\n "lpr": "Pascal",\n "ls": "LiveScript",\n "lsl": "LSL",\n "lslp": "LSL",\n "lsp": "Common Lisp",\n "ltx": "TeX",\n "lua": "Lua",\n "luau": "Luau",\n "lvclass": "LabVIEW",\n "lvlib": "LabVIEW",\n "lvproj": "LabVIEW",\n "ly": "LilyPond",\n "m": "Objective-C",\n "m2": "Macaulay2",\n "m3": "Modula-3",\n "m3u": "M3U",\n "m3u8": "M3U",\n "ma": "Wolfram Language",\n "mak": "Makefile",\n "make": "Makefile",\n "makefile": "Makefile",\n "mako": "Mako",\n "man": "Roff",\n "mao": "Mako",\n "markdown": "Markdown",\n "marko": "Marko",\n "mask": "Mask",\n "mat": "Unity3D Asset",\n "mata": "Stata",\n "matah": "Stata",\n "mathematica": "Wolfram Language",\n "matlab": "MATLAB",\n "mawk": "Awk",\n "maxhelp": "Max",\n "maxpat": "Max",\n "maxproj": "Max",\n "mbt": "MoonBit",\n "mc": "Monkey C",\n "mcfunction": "mcfunction",\n "mch": "B (Formal Method)",\n "mcmeta": "JSON",\n "mcr": "MAXScript",\n "md": "Markdown",\n "mdoc": "Roff",\n "mdown": "Markdown",\n "mdpolicy": "XML",\n "mdwn": "Markdown",\n "mdx": "MDX",\n "me": "Roff",\n "mediawiki": "Wikitext",\n "mermaid": "Mermaid",\n "meta": "Unity3D Asset",\n "metal": "Metal",\n "metta": "MeTTa",\n "mg": "Modula-3",\n "mint": "Mint",\n "mir": "YAML",\n "mirah": "Mirah",\n "mjml": "XML",\n "mjs": "JavaScript",\n "mk": "Makefile",\n "mkd": "Markdown",\n "mkdn": "Markdown",\n "mkdown": "Markdown",\n "mkfile": "Makefile",\n "mkii": "TeX",\n "mkiv": "TeX",\n "mkvi": "TeX",\n "ml": "OCaml",\n "ml4": "OCaml",\n "mli": "OCaml",\n "mligo": "LigoLANG",\n "mlir": "MLIR",\n "mll": "OCaml",\n "mly": "OCaml",\n "mm": "Objective-C++",\n "mmd": "Mermaid",\n "mo": "Modelica",\n "mod": "Modula-2",\n "mojo": "Mojo",\n "moo": "Mercury",\n "moon": "MoonScript",\n "move": "Move",\n "mpl": "JetBrains MPS",\n "mps": "JetBrains MPS",\n "mq4": "MQL4",\n "mq5": "MQL5",\n "mqh": "MQL4",\n "mrc": "mIRC Script",\n "ms": "MAXScript",\n "msd": "JetBrains MPS",\n "msg": "OMNeT++ MSG",\n "mspec": "Ruby",\n "mt": "Wolfram Language",\n "mtml": "MTML",\n "mts": "TypeScript",\n "mu": "mupad",\n "mud": "ZIL",\n "mustache": "Mustache",\n "mxml": "XML",\n "mxt": "Max",\n "mysql": "SQL",\n "mzn": "MiniZinc",\n "n": "Nemerle",\n "nanorc": "INI",\n "nas": "Nasal",\n "nasm": "Assembly",\n "natvis": "XML",\n "nawk": "Awk",\n "nb": "Wolfram Language",\n "nbp": "Wolfram Language",\n "nc": "nesC",\n "ncl": "NCL",\n "ndproj": "XML",\n "ne": "Nearley",\n "nearley": "Nearley",\n "ned": "OMNeT++ NED",\n "nf": "Nextflow",\n "nginx": "Nginx",\n "nginxconf": "Nginx",\n "nim": "Nim",\n "nim.cfg": "Nim",\n "nimble": "Nim",\n "nimrod": "Nim",\n "nims": "Nim",\n "nit": "Nit",\n "nix": "Nix",\n "njk": "Nunjucks",\n "njs": "JavaScript",\n "nl": "NewLisp",\n "nlogo": "NetLogo",\n "nomad": "HCL",\n "nproj": "XML",\n "nqp": "Raku",\n "nr": "Noir",\n "nse": "Lua",\n "nss": "NWScript",\n "nu": "Nu",\n "numpy": "Python",\n "numpyw": "Python",\n "numsc": "Python",\n "nuspec": "XML",\n "nut": "Squirrel",\n "ny": "Common Lisp",\n "odd": "XML",\n "odin": "Odin",\n "ol": "Jolie",\n "omgrofl": "Omgrofl",\n "ooc": "ooc",\n "opal": "Opal",\n "opencl": "C",\n "orc": "Csound",\n "org": "Org",\n "os": "1C Enterprise",\n "osm": "XML",\n "outjob": "Altium Designer",\n "overpassql": "OverpassQL",\n "owl": "Web Ontology Language",\n "oxygene": "Oxygene",\n "oz": "Oz",\n "p": "OpenEdge ABL",\n "p4": "P4",\n "p6": "Raku",\n "p6l": "Raku",\n "p6m": "Raku",\n "p8": "Lua",\n "pac": "JavaScript",\n "pact": "Pact",\n "pan": "Pan",\n "parrot": "Parrot",\n "pas": "Pascal",\n "pascal": "Pascal",\n "pat": "Max",\n "pb": "PureBasic",\n "pbi": "PureBasic",\n "pbt": "PowerBuilder",\n "pcbdoc": "Altium Designer",\n "pck": "PLSQL",\n "pcss": "CSS",\n "pd_lua": "Lua",\n "pddl": "PDDL",\n "pde": "Processing",\n "peggy": "PEG.js",\n "pegjs": "PEG.js",\n "pep": "Pep8",\n "per": "Genero per",\n "perl": "Perl",\n "pfa": "PostScript",\n "pgsql": "PLpgSQL",\n "ph": "Perl",\n "php": "PHP",\n "php3": "PHP",\n "php4": "PHP",\n "php5": "PHP",\n "phps": "PHP",\n "phpt": "PHP",\n "phtml": "HTML",\n "pig": "PigLatin",\n "pike": "Pike",\n "pkb": "PLSQL",\n "pkgproj": "XML",\n "pkl": "Pkl",\n "pks": "PLSQL",\n "pl": "Perl",\n "pl6": "Raku",\n "plantuml": "PlantUML",\n "plb": "PLSQL",\n "plist": "XML",\n "plot": "Gnuplot",\n "pls": "PLSQL",\n "plsql": "PLSQL",\n "plt": "Gnuplot",\n "pluginspec": "Ruby",\n "plx": "Perl",\n "pm": "Perl",\n "pm6": "Raku",\n "pml": "Promela",\n "pmod": "Pike",\n "podsl": "Common Lisp",\n "podspec": "Ruby",\n "pogo": "PogoScript",\n "polar": "Polar",\n "por": "Portugol",\n "postcss": "CSS",\n "pov": "POV-Ray SDL",\n "pp": "Puppet",\n "pprx": "REXX",\n "praat": "Praat",\n "prawn": "Ruby",\n "prc": "PLSQL",\n "prefab": "Unity3D Asset",\n "prefs": "INI",\n "prg": "xBase",\n "prisma": "Prisma",\n "prjpcb": "Altium Designer",\n "pro": "Prolog",\n "proj": "XML",\n "prolog": "Prolog",\n "properties": "Java Properties",\n "props": "XML",\n "prw": "xBase",\n "ps": "PostScript",\n "ps1": "PowerShell",\n "ps1xml": "XML",\n "psc": "Papyrus",\n "psc1": "XML",\n "psd1": "PowerShell",\n "psgi": "Perl",\n "psm1": "PowerShell",\n "pt": "XML",\n "pubxml": "XML",\n "pug": "Pug",\n "puml": "PlantUML",\n "purs": "PureScript",\n "pwn": "Pawn",\n "pxd": "Cython",\n "pxi": "Cython",\n "py": "Python",\n "py3": "Python",\n "pyde": "Python",\n "pyi": "Python",\n "pyp": "Python",\n "pyt": "Python",\n "pytb": "Python",\n "pyw": "Python",\n "pyx": "Cython",\n "q": "HiveQL",\n "qasm": "OpenQASM",\n "qbs": "QML",\n "qc": "QuakeC",\n "qhelp": "XML",\n "ql": "CodeQL",\n "qll": "CodeQL",\n "qmd": "RMarkdown",\n "qml": "QML",\n "qnt": "Quint",\n "qs": "Q#",\n "r": "R",\n "r2": "Rebol",\n "r3": "Rebol",\n "rabl": "Ruby",\n "rake": "Ruby",\n "raku": "Raku",\n "rakumod": "Raku",\n "raml": "RAML",\n "rascript": "RAScript",\n "razor": "HTML",\n "rb": "Ruby",\n "rbi": "Ruby",\n "rbs": "Ruby",\n "rbuild": "Ruby",\n "rbw": "Ruby",\n "rbx": "Ruby",\n "rbxs": "Lua",\n "rchit": "GLSL",\n "rd": "R",\n "rdf": "XML",\n "rdoc": "RDoc",\n "re": "Reason",\n "reb": "Rebol",\n "rebol": "Rebol",\n "red": "Red",\n "reds": "Red",\n "reek": "YAML",\n "reg": "Windows Registry Entries",\n "regex": "Regular Expression",\n "regexp": "Regular Expression",\n "rego": "Open Policy Agent",\n "rei": "Reason",\n "religo": "LigoLANG",\n "res": "ReScript",\n "resi": "ReScript",\n "resource": "RobotFramework",\n "rest": "reStructuredText",\n "rest.txt": "reStructuredText",\n "resx": "XML",\n "rex": "REXX",\n "rexx": "REXX",\n "rg": "Rouge",\n "rhtml": "HTML",\n "ring": "Ring",\n "riot": "Riot",\n "rkt": "Racket",\n "rktd": "Racket",\n "rktl": "Racket",\n "rl": "Ragel",\n "rmd": "RMarkdown",\n "rmiss": "GLSL",\n "rnh": "RUNOFF",\n "rno": "RUNOFF",\n "rnw": "Sweave",\n "robot": "RobotFramework",\n "roc": "Roc",\n "rockspec": "Lua",\n "roff": "Roff",\n "ron": "RON",\n "ronn": "Markdown",\n "rpgle": "RPGLE",\n "rpy": "Ren\'Py",\n "rq": "SPARQL",\n "rs": "Rust",\n "rs.in": "Rust",\n "rsc": "Rascal",\n "rss": "XML",\n "rst": "reStructuredText",\n "rst.txt": "reStructuredText",\n "rsx": "R",\n "ru": "Ruby",\n "ruby": "Ruby",\n "rviz": "YAML",\n "s": "Assembly",\n "sail": "Sail",\n "sarif": "JSON",\n "sas": "SAS",\n "sass": "Sass",\n "sats": "ATS",\n "sbatch": "Shell",\n "sbt": "Scala",\n "sc": "SuperCollider",\n "scad": "OpenSCAD",\n "scala": "Scala",\n "scaml": "Scaml",\n "scd": "SuperCollider",\n "sce": "Scilab",\n "scenic": "Scenic",\n "sch": "Scheme",\n "schdoc": "Altium Designer",\n "sci": "Scilab",\n "scm": "Scheme",\n "sco": "Csound Score",\n "scpt": "AppleScript",\n "scrbl": "Racket",\n "scss": "SCSS",\n "scxml": "XML",\n "sdc": "Tcl",\n "sed": "sed",\n "self": "Self",\n "sexp": "Common Lisp",\n "sfproj": "XML",\n "sfv": "Simple File Verification",\n "sh": "Shell",\n "sh.in": "Shell",\n "shader": "ShaderLab",\n "shen": "Shen",\n "shproj": "XML",\n "sig": "Standard ML",\n "sj": "Objective-J",\n "sjs": "JavaScript",\n "sl": "Slash",\n "slang": "Slang",\n "sld": "Scheme",\n "slim": "Slim",\n "slint": "Slint",\n "slnx": "XML",\n "sls": "SaltStack",\n "slurm": "Shell",\n "sma": "Pawn",\n "smithy": "Smithy",\n "smk": "Python",\n "sml": "Standard ML",\n "snakefile": "Python",\n "snap": "Jest Snapshot",\n "snip": "Vim Snippet",\n "snippet": "Vim Snippet",\n "snippets": "Vim Snippet",\n "sol": "Solidity",\n "soy": "Closure Templates",\n "sp": "SourcePawn",\n "sparql": "SPARQL",\n "spc": "PLSQL",\n "spec": "Python",\n "spin": "Propeller Spin",\n "sps": "Scheme",\n "sqf": "SQF",\n "sql": "SQL",\n "sqlrpgle": "RPGLE",\n "sra": "PowerBuilder",\n "srdf": "XML",\n "srt": "SRecode Template",\n "sru": "PowerBuilder",\n "srv": "ROS Interface",\n "srw": "PowerBuilder",\n "ss": "Scheme",\n "ssjs": "JavaScript",\n "sss": "SugarSS",\n "st": "Smalltalk",\n "stan": "Stan",\n "star": "Starlark",\n "sthlp": "Stata",\n "stl": "STL",\n "story": "Gherkin",\n "storyboard": "XML",\n "sttheme": "XML",\n "sty": "TeX",\n "styl": "Stylus",\n "sublime-build": "JSON",\n "sublime-color-scheme": "JSON",\n "sublime-commands": "JSON",\n "sublime-completions": "JSON",\n "sublime-keymap": "JSON",\n "sublime-macro": "JSON",\n "sublime-menu": "JSON",\n "sublime-mousemap": "JSON",\n "sublime-project": "JSON",\n "sublime-settings": "JSON",\n "sublime-snippet": "XML",\n "sublime-syntax": "YAML",\n "sublime-theme": "JSON",\n "sublime-workspace": "JSON",\n "sublime_metrics": "JSON",\n "sublime_session": "JSON",\n "surql": "SurrealQL",\n "sv": "SystemVerilog",\n "svelte": "Svelte",\n "svg": "SVG",\n "svh": "SystemVerilog",\n "svx": "mdsvex",\n "sw": "Sway",\n "swift": "Swift",\n "syntax": "YAML",\n "t": "Perl",\n "tab": "SQL",\n "tac": "Python",\n "tact": "Tact",\n "tag": "Java",\n "talon": "Talon",\n "targets": "XML",\n "tcc": "C++",\n "tcl": "Tcl",\n "tcl.in": "Tcl",\n "templ": "templ",\n "tesc": "GLSL",\n "tese": "GLSL",\n "tex": "TeX",\n "textgrid": "TextGrid",\n "textile": "Textile",\n "tf": "HCL",\n "tfstate": "JSON",\n "tfstate.backup": "JSON",\n "tftpl": "HCL",\n "tfvars": "HCL",\n "thor": "Ruby",\n "thrift": "Thrift",\n "thy": "Isabelle",\n "tl": "Teal",\n "tla": "TLA",\n "tlv": "TL-Verilog",\n "tm": "Tcl",\n "tmac": "Roff",\n "tmcommand": "XML",\n "tmdl": "TMDL",\n "tml": "XML",\n "tmlanguage": "XML",\n "tmpl": "Go Template",\n "tmpreferences": "XML",\n "tmsnippet": "XML",\n "tmtheme": "XML",\n "tmux": "Shell",\n "toc": "TeX",\n "tofu": "HCL",\n "toit": "Toit",\n "toml": "TOML",\n "toml.example": "TOML",\n "tool": "Shell",\n "topojson": "JSON",\n "tpb": "PLSQL",\n "tpl": "Smarty",\n "tpp": "C++",\n "tps": "PLSQL",\n "tres": "Godot Resource",\n "trg": "PLSQL",\n "trigger": "Apex",\n "ts": "TypeScript",\n "tscn": "Godot Resource",\n "tsconfig.json": "JSON",\n "tsp": "TypeSpec",\n "tst": "GAP",\n "tsv": "TSV",\n "tsx": "TypeScript",\n "tu": "Turing",\n "twig": "Twig",\n "txl": "TXL",\n "txx": "C++",\n "typ": "Typst",\n "uc": "UnrealScript",\n "udf": "SQL",\n "udo": "Csound",\n "ui": "XML",\n "unity": "Unity3D Asset",\n "uno": "Uno",\n "upc": "C",\n "uplc": "Untyped Plutus Core",\n "ur": "UrWeb",\n "urdf": "XML",\n "url": "INI",\n "urs": "UrWeb",\n "ux": "XML",\n "v": "Verilog",\n "vala": "Vala",\n "vapi": "Vala",\n "vark": "Gosu",\n "vb": "Visual Basic .NET",\n "vba": "VBA",\n "vbhtml": "Visual Basic .NET",\n "vbproj": "XML",\n "vbs": "VBScript",\n "vcf": "vCard",\n "vcl": "VCL",\n "vcxproj": "XML",\n "vdf": "Valve Data Format",\n "veo": "Verilog",\n "vert": "GLSL",\n "vh": "SystemVerilog",\n "vhd": "VHDL",\n "vhdl": "VHDL",\n "vhf": "VHDL",\n "vhi": "VHDL",\n "vho": "VHDL",\n "vhost": "ApacheConf",\n "vhs": "VHDL",\n "vht": "VHDL",\n "vhw": "VHDL",\n "vim": "Vim Script",\n "vimrc": "Vim Script",\n "viw": "SQL",\n "vmb": "Vim Script",\n "volt": "Volt",\n "vrx": "GLSL",\n "vs": "GLSL",\n "vsh": "GLSL",\n "vshader": "GLSL",\n "vsixmanifest": "XML",\n "vssettings": "XML",\n "vstemplate": "XML",\n "vtl": "Velocity Template Language",\n "vto": "Vento",\n "vue": "Vue",\n "vw": "PLSQL",\n "vxml": "XML",\n "vy": "Vyper",\n "w": "CWeb",\n "wast": "WebAssembly",\n "wat": "WebAssembly",\n "watchr": "Ruby",\n "wdl": "WDL",\n "webapp": "JSON",\n "webmanifest": "JSON",\n "wgsl": "WGSL",\n "whiley": "Whiley",\n "wiki": "Wikitext",\n "wikitext": "Wikitext",\n "wisp": "wisp",\n "wit": "WebAssembly Interface Type",\n "wixproj": "XML",\n "wl": "Wolfram Language",\n "wlk": "Wollok",\n "wls": "Wolfram Language",\n "wlt": "Wolfram Language",\n "wlua": "Lua",\n "workbook": "Markdown",\n "workflow": "HCL",\n "wren": "Wren",\n "ws": "Witcher Script",\n "wsdl": "XML",\n "wsf": "XML",\n "wsgi": "Python",\n "wxi": "XML",\n "wxl": "XML",\n "wxs": "XML",\n "x": "DirectX 3D File",\n "x10": "X10",\n "x3d": "XML",\n "x68": "Assembly",\n "xacro": "XML",\n "xaml": "XML",\n "xc": "XC",\n "xdc": "Tcl",\n "xht": "HTML",\n "xhtml": "HTML",\n "xib": "XML",\n "xlf": "XML",\n "xliff": "XML",\n "xmi": "XML",\n "xml": "XML",\n "xml.dist": "XML",\n "xmp": "XML",\n "xojo_code": "Xojo",\n "xojo_menu": "Xojo",\n "xojo_report": "Xojo",\n "xojo_script": "Xojo",\n "xojo_toolbar": "Xojo",\n "xojo_window": "Xojo",\n "xproj": "XML",\n "xpy": "Python",\n "xq": "XQuery",\n "xql": "XQuery",\n "xqm": "XQuery",\n "xquery": "XQuery",\n "xqy": "XQuery",\n "xrl": "Erlang",\n "xsd": "XML",\n "xsh": "Xonsh",\n "xsjs": "JavaScript",\n "xsjslib": "JavaScript",\n "xsl": "XSLT",\n "xslt": "XSLT",\n "xspec": "XML",\n "xtend": "Xtend",\n "xul": "XML",\n "xzap": "ZAP",\n "y": "Yacc",\n "yacc": "Yacc",\n "yaml": "MiniYAML",\n "yaml-tmlanguage": "YAML",\n "yaml.sed": "YAML",\n "yap": "Prolog",\n "yar": "YARA",\n "yara": "YARA",\n "yasnippet": "YASnippet",\n "yml": "YAML",\n "yml.mysql": "YAML",\n "yrl": "Erlang",\n "yul": "Yul",\n "yy": "Yacc",\n "yyp": "JSON",\n "zap": "ZAP",\n "zcml": "XML",\n "zed": "SpiceDB Schema",\n "zep": "Zephir",\n "zig": "Zig",\n "zig.zon": "Zig",\n "zil": "ZIL",\n "zimpl": "Zimpl",\n "zmodel": "Zmodel",\n "zmpl": "Zimpl",\n "zpl": "Zimpl",\n "zs": "ZenScript",\n "zsh": "Shell",\n "zsh-theme": "Shell"\n },\n "filename": {\n ".abbrev_defs": "Emacs Lisp",\n ".ackrc": "Option List",\n ".all-contributorsrc": "JSON",\n ".arcconfig": "JSON",\n ".atomignore": "Ignore List",\n ".auto-changelog": "JSON",\n ".babelignore": "Ignore List",\n ".babelrc": "JSON",\n ".bash_aliases": "Shell",\n ".bash_functions": "Shell",\n ".bash_history": "Shell",\n ".bash_logout": "Shell",\n ".bash_profile": "Shell",\n ".bashrc": "Shell",\n ".browserslistrc": "Browserslist",\n ".buckconfig": "INI",\n ".bzrignore": "Ignore List",\n ".c8rc": "JSON",\n ".clang-format": "YAML",\n ".clang-tidy": "YAML",\n ".clangd": "YAML",\n ".classpath": "XML",\n ".coffeelintignore": "Ignore List",\n ".coveragerc": "INI",\n ".cproject": "XML",\n ".cshrc": "Shell",\n ".cvsignore": "Ignore List",\n ".devcontainer.json": "JSON",\n ".dockerignore": "Ignore List",\n ".easignore": "Ignore List",\n ".editorconfig": "INI",\n ".eleventyignore": "Ignore List",\n ".emacs": "Emacs Lisp",\n ".emacs.desktop": "Emacs Lisp",\n ".env": "Dotenv",\n ".env.ci": "Dotenv",\n ".env.dev": "Dotenv",\n ".env.development": "Dotenv",\n ".env.development.local": "Dotenv",\n ".env.example": "Dotenv",\n ".env.local": "Dotenv",\n ".env.prod": "Dotenv",\n ".env.production": "Dotenv",\n ".env.sample": "Dotenv",\n ".env.staging": "Dotenv",\n ".env.template": "Dotenv",\n ".env.test": "Dotenv",\n ".env.testing": "Dotenv",\n ".envrc": "Shell",\n ".eslintignore": "Ignore List",\n ".eslintrc.json": "JSON",\n ".exrc": "Vim Script",\n ".factor-boot-rc": "Factor",\n ".factor-rc": "Factor",\n ".flake8": "INI",\n ".flaskenv": "Shell",\n ".gclient": "Python",\n ".gemrc": "YAML",\n ".git-blame-ignore-revs": "Git Revision List",\n ".gitattributes": "Git Attributes",\n ".gitconfig": "INI",\n ".gitignore": "Ignore List",\n ".gitmodules": "INI",\n ".gnus": "Emacs Lisp",\n ".gvimrc": "Vim Script",\n ".htaccess": "ApacheConf",\n ".htmlhintrc": "JSON",\n ".ignore": "Ignore List",\n ".imgbotconfig": "JSON",\n ".irbrc": "Ruby",\n ".jscsrc": "JSON",\n ".jshintrc": "JSON",\n ".jslintrc": "JSON",\n ".justfile": "Just",\n ".kshrc": "Shell",\n ".latexmkrc": "Perl",\n ".login": "Shell",\n ".luacheckrc": "Lua",\n ".markdownlintignore": "Ignore List",\n ".nanorc": "INI",\n ".nodemonignore": "Ignore List",\n ".npmignore": "Ignore List",\n ".npmrc": "INI",\n ".nvimrc": "Vim Script",\n ".nycrc": "JSON",\n ".oxlintrc.json": "JSON",\n ".php": "PHP",\n ".php_cs": "PHP",\n ".php_cs.dist": "PHP",\n ".prettierignore": "Ignore List",\n ".profile": "Shell",\n ".project": "XML",\n ".pryrc": "Ruby",\n ".pylintrc": "INI",\n ".rprofile": "R",\n ".rspec": "Option List",\n ".scalafix.conf": "HOCON",\n ".scalafmt.conf": "HOCON",\n ".shellcheckrc": "ShellCheck Config",\n ".simplecov": "Ruby",\n ".spacemacs": "Emacs Lisp",\n ".stylelintignore": "Ignore List",\n ".swcrc": "JSON",\n ".tern-config": "JSON",\n ".tern-project": "JSON",\n ".tm_properties": "TextMate Properties",\n ".tmux.conf": "Shell",\n ".vercelignore": "Ignore List",\n ".vimrc": "Vim Script",\n ".viper": "Emacs Lisp",\n ".vscodeignore": "Ignore List",\n ".watchmanconfig": "JSON",\n ".xinitrc": "Shell",\n ".xsession": "Shell",\n ".yardopts": "Option List",\n ".zlogin": "Shell",\n ".zlogout": "Shell",\n ".zprofile": "Shell",\n ".zshenv": "Shell",\n ".zshrc": "Shell",\n "9fs": "Shell",\n "_emacs": "Emacs Lisp",\n "_helpers.tpl": "Go Template",\n "_vimrc": "Vim Script",\n "abbrev_defs": "Emacs Lisp",\n "ack": "Perl",\n "ackrc": "Option List",\n "ant.xml": "Ant Build System",\n "apache2.conf": "ApacheConf",\n "api-extractor.json": "JSON",\n "apkbuild": "Shell",\n "app.config": "XML",\n "appraisals": "Ruby",\n "bash_aliases": "Shell",\n "bash_logout": "Shell",\n "bash_profile": "Shell",\n "bashrc": "Shell",\n "berksfile": "Ruby",\n "brewfile": "Ruby",\n "browserslist": "Browserslist",\n "bsdmakefile": "Makefile",\n "buck": "Starlark",\n "build": "Starlark",\n "build.bazel": "Starlark",\n "build.xml": "Ant Build System",\n "buildfile": "Ruby",\n "buildozer.spec": "INI",\n "bun.lock": "JSON",\n "cabal.config": "Cabal Config",\n "cabal.project": "Cabal Config",\n "caddyfile": "Caddyfile",\n "cakefile": "CoffeeScript",\n "capfile": "Ruby",\n "cargo.lock": "TOML",\n "cargo.toml.orig": "TOML",\n "cask": "Emacs Lisp",\n "citation.cff": "YAML",\n "cmakelists.txt": "CMake",\n "commit_editmsg": "Git Commit",\n "composer.lock": "JSON",\n "containerfile": "Dockerfile",\n "contents.lr": "Markdown",\n "cpanfile": "Perl",\n "crontab": "crontab",\n "cshrc": "Shell",\n "dangerfile": "Ruby",\n "deliverfile": "Ruby",\n "deno.lock": "JSON",\n "deps": "Python",\n "dev-requirements.txt": "Pip Requirements",\n "devcontainer.json": "JSON",\n "dockerfile": "Dockerfile",\n "dune-project": "Dune",\n "earthfile": "Earthly",\n "eask": "Emacs Lisp",\n "emakefile": "Erlang",\n "eqnrc": "Roff",\n "expr-dist": "R",\n "fakefile": "Fancy",\n "fastfile": "Ruby",\n "firestore.rules": "Cloud Firestore Security Rules",\n "flake.lock": "JSON",\n "fp-lib-table": "KiCad Layout",\n "gemfile": "Ruby",\n "gemfile.lock": "Gemfile.lock",\n "gitignore-global": "Ignore List",\n "gitignore_global": "Ignore List",\n "glide.lock": "YAML",\n "gnumakefile": "Makefile",\n "go.mod": "Go Module",\n "go.sum": "Go Checksums",\n "go.work": "Go Workspace",\n "go.work.sum": "Go Checksums",\n "gopkg.lock": "TOML",\n "gradlew": "Shell",\n "gradlew.bat": "Batchfile",\n "guardfile": "Ruby",\n "gvimrc": "Vim Script",\n "haproxy.cfg": "HAProxy",\n "hosts": "Hosts File",\n "hosts.txt": "Hosts File",\n "httpd.conf": "ApacheConf",\n "installscript.qs": "Qt Script",\n "jakefile": "JavaScript",\n "jarfile": "Ruby",\n "jenkinsfile": "Groovy",\n "jsconfig.json": "JSON",\n "justfile": "Just",\n "kakrc": "KakouneScript",\n "kbuild": "Makefile",\n "kcl.mod": "KCL",\n "kcl.mod.lock": "KCL",\n "kshrc": "Shell",\n "language-configuration.json": "JSON",\n "language-subtag-registry.txt": "Record Jar",\n "latexmkrc": "Perl",\n "lexer.x": "Lex",\n "login": "Shell",\n "m3makefile": "Quake",\n "m3overrides": "Quake",\n "makefile": "Makefile",\n "makefile.am": "Makefile",\n "makefile.boot": "Makefile",\n "makefile.frag": "Makefile",\n "makefile.in": "Makefile",\n "makefile.inc": "Makefile",\n "makefile.pl": "Perl",\n "makefile.sco": "Makefile",\n "makefile.wat": "Makefile",\n "man": "Shell",\n "manifest.mf": "JAR Manifest",\n "mavenfile": "Ruby",\n "mcmod.info": "JSON",\n "meson.build": "Meson",\n "meson_options.txt": "Meson",\n "mise.local.lock": "TOML",\n "mise.lock": "TOML",\n "mix.lock": "Elixir",\n "mkfile": "Makefile",\n "mmn": "Roff",\n "mmt": "Roff",\n "mocha.opts": "Option List",\n "module.bazel": "Starlark",\n "module.bazel.lock": "JSON",\n "modulefile": "Puppet",\n "mvnw": "Shell",\n "mvnw.cmd": "Batchfile",\n "nanorc": "INI",\n "nextflow.config": "Nextflow",\n "nginx.conf": "Nginx",\n "nim.cfg": "Nim",\n "notebook": "Jupyter Notebook",\n "nuget.config": "XML",\n "nukefile": "Nu",\n "nvimrc": "Vim Script",\n "owh": "Tcl",\n "package.resolved": "JSON",\n "packages.config": "XML",\n "pdm.lock": "TOML",\n "phakefile": "PHP",\n "pipfile": "TOML",\n "pipfile.lock": "JSON",\n "pixi.lock": "YAML",\n "pkgbuild": "Shell",\n "podfile": "Ruby",\n "poetry.lock": "TOML",\n "procfile": "Procfile",\n "profile": "Shell",\n "project.ede": "Emacs Lisp",\n "project.godot": "Godot Resource",\n "puppetfile": "Ruby",\n "pylintrc": "INI",\n "rakefile": "Ruby",\n "rebar.config": "Erlang",\n "rebar.config.lock": "Erlang",\n "rebar.lock": "Erlang",\n "requirements-dev.txt": "Pip Requirements",\n "requirements.lock.txt": "Pip Requirements",\n "requirements.txt": "Pip Requirements",\n "rexfile": "Perl",\n "riemann.config": "Clojure",\n "root": "Isabelle",\n "sconscript": "Python",\n "sconstruct": "Python",\n "settings.stylecop": "XML",\n "singularity": "Singularity",\n "slakefile": "LiveScript",\n "snakefile": "Python",\n "snapfile": "Ruby",\n "starfield": "Tcl",\n "steepfile": "Ruby",\n "suite.rc": "INI",\n "thorfile": "Ruby",\n "tiltfile": "Starlark",\n "tmux.conf": "Shell",\n "toolchain_installscript.qs": "Qt Script",\n "torrc": "Tor Config",\n "troffrc": "Roff",\n "troffrc-end": "Roff",\n "tsconfig.json": "JSON",\n "tslint.json": "JSON",\n "uv.lock": "TOML",\n "vagrantfile": "Ruby",\n "vimrc": "Vim Script",\n "vlcrc": "INI",\n "web.config": "XML",\n "web.debug.config": "XML",\n "web.release.config": "XML",\n "workspace": "Starlark",\n "workspace.bazel": "Starlark",\n "workspace.bzlmod": "Starlark",\n "wscript": "Python",\n "xinitrc": "Shell",\n "xmake.lua": "Xmake",\n "xsession": "Shell",\n "yarn.lock": "YAML",\n "zlogin": "Shell",\n "zlogout": "Shell",\n "zprofile": "Shell",\n "zshenv": "Shell",\n "zshrc": "Shell"\n }\n },\n "vendor": [\n "(^|/)cache/",\n "^[Dd]ependencies/",\n "(^|/)dist/",\n "^deps/",\n "(^|/)configure$",\n "(^|/)config\\\\.guess$",\n "(^|/)config\\\\.sub$",\n "(^|/)aclocal\\\\.m4",\n "(^|/)libtool\\\\.m4",\n "(^|/)ltoptions\\\\.m4",\n "(^|/)ltsugar\\\\.m4",\n "(^|/)ltversion\\\\.m4",\n "(^|/)lt~obsolete\\\\.m4",\n "(^|/)dotnet-install\\\\.(ps1|sh)$",\n "(^|/)cpplint\\\\.py",\n "(^|/)node_modules/",\n "(^|/)\\\\.yarn/releases/",\n "(^|/)\\\\.yarn/plugins/",\n "(^|/)\\\\.yarn/sdks/",\n "(^|/)\\\\.yarn/versions/",\n "(^|/)\\\\.yarn/unplugged/",\n "(^|/)_esy$",\n "(^|/)bower_components/",\n "^rebar$",\n "(^|/)erlang\\\\.mk",\n "(^|/)Godeps/_workspace/",\n "(^|/)testdata/",\n "(^|/)\\\\.indent\\\\.pro",\n "(\\\\.|-)min\\\\.(js|css)$",\n "([^\\\\s]*)import\\\\.(css|less|scss|styl)$",\n "(^|/)bootstrap([^/.]*)(\\\\..*)?\\\\.(js|css|less|scss|styl)$",\n "(^|/)custom\\\\.bootstrap([^\\\\s]*)(js|css|less|scss|styl)$",\n "(^|/)font-?awesome\\\\.(css|less|scss|styl)$",\n "(^|/)font-?awesome/.*\\\\.(css|less|scss|styl)$",\n "(^|/)foundation\\\\.(css|less|scss|styl)$",\n "(^|/)normalize\\\\.(css|less|scss|styl)$",\n "(^|/)skeleton\\\\.(css|less|scss|styl)$",\n "(^|/)[Bb]ourbon/.*\\\\.(css|less|scss|styl)$",\n "(^|/)animate\\\\.(css|less|scss|styl)$",\n "(^|/)materialize\\\\.(css|less|scss|styl|js)$",\n "(^|/)select2/.*\\\\.(css|scss|js)$",\n "(^|/)bulma\\\\.(css|sass|scss)$",\n "(3rd|[Tt]hird)[-_]?[Pp]arty/",\n "(^|/)vendors?/",\n "(^|/)[Ee]xtern(als?)?/",\n "(^|/)[Vv]+endor/",\n "^debian/",\n "(^|/)run\\\\.n$",\n "(^|/)bootstrap-datepicker/",\n "(^|/)jquery([^.]*)\\\\.js$",\n "(^|/)jquery\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)jquery\\\\-ui(\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?)?(\\\\.\\\\w+)?\\\\.(js|css)$",\n "(^|/)jquery\\\\.(ui|effects)\\\\.([^.]*)\\\\.(js|css)$",\n "(^|/)jquery\\\\.fn\\\\.gantt\\\\.js",\n "(^|/)jquery\\\\.fancybox\\\\.(js|css)",\n "(^|/)fuelux\\\\.js",\n "(^|/)jquery\\\\.fileupload(-\\\\w+)?\\\\.js$",\n "(^|/)jquery\\\\.dataTables\\\\.js",\n "(^|/)bootbox\\\\.js",\n "(^|/)pdf\\\\.worker\\\\.js",\n "(^|/)slick\\\\.\\\\w+.js$",\n "(^|/)Leaflet\\\\.Coordinates-\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.src\\\\.js$",\n "(^|/)leaflet\\\\.draw-src\\\\.js",\n "(^|/)leaflet\\\\.draw\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.css",\n "(^|/)Control\\\\.FullScreen\\\\.js",\n "(^|/)leaflet\\\\.spin\\\\.js",\n "(^|/)wicket-leaflet\\\\.js",\n "(^|/)\\\\.sublime-project",\n "(^|/)\\\\.sublime-workspace",\n "(^|/)\\\\.vscode/",\n "(^|/)prototype(.*)\\\\.js$",\n "(^|/)effects\\\\.js$",\n "(^|/)controls\\\\.js$",\n "(^|/)dragdrop\\\\.js$",\n "(.*?)\\\\.d\\\\.ts$",\n "(^|/)mootools([^.]*)\\\\d+\\\\.\\\\d+.\\\\d+([^.]*)\\\\.js$",\n "(^|/)dojo\\\\.js$",\n "(^|/)MochiKit\\\\.js$",\n "(^|/)yahoo-([^.]*)\\\\.js$",\n "(^|/)yui([^.]*)\\\\.js$",\n "(^|/)ckeditor\\\\.js$",\n "(^|/)tiny_mce([^.]*)\\\\.js$",\n "(^|/)tiny_mce/(langs|plugins|themes|utils)",\n "(^|/)ace-builds/",\n "(^|/)fontello(.*?)\\\\.css$",\n "(^|/)MathJax/",\n "(^|/)Chart\\\\.js$",\n "(^|/)[Cc]ode[Mm]irror/(\\\\d+\\\\.\\\\d+/)?(lib|mode|theme|addon|keymap|demo)",\n "(^|/)shBrush([^.]*)\\\\.js$",\n "(^|/)shCore\\\\.js$",\n "(^|/)shLegacy\\\\.js$",\n "(^|/)angular([^.]*)\\\\.js$",\n "(^|\\\\/)d3(\\\\.v\\\\d+)?([^.]*)\\\\.js$",\n "(^|/)react(-[^.]*)?\\\\.js$",\n "(^|/)flow-typed/.*\\\\.js$",\n "(^|/)modernizr\\\\-\\\\d\\\\.\\\\d+(\\\\.\\\\d+)?\\\\.js$",\n "(^|/)modernizr\\\\.custom\\\\.\\\\d+\\\\.js$",\n "(^|/)knockout-(\\\\d+\\\\.){3}(debug\\\\.)?js$",\n "(^|/)docs?/_?(build|themes?|templates?|static)/",\n "(^|/)admin_media/",\n "(^|/)env/",\n "(^|/)fabfile\\\\.py$",\n "(^|/)waf$",\n "(^|/)\\\\.osx$",\n "\\\\.xctemplate/",\n "\\\\.imageset/",\n "(^|/)Carthage/",\n "(^|/)Sparkle/",\n "(^|/)Crashlytics\\\\.framework/",\n "(^|/)Fabric\\\\.framework/",\n "(^|/)BuddyBuildSDK\\\\.framework/",\n "(^|/)Realm\\\\.framework",\n "(^|/)RealmSwift\\\\.framework",\n "(^|/)\\\\.gitattributes$",\n "(^|/)\\\\.gitignore$",\n "(^|/)\\\\.gitmodules$",\n "(^|/)gradlew$",\n "(^|/)gradlew\\\\.bat$",\n "(^|/)gradle/wrapper/",\n "(^|/)mvnw$",\n "(^|/)mvnw\\\\.cmd$",\n "(^|/)\\\\.mvn/wrapper/",\n "-vsdoc\\\\.js$",\n "\\\\.intellisense\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.validate(\\\\.unobtrusive)?\\\\.js$",\n "(^|/)jquery([^.]*)\\\\.unobtrusive\\\\-ajax\\\\.js$",\n "(^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\\\.debug)?\\\\.js$",\n "(^|/)[Pp]ackages\\\\/.+\\\\.\\\\d+\\\\/",\n "(^|/)extjs/.*?\\\\.js$",\n "(^|/)extjs/.*?\\\\.xml$",\n "(^|/)extjs/.*?\\\\.txt$",\n "(^|/)extjs/.*?\\\\.html$",\n "(^|/)extjs/.*?\\\\.properties$",\n "(^|/)extjs/\\\\.sencha/",\n "(^|/)extjs/docs/",\n "(^|/)extjs/builds/",\n "(^|/)extjs/cmd/",\n "(^|/)extjs/examples/",\n "(^|/)extjs/locale/",\n "(^|/)extjs/packages/",\n "(^|/)extjs/plugins/",\n "(^|/)extjs/resources/",\n "(^|/)extjs/src/",\n "(^|/)extjs/welcome/",\n "(^|/)html5shiv\\\\.js$",\n "(^|/)[Tt]ests?/fixtures/",\n "(^|/)[Ss]pecs?/fixtures/",\n "(^|/)cordova([^.]*)\\\\.js$",\n "(^|/)cordova\\\\-\\\\d\\\\.\\\\d(\\\\.\\\\d)?\\\\.js$",\n "(^|/)foundation(\\\\..*)?\\\\.js$",\n "(^|/)Vagrantfile$",\n "(^|/)\\\\.[Dd][Ss]_[Ss]tore$",\n "(^|/)inst/extdata/",\n "(^|/)octicons\\\\.css",\n "(^|/)sprockets-octicons\\\\.scss",\n "(^|/)activator$",\n "(^|/)activator\\\\.bat$",\n "(^|/)proguard\\\\.pro$",\n "(^|/)proguard-rules\\\\.pro$",\n "(^|/)puphpet/",\n "(^|/)\\\\.google_apis/",\n "(^|/)Jenkinsfile$",\n "(^|/)\\\\.gitpod\\\\.Dockerfile$",\n "(^|/)\\\\.github/",\n "(^|/)\\\\.obsidian/",\n "(^|/)\\\\.teamcity/",\n "(^|/)xvba_modules/"\n ]\n}' OTHER_LANG = "Other" OTHER_COLOR = "#8b949e"