{
 "root": "/tmp/arena/tenants/2ac01412-00e0-452b-8d75-2c08c7a303a2/sessions/d965684b-fb68-414e-a12f-d122afb25771/workspace/workspace/repo/MD.Viewer",
 "scanned_files": 15,
 "git": {
  "available": true,
  "head": "85d3f54",
  "head_full": "85d3f54d589dd98c7d1d2454bbd5cc7d2ca62938",
  "branch": "main",
  "remote": "https://github.com/paulmann/MD.Viewer.git",
  "commit_count": 157,
  "first_commit": "2026-06-16",
  "last_commit": "2026-10-10",
  "tags": [],
  "tag_count": 0,
  "commit_kinds": {
   "chore": 3,
   "version-bump": 14,
   "other": 67,
   "feat": 45,
   "fix": 18,
   "docs": 10
  },
  "recent_commits": [
   {
    "date": "2026-10-10",
    "subject": "chore: .ragraf/ в .gitignore — локальный индекс RAGRAF не коммитить"
   },
   {
    "date": "2026-10-08",
    "subject": "v2.18.0 (md.php) / v3.14.0 (updater) / v2.11.3 (README): a dash is not a hyphen"
   },
   {
    "date": "2026-10-07",
    "subject": "v2.17.0 (md.php) / v2.7.0 (md.js) / v2.11.0 (settings.js) / v2.9.0 (settings.css): choose the default file sort"
   },
   {
    "date": "2026-10-07",
    "subject": "v2.6.1 (md.js): date columns sort newest-first on the first click"
   },
   {
    "date": "2026-10-07",
    "subject": "v2.16.0 (md.php) / v3.13.0 (updater) / v2.11.2 (README): open Cyrillic paths, end the render loop on \"<\""
   },
   {
    "date": "2026-10-05",
    "subject": "v2.6.0 (md.js) / v2.15.1 (md.php) / v2.10.1 (settings.js) / v2.11.1 (README): one home for copying"
   },
   {
    "date": "2026-10-05",
    "subject": "v2.15.0 (md.php) / v2.10.0 (settings.js) / v2.11.0 (README): copy the source .md"
   },
   {
    "date": "2026-10-05",
    "subject": "v2.14.0 (md.php) / v2.9.0 (settings.js) / v2.10.0 (README): download the source .md"
   },
   {
    "date": "2026-09-28",
    "subject": "v2.13.0: normalise a doubled slash in the request path"
   },
   {
    "date": "2026-09-27",
    "subject": "md.js 2.5.3, upload.js 2.9.1: keep the real host in generated URLs"
   },
   {
    "date": "2026-09-26",
    "subject": "v3.12.0 (updater) / v2.12.0 (md.php) / v2.9.0 (upload.js): per-directory .md.ini"
   },
   {
    "date": "2026-09-26",
    "subject": "v3.11.0: refuse cross-site state changes, keep the product neutral"
   },
   {
    "date": "2026-09-26",
    "subject": "v3.10.1 (updater) / v2.11.0 (md.php): uploads and Save to File follow BROWSE_DIR, and updater.php reads the .md.ini next to md.php"
   },
   {
    "date": "2026-09-26",
    "subject": "v2.10.0: optional BROWSE_DIR in .md.ini selects the directory the viewer browses"
   },
   {
    "date": "2026-09-26",
    "subject": "v2.9.5: asset and updater URLs are relative to the served directory"
   },
   {
    "date": "2026-09-26",
    "subject": "v3.9.0: machine JSON API, pre-install conflict report, assets relocated"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.css"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.css"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.php"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.php"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.php"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.css"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   },
   {
    "date": "2026-09-10",
    "subject": "Update README.md"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.css"
   },
   {
    "date": "2026-09-10",
    "subject": "Update md.js"
   }
  ],
  "authors": [
   "149\tMikhail Deynekin <mid1977@gmail.com>",
   "     7\tzwork <zwork@local>",
   "     1\tAutoCoder <autocoder@openclaw.local>"
  ]
 },
 "license": {
  "file": "LICENSE",
  "type": "MIT",
  "copyright": "Copyright (c) 2026 Mikhail Deynekin",
  "extra_clauses": [
   "Repository: https://github.com/paulmann/MD.Viewer",
   "1. The above copyright notice, this permission notice, and the repository",
   "link above shall be included in all copies or substantial portions",
   "visible reference to the original repository:"
  ],
  "bytes": 1544
 },
 "dependencies": {
  "manifests_found": {},
  "no_manifest": true,
  "declared": []
 },
 "totals": {
  "files": 15,
  "bytes": 579661,
  "code_files": 9,
  "code_lines": 11781,
  "by_extension": {
   ".js": 4,
   ".ps1": 3,
   ".css": 3,
   ".php": 2,
   "(none)": 2,
   ".md": 1
  },
  "lines_by_extension": {
   ".php": 7508,
   ".js": 2314,
   ".ps1": 1959,
   ".css": 1217,
   ".md": 554,
   "(none)": 37
  }
 },
 "largest_files": [
  {
   "path": "md.php",
   "bytes": 202145,
   "lines": 4709
  },
  {
   "path": "updater.php",
   "bytes": 111768,
   "lines": 2799
  },
  {
   "path": "tools/Invoke-ProjectDoctrine.ps1",
   "bytes": 56696,
   "lines": 1383
  },
  {
   "path": "js/md/settings.js",
   "bytes": 54747,
   "lines": 1063
  },
  {
   "path": "css/md/md.css",
   "bytes": 17171,
   "lines": 705
  },
  {
   "path": "js/md/md.js",
   "bytes": 30480,
   "lines": 697
  },
  {
   "path": "README.md",
   "bytes": 26614,
   "lines": 554
  },
  {
   "path": "tools/Test-DoctrineFalsifiability.ps1",
   "bytes": 17380,
   "lines": 417
  },
  {
   "path": "css/md/settings.css",
   "bytes": 21774,
   "lines": 407
  },
  {
   "path": "js/md/tooltips.js",
   "bytes": 15345,
   "lines": 317
  },
  {
   "path": "js/md/upload.js",
   "bytes": 12116,
   "lines": 237
  },
  {
   "path": "tools/Test-ViewerRobustness.ps1",
   "bytes": 7274,
   "lines": 159
  },
  {
   "path": "css/md/tooltips.css",
   "bytes": 4479,
   "lines": 105
  },
  {
   "path": "LICENSE",
   "bytes": 1550,
   "lines": 35
  },
  {
   "path": ".gitignore",
   "bytes": 122,
   "lines": 2
  }
 ],
 "entry_points": [],
 "docs": [
  "README.md"
 ],
 "version_markers": [
  {
   "path": "updater.php",
   "version": "3.14.0"
  },
  {
   "path": "README.md",
   "version": "2.11.3"
  },
  {
   "path": "md.php",
   "version": "2.18.0"
  },
  {
   "path": "LICENSE",
   "version": "1.0.0"
  },
  {
   "path": "css/md/tooltips.css",
   "version": "2.4.5"
  },
  {
   "path": "css/md/md.css",
   "version": "2.2.2"
  },
  {
   "path": "css/md/settings.css",
   "version": "2.9.0"
  },
  {
   "path": "js/md/md.js",
   "version": "2.7.0"
  },
  {
   "path": "js/md/upload.js",
   "version": "2.9.1"
  },
  {
   "path": "js/md/tooltips.js",
   "version": "2.4.5"
  },
  {
   "path": "js/md/settings.js",
   "version": "2.11.0"
  }
 ],
 "external_hosts": {
  "Deynekin.com": [
   {
    "url": "https://Deynekin.com",
    "in": "updater.php"
   },
   {
    "url": "https://Deynekin.com",
    "in": "md.php"
   },
   {
    "url": "https://Deynekin.com",
    "in": "css/md/tooltips.css"
   },
   {
    "url": "https://Deynekin.com",
    "in": "css/md/md.css"
   },
   {
    "url": "https://Deynekin.com",
    "in": "js/md/md.js"
   },
   {
    "url": "https://Deynekin.com",
    "in": "js/md/tooltips.js"
   }
  ],
  "your-domain.com": [
   {
    "url": "https://your-domain.com/docs/md.php",
    "in": "README.md"
   },
   {
    "url": "https://your-domain.com/updater.php?api_key=",
    "in": "README.md"
   },
   {
    "url": "https://your-domain.com/updater.php?restore=2.7.0",
    "in": "README.md"
   },
   {
    "url": "https://your-domain.com/updater.php?restore=latest",
    "in": "README.md"
   },
   {
    "url": "https://your-domain.com/updater.php?update=true",
    "in": "README.md"
   },
   {
    "url": "https://your-domain.com/updater.php?update=true&force=true",
    "in": "README.md"
   }
  ],
  "github.com": [
   {
    "url": "https://github.com/paulmann/MD.Viewer.git",
    "in": "README.md"
   },
   {
    "url": "https://github.com/paulmann/MD.Viewer/blob/main/LICENSE",
    "in": "README.md"
   },
   {
    "url": "https://github.com/paulmann/MD.Viewer",
    "in": "md.php"
   },
   {
    "url": "https://github.com/paulmann/MD.Viewer/blob/main/LICENSE",
    "in": "md.php"
   },
   {
    "url": "https://github.com/paulmann/MD.Viewer",
    "in": "LICENSE"
   }
  ],
  "img.shields.io": [
   {
    "url": "https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/paulmann/MD.Viewer/blob/main/LICENSE",
    "in": "README.md"
   },
   {
    "url": "https://img.shields.io/badge/PHP-8.3%2B-777BB4?logo=php&logoColor=white)](https://php.net",
    "in": "README.md"
   },
   {
    "url": "https://img.shields.io/badge/md.php-v2.18.0-success)](https://github.com/paulmann/MD.Viewer",
    "in": "README.md"
   },
   {
    "url": "https://img.shields.io/badge/updater.php-v3.14.0-4f46e5)](https://github.com/paulmann/MD.Viewer",
    "in": "README.md"
   }
  ],
  "raw.githubusercontent.com": [
   {
    "url": "https://raw.githubusercontent.com/paulmann/MD.Viewer/refs/heads/main",
    "in": "updater.php"
   },
   {
    "url": "https://raw.githubusercontent.com/paulmann/MD.Viewer/main/updater.php",
    "in": "README.md"
   }
  ],
  "fonts.googleapis.com": [
   {
    "url": "https://fonts.googleapis.com",
    "in": "md.php"
   },
   {
    "url": "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Sora:wght@600;700;800&display=swap",
    "in": "md.php"
   }
  ],
  "cdn.tailwindcss.com": [
   {
    "url": "https://cdn.tailwindcss.com",
    "in": "md.php"
   }
  ],
  "fonts.gstatic.com": [
   {
    "url": "https://fonts.gstatic.com",
    "in": "md.php"
   }
  ],
  "127.0.0.1:$Port": [
   {
    "url": "http://127.0.0.1:$Port/md.php",
    "in": "tools/Test-ViewerRobustness.ps1"
   }
  ],
  "cdn.jsdelivr.net": [
   {
    "url": "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs",
    "in": "js/md/md.js"
   }
  ]
 },
 "security_signals": {
  "output-escaping": {
   "count": 211,
   "files": [
    "js/md/upload.js",
    "md.php",
    "tools/Invoke-ProjectDoctrine.ps1",
    "tools/Test-DoctrineFalsifiability.ps1",
    "updater.php"
   ]
  },
  "path-validation": {
   "count": 100,
   "files": [
    "README.md",
    "js/md/md.js",
    "js/md/settings.js",
    "js/md/upload.js",
    "md.php",
    "tools/Invoke-ProjectDoctrine.ps1",
    "tools/Test-ViewerRobustness.ps1",
    "updater.php"
   ]
  },
  "auth": {
   "count": 78,
   "files": [
    "README.md",
    "js/md/md.js",
    "md.php",
    "updater.php"
   ]
  },
  "raw-html-passthrough": {
   "count": 18,
   "files": [
    "js/md/md.js",
    "js/md/settings.js",
    "js/md/tooltips.js",
    "tools/Invoke-ProjectDoctrine.ps1",
    "tools/Test-DoctrineFalsifiability.ps1"
   ]
  },
  "file-upload": {
   "count": 12,
   "files": [
    "js/md/upload.js",
    "updater.php"
   ]
  },
  "crypto": {
   "count": 10,
   "files": [
    "updater.php"
   ]
  },
  "security-headers": {
   "count": 4,
   "files": [
    "README.md",
    "md.php",
    "updater.php"
   ]
  },
  "exec-shell": {
   "count": 4,
   "files": [
    "js/md/md.js"
   ]
  },
  "tls-options": {
   "count": 1,
   "files": [
    "updater.php"
   ]
  },
  "signature-verify": {
   "count": 1,
   "files": [
    "tools/Invoke-ProjectDoctrine.ps1"
   ]
  }
 },
 "config_keys": [
  {
   "kind": "superglobal",
   "key": "REQUEST_METHOD",
   "occurrences": 6
  },
  {
   "kind": "superglobal",
   "key": "force",
   "occurrences": 4
  },
  {
   "kind": "superglobal",
   "key": "DOCUMENT_ROOT",
   "occurrences": 3
  },
  {
   "kind": "superglobal",
   "key": "update",
   "occurrences": 3
  },
  {
   "kind": "superglobal",
   "key": "REQUEST_URI",
   "occurrences": 3
  },
  {
   "kind": "superglobal",
   "key": "action",
   "occurrences": 3
  },
  {
   "kind": "ini-key",
   "key": "DISABLE_UPLOAD",
   "occurrences": 3
  },
  {
   "kind": "superglobal",
   "key": "file",
   "occurrences": 3
  },
  {
   "kind": "const",
   "key": "MDV_PER_DIR_KEYS",
   "occurrences": 2
  },
  {
   "kind": "js-const",
   "key": "MDV_PER_DIR_KEYS",
   "occurrences": 2
  },
  {
   "kind": "const",
   "key": "MDV_INSTALL_KEYS",
   "occurrences": 2
  },
  {
   "kind": "js-const",
   "key": "MDV_INSTALL_KEYS",
   "occurrences": 2
  },
  {
   "kind": "const",
   "key": "MDV_FLAG_DEFAULTS",
   "occurrences": 2
  },
  {
   "kind": "js-const",
   "key": "MDV_FLAG_DEFAULTS",
   "occurrences": 2
  },
  {
   "kind": "superglobal",
   "key": "restore",
   "occurrences": 2
  },
  {
   "kind": "superglobal",
   "key": "md_file",
   "occurrences": 2
  },
  {
   "kind": "superglobal",
   "key": "content",
   "occurrences": 2
  },
  {
   "kind": "ini-key",
   "key": "DISABLE_CLIPBOARD",
   "occurrences": 2
  },
  {
   "kind": "ini-key",
   "key": "DISABLE_SAVE_CLIPBOARD_TO_FILE",
   "occurrences": 2
  },
  {
   "kind": "ini-key",
   "key": "ALLOW_UPDATE",
   "occurrences": 2
  },
  {
   "kind": "ini-key",
   "key": "ALLOW_RESTORE",
   "occurrences": 2
  },
  {
   "kind": "ini-key",
   "key": "ALLOW_CREATE_INDEX_PHP_LINK",
   "occurrences": 2
  },
  {
   "kind": "const",
   "key": "SORT_KEYS",
   "occurrences": 2
  },
  {
   "kind": "js-const",
   "key": "SORT_KEYS",
   "occurrences": 2
  },
  {
   "kind": "const",
   "key": "SORT_DIRECTIONS",
   "occurrences": 2
  },
  {
   "kind": "js-const",
   "key": "SORT_DIRECTIONS",
   "occurrences": 2
  },
  {
   "kind": "const",
   "key": "RAW_BASE",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "RAW_BASE",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "TRACKED_FILES",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "TRACKED_FILES",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "CONFLICT_SCAN_SKIP_DIRS",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "CONFLICT_SCAN_SKIP_DIRS",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "CONFLICT_SCAN_MAX_FILES",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "CONFLICT_SCAN_MAX_FILES",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_RETURNTRANSFER",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_FOLLOWLOCATION",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_TIMEOUT",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_CONNECTTIMEOUT",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_HTTPHEADER",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_SSL_VERIFYPEER",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_ENCODING",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "CURLOPT_HEADERFUNCTION",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MDV_DIR_MAX_LENGTH",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MDV_DIR_MAX_LENGTH",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MDV_DIR_MAX_DEPTH",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MDV_DIR_MAX_DEPTH",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "dir",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "api_key",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "format",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "_phase",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "HTTP_HOST",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "SERVER_NAME",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "version",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "UPLOAD_ERR_INI_SIZE",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "UPLOAD_ERR_FORM_SIZE",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "UPLOAD_ERR_PARTIAL",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "UPLOAD_ERR_NO_FILE",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "UPLOAD_ERR_NO_TMP_DIR",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "UPLOAD_ERR_CANT_WRITE",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "UPLOAD_ERR_EXTENSION",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "filename",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "API_KEY",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "ALLOW_UPDATE",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "ALLOW_RESTORE",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "ALLOW_CREATE_INDEX_PHP_LINK",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "BROWSE_DIR",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "AUTO_NUMBERING",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "AUTO_TOC",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "AUTO_FOOTNOTES_LINKS",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "DOUBLE_LINE_BREAKS",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "CYPHER_PATTERNS",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "UNIVERSAL_PATTERNS",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_IMAGES",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_REF_LINKS",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_TASK_LISTS",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_FOOTNOTES",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_SUBSUP",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_EMOJI",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "SPLIT_TITLE_BY_COLON",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "GLOSSARY_TOOLTIPS",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_DOWNLOAD_ICON",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_DOWNLOAD_BUTTON",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "FEATURE_COPY_BUTTON",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "COOKIE_ACCEPT",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "PARAGRAPH_BREAK_STYLE",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MAX_FILE_PARAM_LENGTH",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MAX_FILE_PARAM_LENGTH",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MAX_SCAN_DEPTH",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MAX_SCAN_DEPTH",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MAX_FILES_SCAN",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MAX_FILES_SCAN",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "SORT_DEFAULT_KEY",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "SORT_DEFAULT_KEY",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "SORT_DEFAULT_DIR",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "SORT_DEFAULT_DIR",
   "occurrences": 1
  },
  {
   "kind": "superglobal",
   "key": "download",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "DISABLE_UPLOAD",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "DISABLE_CLIPBOARD",
   "occurrences": 1
  },
  {
   "kind": "php-define",
   "key": "DISABLE_SAVE_CLIPBOARD_TO_FILE",
   "occurrences": 1
  },
  {
   "kind": "ini-key",
   "key": "BROWSE_DIR",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "THEME_KEY",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "THEME_KEY",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MDV_MERMAID_REPAIR_VERSION",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MDV_MERMAID_REPAIR_VERSION",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MERMAID_NODE_SHAPES",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MERMAID_NODE_SHAPES",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MERMAID_KEYWORD_LINE",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MERMAID_KEYWORD_LINE",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "MERMAID_SEQUENCE_ARROW",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "MERMAID_SEQUENCE_ARROW",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "NUMERIC_KEYS",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "NUMERIC_KEYS",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "FIRST_DIRECTION",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "FIRST_DIRECTION",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "SHOW_DELAY",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "SHOW_DELAY",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "HIDE_DELAY",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "HIDE_DELAY",
   "occurrences": 1
  },
  {
   "kind": "const",
   "key": "GAP",
   "occurrences": 1
  },
  {
   "kind": "js-const",
   "key": "GAP",
   "occurrences": 1
  }
 ],
 "symbols_by_file": {
  "updater.php": [
   {
    "line": 149,
    "kind": "class",
    "name": "RawFileUpdater"
   },
   {
    "line": 436,
    "kind": "function",
    "name": "docRoot"
   },
   {
    "line": 453,
    "kind": "function",
    "name": "readIni"
   },
   {
    "line": 543,
    "kind": "function",
    "name": "requireAllowUpdate"
   },
   {
    "line": 551,
    "kind": "function",
    "name": "requireAllowRestore"
   },
   {
    "line": 559,
    "kind": "function",
    "name": "requireAllowIndexLink"
   },
   {
    "line": 567,
    "kind": "function",
    "name": "localPath"
   },
   {
    "line": 581,
    "kind": "function",
    "name": "browseDirValue"
   },
   {
    "line": 616,
    "kind": "function",
    "name": "resolveBrowseDir"
   },
   {
    "line": 657,
    "kind": "function",
    "name": "destinationDir"
   },
   {
    "line": 731,
    "kind": "function",
    "name": "insideRoot"
   },
   {
    "line": 748,
    "kind": "function",
    "name": "dirSegments"
   },
   {
    "line": 808,
    "kind": "function",
    "name": "dirIniValues"
   },
   {
    "line": 877,
    "kind": "function",
    "name": "effectiveFlags"
   },
   {
    "line": 936,
    "kind": "function",
    "name": "writeRoot"
   },
   {
    "line": 957,
    "kind": "function",
    "name": "requestDirSegments"
   },
   {
    "line": 991,
    "kind": "function",
    "name": "dirInRoot"
   },
   {
    "line": 1013,
    "kind": "function",
    "name": "backupRoot"
   },
   {
    "line": 1018,
    "kind": "function",
    "name": "backupDir"
   },
   {
    "line": 1024,
    "kind": "function",
    "name": "stateDir"
   },
   {
    "line": 1029,
    "kind": "function",
    "name": "stateFile"
   },
   {
    "line": 1036,
    "kind": "function",
    "name": "rawUrl"
   },
   {
    "line": 1041,
    "kind": "function",
    "name": "extractVersion"
   },
   {
    "line": 1049,
    "kind": "function",
    "name": "localVersion"
   },
   {
    "line": 1060,
    "kind": "function",
    "name": "backupFile"
   },
   {
    "line": 1070,
    "kind": "function",
    "name": "atomicWrite"
   },
   {
    "line": 1080,
    "kind": "function",
    "name": "makeUpdater"
   },
   {
    "line": 1090,
    "kind": "function",
    "name": "jsonError"
   },
   {
    "line": 1105,
    "kind": "function",
    "name": "generateApiKey"
   },
   {
    "line": 1111,
    "kind": "function",
    "name": "apiKeyFromRequest"
   },
   {
    "line": 1123,
    "kind": "function",
    "name": "jsonApiRequested"
   },
   {
    "line": 1133,
    "kind": "function",
    "name": "apiParam"
   },
   {
    "line": 1141,
    "kind": "function",
    "name": "isTruthy"
   },
   {
    "line": 1150,
    "kind": "function",
    "name": "mdViewerVersion"
   },
   {
    "line": 1157,
    "kind": "function",
    "name": "installManifest"
   },
   {
    "line": 1170,
    "kind": "function",
    "name": "isManagedFile"
   },
   {
    "line": 1187,
    "kind": "function",
    "name": "writeBlockedReason"
   },
   {
    "line": 1207,
    "kind": "function",
    "name": "indexTargetFileNames"
   },
   {
    "line": 1262,
    "kind": "function",
    "name": "detectInstallConflicts"
   },
   {
    "line": 1302,
    "kind": "function",
    "name": "conflictCounts"
   },
   {
    "line": 1313,
    "kind": "function",
    "name": "conflictSummary"
   },
   {
    "line": 1332,
    "kind": "function",
    "name": "installDecision"
   },
   {
    "line": 1364,
    "kind": "function",
    "name": "apiStep"
   },
   {
    "line": 1370,
    "kind": "function",
    "name": "elapsedMs"
   },
   {
    "line": 1399,
    "kind": "function",
    "name": "jsonApiSend"
   },
   {
    "line": 1416,
    "kind": "function",
    "name": "handleJsonApi"
   },
   {
    "line": 1446,
    "kind": "function",
    "name": "jsonApiDispatch"
   },
   {
    "line": 1512,
    "kind": "function",
    "name": "jsonApiStatus"
   },
   {
    "line": 1557,
    "kind": "function",
    "name": "jsonApiConflicts"
   },
   {
    "line": 1585,
    "kind": "function",
    "name": "jsonApiInstall"
   },
   {
    "line": 1965,
    "kind": "function",
    "name": "outputUpdatePage"
   },
   {
    "line": 2087,
    "kind": "function",
    "name": "hostFromUrl"
   },
   {
    "line": 2097,
    "kind": "function",
    "name": "requestHost"
   },
   {
    "line": 2114,
    "kind": "function",
    "name": "sameOriginViolation"
   },
   {
    "line": 2139,
    "kind": "function",
    "name": "requireSameOrigin"
   },
   {
    "line": 2209,
    "kind": "function",
    "name": "doVersion"
   },
   {
    "line": 2215,
    "kind": "function",
    "name": "doBackups"
   },
   {
    "line": 2245,
    "kind": "function",
    "name": "doCheck"
   },
   {
    "line": 2302,
    "kind": "function",
    "name": "doApply"
   },
   {
    "line": 2352,
    "kind": "function",
    "name": "doRestore"
   },
   {
    "line": 2412,
    "kind": "function",
    "name": "indexPath"
   },
   {
    "line": 2421,
    "kind": "function",
    "name": "indexIsLinked"
   },
   {
    "line": 2429,
    "kind": "function",
    "name": "doIndexStatus"
   },
   {
    "line": 2447,
    "kind": "function",
    "name": "doIndexCreate"
   },
   {
    "line": 2476,
    "kind": "function",
    "name": "doIndexRemove"
   },
   {
    "line": 2491,
    "kind": "function",
    "name": "doUploadMd"
   },
   {
    "line": 2591,
    "kind": "function",
    "name": "doSaveClipboard"
   }
  ],
  "md.php": [
   {
    "line": 512,
    "kind": "function",
    "name": "feat"
   },
   {
    "line": 661,
    "kind": "function",
    "name": "validateRequestedFile"
   },
   {
    "line": 785,
    "kind": "function",
    "name": "mdvInsideRoot"
   },
   {
    "line": 801,
    "kind": "function",
    "name": "mdvDirSegments"
   },
   {
    "line": 857,
    "kind": "function",
    "name": "mdvReadDirIni"
   },
   {
    "line": 926,
    "kind": "function",
    "name": "mdvEffectiveFlags"
   },
   {
    "line": 981,
    "kind": "function",
    "name": "mdvRequestedDir"
   },
   {
    "line": 1028,
    "kind": "function",
    "name": "stripCodeBlocks"
   },
   {
    "line": 1101,
    "kind": "function",
    "name": "restoreCodeBlocks"
   },
   {
    "line": 1120,
    "kind": "function",
    "name": "scanMarkdownFiles"
   },
   {
    "line": 1221,
    "kind": "function",
    "name": "formatFileSize"
   },
   {
    "line": 1232,
    "kind": "function",
    "name": "formatDateTime"
   },
   {
    "line": 1240,
    "kind": "function",
    "name": "renderFilesTable"
   },
   {
    "line": 1337,
    "kind": "function",
    "name": "e"
   },
   {
    "line": 1342,
    "kind": "function",
    "name": "toStr"
   },
   {
    "line": 1353,
    "kind": "function",
    "name": "normalizeMarkdown"
   },
   {
    "line": 1407,
    "kind": "function",
    "name": "extractMeta"
   },
   {
    "line": 1475,
    "kind": "function",
    "name": "extractFirstH1"
   },
   {
    "line": 1516,
    "kind": "function",
    "name": "cleanMetaText"
   },
   {
    "line": 1543,
    "kind": "function",
    "name": "parseSources"
   },
   {
    "line": 1594,
    "kind": "function",
    "name": "hasManualNumbering"
   },
   {
    "line": 1675,
    "kind": "function",
    "name": "slugify"
   },
   {
    "line": 1703,
    "kind": "function",
    "name": "parseReferenceLinks"
   },
   {
    "line": 1755,
    "kind": "function",
    "name": "parseFootnotes"
   },
   {
    "line": 1810,
    "kind": "function",
    "name": "parseUniversalPattern"
   },
   {
    "line": 1888,
    "kind": "function",
    "name": "renderUniversalElements"
   },
   {
    "line": 1915,
    "kind": "function",
    "name": "emojiMap"
   },
   {
    "line": 1956,
    "kind": "function",
    "name": "inlineMarkdown"
   },
   {
    "line": 2221,
    "kind": "function",
    "name": "isTableLine"
   },
   {
    "line": 2222,
    "kind": "function",
    "name": "parseTableRow"
   },
   {
    "line": 2223,
    "kind": "function",
    "name": "isAlignmentSeparator"
   },
   {
    "line": 2224,
    "kind": "function",
    "name": "parseTableAlignments"
   },
   {
    "line": 2226,
    "kind": "function",
    "name": "renderTable"
   },
   {
    "line": 2267,
    "kind": "function",
    "name": "collectHeadings"
   },
   {
    "line": 2357,
    "kind": "function",
    "name": "assignHeadingNumbers"
   },
   {
    "line": 2386,
    "kind": "function",
    "name": "renderTOC"
   },
   {
    "line": 2402,
    "kind": "function",
    "name": "isMermaidLanguage"
   },
   {
    "line": 2409,
    "kind": "function",
    "name": "renderCopyButton"
   },
   {
    "line": 2430,
    "kind": "function",
    "name": "normalizeMermaidLine"
   },
   {
    "line": 2486,
    "kind": "function",
    "name": "normalizeMermaidSource"
   },
   {
    "line": 2505,
    "kind": "function",
    "name": "renderCodeBlock"
   },
   {
    "line": 2532,
    "kind": "function",
    "name": "renderSourcesList"
   },
   {
    "line": 2570,
    "kind": "function",
    "name": "glossaryPlainText"
   },
   {
    "line": 2588,
    "kind": "function",
    "name": "expandGlossaryAliases"
   },
   {
    "line": 2626,
    "kind": "function",
    "name": "parseGlossaryTables"
   },
   {
    "line": 2724,
    "kind": "function",
    "name": "applyGlossaryTooltipsToHtml"
   },
   {
    "line": 2820,
    "kind": "function",
    "name": "renderFootnotes"
   },
   {
    "line": 2860,
    "kind": "function",
    "name": "getHeadingClasses"
   },
   {
    "line": 2872,
    "kind": "function",
    "name": "resolveParagraphGlue"
   },
   {
    "line": 2912,
    "kind": "function",
    "name": "renderMarkdown"
   },
   {
    "line": 3319,
    "kind": "function",
    "name": "removeReferenceLinkDefinitions"
   },
   {
    "line": 3369,
    "kind": "function",
    "name": "removeFootnoteDefinitions"
   },
   {
    "line": 3449,
    "kind": "function",
    "name": "removeSourcesSection"
   }
  ],
  "tools/Invoke-ProjectDoctrine.ps1": [
   {
    "line": 97,
    "kind": "function",
    "name": "Test-RegexLiteral"
   },
   {
    "line": 114,
    "kind": "function",
    "name": "Assert-RegexLiteral"
   },
   {
    "line": 124,
    "kind": "function",
    "name": "Get-RelativePath"
   },
   {
    "line": 129,
    "kind": "function",
    "name": "Get-RepositoryFile"
   },
   {
    "line": 156,
    "kind": "function",
    "name": "Get-ProjectText"
   },
   {
    "line": 169,
    "kind": "function",
    "name": "Get-HeadBytes"
   },
   {
    "line": 186,
    "kind": "function",
    "name": "Get-Sha256"
   },
   {
    "line": 197,
    "kind": "function",
    "name": "Get-FunctionRegion"
   },
   {
    "line": 218,
    "kind": "function",
    "name": "New-CheckResult"
   },
   {
    "line": 271,
    "kind": "function",
    "name": "Write-CheckResult"
   },
   {
    "line": 302,
    "kind": "function",
    "name": "Invoke-SyntaxCheck"
   },
   {
    "line": 344,
    "kind": "function",
    "name": "Test-PhpSyntax"
   },
   {
    "line": 380,
    "kind": "function",
    "name": "Test-JavaScriptSyntax"
   },
   {
    "line": 418,
    "kind": "function",
    "name": "Test-BaselineLayout"
   },
   {
    "line": 443,
    "kind": "function",
    "name": "Test-VersionMarkers"
   },
   {
    "line": 489,
    "kind": "function",
    "name": "Test-FeatureWiring"
   },
   {
    "line": 643,
    "kind": "function",
    "name": "Test-ConfigKeyScopes"
   },
   {
    "line": 716,
    "kind": "function",
    "name": "Test-AssetReferences"
   },
   {
    "line": 781,
    "kind": "function",
    "name": "Test-RawHtmlBoundary"
   },
   {
    "line": 833,
    "kind": "function",
    "name": "Test-DoubledSlashRule"
   },
   {
    "line": 897,
    "kind": "function",
    "name": "Test-NumericLimits"
   },
   {
    "line": 957,
    "kind": "function",
    "name": "Test-AnchoredRegions"
   },
   {
    "line": 1027,
    "kind": "function",
    "name": "Test-ScaffoldMarkers"
   },
   {
    "line": 1063,
    "kind": "function",
    "name": "Test-DocumentationVersions"
   },
   {
    "line": 1130,
    "kind": "function",
    "name": "Test-SecretHygiene"
   },
   {
    "line": 1198,
    "kind": "function",
    "name": "Test-SortDefaultMirror"
   }
  ],
  "tools/Test-ViewerRobustness.ps1": [
   {
    "line": 103,
    "kind": "function",
    "name": "Test-Case"
   }
  ],
  "tools/Test-DoctrineFalsifiability.ps1": [
   {
    "line": 65,
    "kind": "function",
    "name": "New-ProjectCopy"
   },
   {
    "line": 77,
    "kind": "function",
    "name": "Invoke-Checker"
   },
   {
    "line": 103,
    "kind": "function",
    "name": "Edit-Text"
   }
  ],
  "js/md/md.js": [
   {
    "line": 71,
    "kind": "arrow",
    "name": "pageUrl"
   },
   {
    "line": 82,
    "kind": "arrow",
    "name": "getPreferredTheme"
   },
   {
    "line": 90,
    "kind": "arrow",
    "name": "applyTheme"
   },
   {
    "line": 116,
    "kind": "arrow",
    "name": "onSystemChange"
   },
   {
    "line": 139,
    "kind": "arrow",
    "name": "getMermaidDiagramType"
   },
   {
    "line": 144,
    "kind": "arrow",
    "name": "normalizeMermaidLine"
   },
   {
    "line": 168,
    "kind": "arrow",
    "name": "repairClassDiagramNotes"
   },
   {
    "line": 208,
    "kind": "arrow",
    "name": "repairMermaidSource"
   },
   {
    "line": 264,
    "kind": "arrow",
    "name": "extractMermaidError"
   },
   {
    "line": 270,
    "kind": "arrow",
    "name": "reportMermaidDiagnostics"
   },
   {
    "line": 285,
    "kind": "arrow",
    "name": "initMermaidIfNeeded"
   },
   {
    "line": 338,
    "kind": "arrow",
    "name": "getQuoteText"
   },
   {
    "line": 347,
    "kind": "arrow",
    "name": "initQuoteBlocks"
   },
   {
    "line": 363,
    "kind": "arrow",
    "name": "fallbackCopy"
   },
   {
    "line": 400,
    "kind": "arrow",
    "name": "announce"
   },
   {
    "line": 407,
    "kind": "arrow",
    "name": "resetButton"
   },
   {
    "line": 447,
    "kind": "arrow",
    "name": "showSuccess"
   },
   {
    "line": 496,
    "kind": "arrow",
    "name": "performSearch"
   },
   {
    "line": 528,
    "kind": "arrow",
    "name": "compareRows"
   },
   {
    "line": 540,
    "kind": "arrow",
    "name": "reorder"
   },
   {
    "line": 555,
    "kind": "arrow",
    "name": "applySort"
   },
   {
    "line": 575,
    "kind": "arrow",
    "name": "sortTable"
   },
   {
    "line": 605,
    "kind": "arrow",
    "name": "readSortPref"
   }
  ],
  "js/md/upload.js": [
   {
    "line": 42,
    "kind": "function",
    "name": "showToast"
   },
   {
    "line": 53,
    "kind": "function",
    "name": "isSafeFilename"
   },
   {
    "line": 176,
    "kind": "function",
    "name": "isSafeFilename"
   },
   {
    "line": 186,
    "kind": "function",
    "name": "setStatus"
   }
  ],
  "js/md/tooltips.js": [
   {
    "line": 51,
    "kind": "function",
    "name": "init"
   },
   {
    "line": 75,
    "kind": "function",
    "name": "parseGterm"
   },
   {
    "line": 87,
    "kind": "function",
    "name": "getHeaders"
   },
   {
    "line": 103,
    "kind": "function",
    "name": "getTermCell"
   },
   {
    "line": 112,
    "kind": "function",
    "name": "buildTip"
   },
   {
    "line": 158,
    "kind": "function",
    "name": "positionTip"
   },
   {
    "line": 180,
    "kind": "function",
    "name": "showTip"
   },
   {
    "line": 206,
    "kind": "function",
    "name": "scheduleHide"
   },
   {
    "line": 221,
    "kind": "function",
    "name": "cancelHide"
   }
  ],
  "js/md/settings.js": [
   {
    "line": 66,
    "kind": "function",
    "name": "cookiesAllowed"
   },
   {
    "line": 70,
    "kind": "function",
    "name": "store"
   },
   {
    "line": 79,
    "kind": "function",
    "name": "load"
   },
   {
    "line": 87,
    "kind": "function",
    "name": "clearCookie"
   },
   {
    "line": 102,
    "kind": "arrow",
    "name": "isMobile"
   },
   {
    "line": 109,
    "kind": "function",
    "name": "applyFS"
   },
   {
    "line": 115,
    "kind": "function",
    "name": "updateFSLabel"
   },
   {
    "line": 127,
    "kind": "function",
    "name": "applyLH"
   },
   {
    "line": 134,
    "kind": "function",
    "name": "updateLHLabel"
   },
   {
    "line": 175,
    "kind": "function",
    "name": "getAutoWidth"
   },
   {
    "line": 197,
    "kind": "function",
    "name": "getStoredManualWidth"
   },
   {
    "line": 216,
    "kind": "function",
    "name": "applyWidth"
   },
   {
    "line": 258,
    "kind": "function",
    "name": "initWidth"
   },
   {
    "line": 271,
    "kind": "function",
    "name": "scheduleAutoWidthUpdate"
   },
   {
    "line": 346,
    "kind": "function",
    "name": "markReload"
   },
   {
    "line": 354,
    "kind": "function",
    "name": "doReload"
   },
   {
    "line": 388,
    "kind": "function",
    "name": "applyParaButtons"
   },
   {
    "line": 459,
    "kind": "function",
    "name": "openPanel"
   },
   {
    "line": 464,
    "kind": "function",
    "name": "closePanel"
   },
   {
    "line": 584,
    "kind": "function",
    "name": "indexSetStatus"
   },
   {
    "line": 590,
    "kind": "function",
    "name": "loadIndexStatus"
   },
   {
    "line": 622,
    "kind": "function",
    "name": "indexAction"
   },
   {
    "line": 669,
    "kind": "function",
    "name": "loadBackups"
   },
   {
    "line": 794,
    "kind": "function",
    "name": "applyToolbarPrefs"
   },
   {
    "line": 811,
    "kind": "function",
    "name": "syncToolbarCheckboxes"
   },
   {
    "line": 849,
    "kind": "function",
    "name": "updateResponsiveToolbar"
   },
   {
    "line": 878,
    "kind": "function",
    "name": "setStatus"
   },
   {
    "line": 884,
    "kind": "function",
    "name": "renderFileList"
   },
   {
    "line": 918,
    "kind": "function",
    "name": "loadVersionBadge"
   },
   {
    "line": 1004,
    "kind": "function",
    "name": "runApply"
   }
  ]
 },
 "files": [
  {
   "path": "updater.php",
   "bytes": 111768,
   "ext": ".php",
   "lines": 2799,
   "sha256_16": "d33df3b9207a0e65",
   "urls": [
    "https://Deynekin.com",
    "https://raw.githubusercontent.com/paulmann/MD.Viewer/refs/heads/main"
   ],
   "security_signals": {
    "output-escaping": 104,
    "path-validation": 32,
    "crypto": 10,
    "tls-options": 1,
    "auth": 43,
    "security-headers": 2,
    "file-upload": 10
   },
   "version_marker": "3.14.0"
  },
  {
   "path": "README.md",
   "bytes": 26614,
   "ext": ".md",
   "lines": 554,
   "sha256_16": "6e0352eddcf553d8",
   "urls": [
    "https://github.com/paulmann/MD.Viewer.git",
    "https://github.com/paulmann/MD.Viewer/blob/main/LICENSE",
    "https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/paulmann/MD.Viewer/blob/main/LICENSE",
    "https://img.shields.io/badge/PHP-8.3%2B-777BB4?logo=php&logoColor=white)](https://php.net",
    "https://img.shields.io/badge/md.php-v2.18.0-success)](https://github.com/paulmann/MD.Viewer",
    "https://img.shields.io/badge/updater.php-v3.14.0-4f46e5)](https://github.com/paulmann/MD.Viewer",
    "https://raw.githubusercontent.com/paulmann/MD.Viewer/main/updater.php",
    "https://your-domain.com/docs/md.php",
    "https://your-domain.com/updater.php?api_key=",
    "https://your-domain.com/updater.php?restore=2.7.0",
    "https://your-domain.com/updater.php?restore=latest",
    "https://your-domain.com/updater.php?update=true",
    "https://your-domain.com/updater.php?update=true&force=true"
   ],
   "security_signals": {
    "path-validation": 3,
    "auth": 19,
    "security-headers": 1
   },
   "version_marker": "2.11.3"
  },
  {
   "path": "md.php",
   "bytes": 202145,
   "ext": ".php",
   "lines": 4709,
   "sha256_16": "422bbb61fa698f56",
   "urls": [
    "https://Deynekin.com",
    "https://cdn.tailwindcss.com",
    "https://fonts.googleapis.com",
    "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Sora:wght@600;700;800&display=swap",
    "https://fonts.gstatic.com",
    "https://github.com/paulmann/MD.Viewer",
    "https://github.com/paulmann/MD.Viewer/blob/main/LICENSE"
   ],
   "security_signals": {
    "output-escaping": 100,
    "path-validation": 45,
    "auth": 11,
    "security-headers": 1
   },
   "version_marker": "2.18.0"
  },
  {
   "path": "LICENSE",
   "bytes": 1550,
   "ext": "",
   "lines": 35,
   "sha256_16": "cc489a6e9f213526",
   "urls": [
    "https://github.com/paulmann/MD.Viewer"
   ],
   "version_marker": "1.0.0"
  },
  {
   "path": ".gitignore",
   "bytes": 122,
   "ext": "",
   "lines": 2,
   "sha256_16": "c6dff1eb162acbb2"
  },
  {
   "path": "tools/Invoke-ProjectDoctrine.ps1",
   "bytes": 56696,
   "ext": ".ps1",
   "lines": 1383,
   "sha256_16": "28f84c68719c862f",
   "security_signals": {
    "output-escaping": 3,
    "raw-html-passthrough": 7,
    "path-validation": 1,
    "signature-verify": 1
   }
  },
  {
   "path": "tools/Test-ViewerRobustness.ps1",
   "bytes": 7274,
   "ext": ".ps1",
   "lines": 159,
   "sha256_16": "62ff2f65762f83e4",
   "urls": [
    "http://127.0.0.1:$Port/md.php"
   ],
   "security_signals": {
    "path-validation": 4
   }
  },
  {
   "path": "tools/Test-DoctrineFalsifiability.ps1",
   "bytes": 17380,
   "ext": ".ps1",
   "lines": 417,
   "sha256_16": "457491e6ce83c59d",
   "security_signals": {
    "output-escaping": 2,
    "raw-html-passthrough": 2
   }
  },
  {
   "path": "css/md/tooltips.css",
   "bytes": 4479,
   "ext": ".css",
   "lines": 105,
   "sha256_16": "5bfe92ca3566ee9d",
   "urls": [
    "https://Deynekin.com"
   ],
   "version_marker": "2.4.5"
  },
  {
   "path": "css/md/md.css",
   "bytes": 17171,
   "ext": ".css",
   "lines": 705,
   "sha256_16": "83e9b102c37f7d9d",
   "urls": [
    "https://Deynekin.com"
   ],
   "version_marker": "2.2.2"
  },
  {
   "path": "css/md/settings.css",
   "bytes": 21774,
   "ext": ".css",
   "lines": 407,
   "sha256_16": "9b01d0ab4199b348",
   "version_marker": "2.9.0"
  },
  {
   "path": "js/md/md.js",
   "bytes": 30480,
   "ext": ".js",
   "lines": 697,
   "sha256_16": "ce47384198f70196",
   "urls": [
    "https://Deynekin.com",
    "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs"
   ],
   "security_signals": {
    "raw-html-passthrough": 1,
    "path-validation": 10,
    "exec-shell": 4,
    "auth": 5
   },
   "version_marker": "2.7.0"
  },
  {
   "path": "js/md/upload.js",
   "bytes": 12116,
   "ext": ".js",
   "lines": 237,
   "sha256_16": "fc15e5ad8aa55ed3",
   "security_signals": {
    "output-escaping": 2,
    "path-validation": 1,
    "file-upload": 2
   },
   "version_marker": "2.9.1"
  },
  {
   "path": "js/md/tooltips.js",
   "bytes": 15345,
   "ext": ".js",
   "lines": 317,
   "sha256_16": "e371d2cef48ad8e2",
   "urls": [
    "https://Deynekin.com"
   ],
   "security_signals": {
    "raw-html-passthrough": 1
   },
   "version_marker": "2.4.5"
  },
  {
   "path": "js/md/settings.js",
   "bytes": 54747,
   "ext": ".js",
   "lines": 1063,
   "sha256_16": "9ca13ab7d471ea0e",
   "urls": [
    "https://Deynekin.com"
   ],
   "security_signals": {
    "raw-html-passthrough": 7,
    "path-validation": 4
   },
   "version_marker": "2.11.0"
  }
 ]
}