diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fb0ce49..f15039d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,15 +19,20 @@ jobs: with: persist-credentials: false + - name: Assert Apple Silicon runner + run: | + set -euo pipefail + if [ "$(uname -m)" != "arm64" ]; then + echo "Release builds must run on Apple Silicon, got $(uname -m)" >&2 + exit 1 + fi + - name: Install mise run: | set -euo pipefail MISE_VERSION="2026.6.0" - case "$(uname -m)" in - arm64) MISE_ARCH="arm64"; MISE_SHA256="8830cf720025583bfbc5ca77bcf15958bf6efb4743fb84be6b572fd85d3a6cd0" ;; - x86_64) MISE_ARCH="x64"; MISE_SHA256="fc2630a1cd4a9e16d097cc5d4feec8d868c8a014a9a419cdb41f817da022e8b2" ;; - *) echo "Unsupported architecture: $(uname -m)" >&2; exit 1 ;; - esac + MISE_ARCH="arm64" + MISE_SHA256="8830cf720025583bfbc5ca77bcf15958bf6efb4743fb84be6b572fd85d3a6cd0" MISE_TARBALL="mise-v${MISE_VERSION}-macos-${MISE_ARCH}.tar.gz" curl -fsSLO "https://github.com/jdx/mise/releases/download/v${MISE_VERSION}/${MISE_TARBALL}" @@ -59,6 +64,43 @@ jobs: mise run clean mise run build + - name: Verify Apple Silicon artifacts + run: | + set -euo pipefail + + APP_PATH="build/Build/Products/Release/Glance.app" + test -d "$APP_PATH" + lipo -info HTMLConverter/htmlconverter.a | tee /tmp/htmlconverter-lipo.txt + if grep -q "x86_64" /tmp/htmlconverter-lipo.txt; then + echo "HTMLConverter archive contains x86_64" >&2 + exit 1 + fi + if ! grep -q "arm64" /tmp/htmlconverter-lipo.txt; then + echo "HTMLConverter archive does not contain arm64" >&2 + exit 1 + fi + + found_macho=0 + while IFS= read -r -d '' candidate; do + if info="$(lipo -info "$candidate" 2>/dev/null)"; then + found_macho=1 + echo "$info" + if echo "$info" | grep -q "x86_64"; then + echo "Bundle artifact contains x86_64: $candidate" >&2 + exit 1 + fi + if ! echo "$info" | grep -q "arm64"; then + echo "Bundle artifact does not contain arm64: $candidate" >&2 + exit 1 + fi + fi + done < <(find "$APP_PATH" -type f -print0) + + if [ "$found_macho" -eq 0 ]; then + echo "No Mach-O artifacts found in $APP_PATH" >&2 + exit 1 + fi + - name: Package DMG env: TAG_NAME: ${{ github.ref_name }} diff --git a/.gitignore b/.gitignore index bae594c..34aa670 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ # Xcode project.xcworkspace/ +!Glance.xcodeproj/project.xcworkspace/ +!Glance.xcodeproj/project.xcworkspace/xcshareddata/ +!Glance.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/ +!Glance.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved xcuserdata/ build/ .DS_Store diff --git a/.swiftformat b/.swiftformat index 43ea802..5074f78 100644 --- a/.swiftformat +++ b/.swiftformat @@ -1,7 +1,9 @@ ---swiftversion 5.9 +--swiftversion 6.0 --indent tab --indentcase true --maxwidth 100 --tabwidth 4 +--exclude build + --disable hoistTry diff --git a/.woodpecker/lint.yaml b/.woodpecker/lint.yaml deleted file mode 100644 index c8a6d46..0000000 --- a/.woodpecker/lint.yaml +++ /dev/null @@ -1,21 +0,0 @@ -when: - - event: pull_request - - event: push - branch: main - -steps: - - name: lint swift - image: swift - commands: - - git clone https://github.com/yonaskolb/Mint.git /tmp/Mint - - swift run --package-path /tmp/Mint mint install yonaskolb/mint - - mint bootstrap - - mint run swiftlint --quiet --strict - - mint run swiftformat --lint . - environment: - MINT_LINK_PATH: /usr/local/bin - - name: lint go - image: golangci/golangci-lint - commands: - - cd HTMLConverter - - golangci-lint run diff --git a/.woodpecker/test.yaml b/.woodpecker/test.yaml deleted file mode 100644 index 186d605..0000000 --- a/.woodpecker/test.yaml +++ /dev/null @@ -1,11 +0,0 @@ -when: - - event: pull_request - - event: push - branch: main - -steps: - - name: test go - image: golang - commands: - - cd HTMLConverter - - go test diff --git a/Glance.xcodeproj/project.pbxproj b/Glance.xcodeproj/project.pbxproj index 4ef6139..7791de4 100644 --- a/Glance.xcodeproj/project.pbxproj +++ b/Glance.xcodeproj/project.pbxproj @@ -80,64 +80,25 @@ 7EB36440244B03CC00D7F96F /* jupyter-katex-auto-render.min.js in Resources */ = {isa = PBXBuildFile; fileRef = 7EB363F8244B03CC00D7F96F /* jupyter-katex-auto-render.min.js */; }; 7EB36441244B03CC00D7F96F /* jupyter-katex.min.css in Resources */ = {isa = PBXBuildFile; fileRef = 7EB363F9244B03CC00D7F96F /* jupyter-katex.min.css */; }; 7EB36442244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB363FB244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff2 */; }; - 7EB36443244B03CC00D7F96F /* KaTeX_Main-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB363FC244B03CC00D7F96F /* KaTeX_Main-Regular.woff */; }; - 7EB36444244B03CC00D7F96F /* KaTeX_AMS-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB363FD244B03CC00D7F96F /* KaTeX_AMS-Regular.ttf */; }; - 7EB36445244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB363FE244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff */; }; 7EB36446244B03CC00D7F96F /* KaTeX_AMS-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB363FF244B03CC00D7F96F /* KaTeX_AMS-Regular.woff2 */; }; 7EB36447244B03CC00D7F96F /* KaTeX_Size3-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36400244B03CC00D7F96F /* KaTeX_Size3-Regular.woff2 */; }; 7EB36448244B03CC00D7F96F /* KaTeX_Main-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36401244B03CC00D7F96F /* KaTeX_Main-Regular.woff2 */; }; - 7EB36449244B03CC00D7F96F /* KaTeX_Script-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36402244B03CC00D7F96F /* KaTeX_Script-Regular.ttf */; }; 7EB3644A244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36403244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff2 */; }; - 7EB3644C244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36405244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff */; }; - 7EB3644D244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36406244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff */; }; - 7EB3644E244B03CC00D7F96F /* KaTeX_Typewriter-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36407244B03CC00D7F96F /* KaTeX_Typewriter-Regular.ttf */; }; - 7EB3644F244B03CC00D7F96F /* KaTeX_Main-Italic.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36408244B03CC00D7F96F /* KaTeX_Main-Italic.woff */; }; - 7EB36450244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36409244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.ttf */; }; 7EB36451244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3640A244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff2 */; }; 7EB36452244B03CC00D7F96F /* KaTeX_Math-Italic.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3640B244B03CC00D7F96F /* KaTeX_Math-Italic.woff2 */; }; 7EB36453244B03CC00D7F96F /* KaTeX_Size4-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3640C244B03CC00D7F96F /* KaTeX_Size4-Regular.woff2 */; }; 7EB36454244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3640D244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff2 */; }; - 7EB36455244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3640E244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff */; }; - 7EB36456244B03CC00D7F96F /* KaTeX_SansSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3640F244B03CC00D7F96F /* KaTeX_SansSerif-Bold.ttf */; }; - 7EB36457244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36410244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff */; }; - 7EB36458244B03CC00D7F96F /* KaTeX_Main-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36411244B03CC00D7F96F /* KaTeX_Main-Bold.ttf */; }; 7EB36459244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36412244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff2 */; }; 7EB3645A244B03CC00D7F96F /* KaTeX_Main-Bold.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36413244B03CC00D7F96F /* KaTeX_Main-Bold.woff2 */; }; 7EB3645B244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36414244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff2 */; }; - 7EB3645C244B03CC00D7F96F /* KaTeX_Fraktur-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36415244B03CC00D7F96F /* KaTeX_Fraktur-Regular.ttf */; }; - 7EB3645D244B03CC00D7F96F /* KaTeX_Main-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36416244B03CC00D7F96F /* KaTeX_Main-Regular.ttf */; }; - 7EB3645E244B03CC00D7F96F /* KaTeX_Size2-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36417244B03CC00D7F96F /* KaTeX_Size2-Regular.woff */; }; 7EB3645F244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36418244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff2 */; }; 7EB36460244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36419244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff2 */; }; 7EB36461244B03CC00D7F96F /* KaTeX_Script-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3641A244B03CC00D7F96F /* KaTeX_Script-Regular.woff2 */; }; - 7EB36462244B03CC00D7F96F /* KaTeX_Size4-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3641B244B03CC00D7F96F /* KaTeX_Size4-Regular.woff */; }; - 7EB36463244B03CC00D7F96F /* KaTeX_Size3-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3641C244B03CC00D7F96F /* KaTeX_Size3-Regular.woff */; }; - 7EB36464244B03CC00D7F96F /* KaTeX_AMS-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3641D244B03CC00D7F96F /* KaTeX_AMS-Regular.woff */; }; - 7EB36465244B03CC00D7F96F /* KaTeX_Main-Bold.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3641E244B03CC00D7F96F /* KaTeX_Main-Bold.woff */; }; - 7EB36466244B03CC00D7F96F /* KaTeX_SansSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3641F244B03CC00D7F96F /* KaTeX_SansSerif-Italic.ttf */; }; - 7EB36467244B03CC00D7F96F /* KaTeX_Math-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36420244B03CC00D7F96F /* KaTeX_Math-Italic.ttf */; }; - 7EB36468244B03CC00D7F96F /* KaTeX_Size1-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36421244B03CC00D7F96F /* KaTeX_Size1-Regular.woff */; }; - 7EB36469244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36422244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff */; }; - 7EB3646A244B03CC00D7F96F /* KaTeX_Main-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36423244B03CC00D7F96F /* KaTeX_Main-Italic.ttf */; }; - 7EB3646B244B03CC00D7F96F /* KaTeX_Math-Italic.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36424244B03CC00D7F96F /* KaTeX_Math-Italic.woff */; }; 7EB3646C244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36425244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff2 */; }; - 7EB3646D244B03CC00D7F96F /* KaTeX_Fraktur-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36426244B03CC00D7F96F /* KaTeX_Fraktur-Bold.ttf */; }; - 7EB3646E244B03CC00D7F96F /* KaTeX_Size2-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36427244B03CC00D7F96F /* KaTeX_Size2-Regular.ttf */; }; - 7EB3646F244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36428244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff */; }; 7EB36470244B03CC00D7F96F /* KaTeX_Main-Italic.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36429244B03CC00D7F96F /* KaTeX_Main-Italic.woff2 */; }; 7EB36471244B03CC00D7F96F /* KaTeX_Size1-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3642A244B03CC00D7F96F /* KaTeX_Size1-Regular.woff2 */; }; - 7EB36472244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3642B244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff */; }; - 7EB36473244B03CC00D7F96F /* KaTeX_Script-Regular.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3642C244B03CC00D7F96F /* KaTeX_Script-Regular.woff */; }; - 7EB36474244B03CC00D7F96F /* KaTeX_SansSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3642D244B03CC00D7F96F /* KaTeX_SansSerif-Regular.ttf */; }; - 7EB36475244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3642E244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff */; }; - 7EB36476244B03CC00D7F96F /* KaTeX_Size1-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3642F244B03CC00D7F96F /* KaTeX_Size1-Regular.ttf */; }; - 7EB36477244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36430244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.ttf */; }; - 7EB36478244B03CC00D7F96F /* KaTeX_Size4-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36431244B03CC00D7F96F /* KaTeX_Size4-Regular.ttf */; }; 7EB36479244B03CC00D7F96F /* KaTeX_Size2-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36432244B03CC00D7F96F /* KaTeX_Size2-Regular.woff2 */; }; 7EB3647A244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff2 in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36433244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff2 */; }; - 7EB3647B244B03CC00D7F96F /* KaTeX_Main-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36434244B03CC00D7F96F /* KaTeX_Main-BoldItalic.ttf */; }; - 7EB3647C244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36435244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff */; }; - 7EB3647D244B03CC00D7F96F /* KaTeX_Math-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36436244B03CC00D7F96F /* KaTeX_Math-BoldItalic.ttf */; }; 7EB3647E244B03CC00D7F96F /* jupyter-main.css in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36437244B03CC00D7F96F /* jupyter-main.css */; }; 7EB3647F244B03CC00D7F96F /* shared-main.css in Resources */ = {isa = PBXBuildFile; fileRef = 7EB36439244B03CC00D7F96F /* shared-main.css */; }; 7EB36480244B03CC00D7F96F /* shared-chroma.css in Resources */ = {isa = PBXBuildFile; fileRef = 7EB3643A244B03CC00D7F96F /* shared-chroma.css */; }; @@ -252,65 +213,25 @@ 7EB363F8244B03CC00D7F96F /* jupyter-katex-auto-render.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "jupyter-katex-auto-render.min.js"; sourceTree = ""; }; 7EB363F9244B03CC00D7F96F /* jupyter-katex.min.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "jupyter-katex.min.css"; sourceTree = ""; }; 7EB363FB244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Typewriter-Regular.woff2"; sourceTree = ""; }; - 7EB363FC244B03CC00D7F96F /* KaTeX_Main-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Regular.woff"; sourceTree = ""; }; - 7EB363FD244B03CC00D7F96F /* KaTeX_AMS-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_AMS-Regular.ttf"; sourceTree = ""; }; - 7EB363FE244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-BoldItalic.woff"; sourceTree = ""; }; 7EB363FF244B03CC00D7F96F /* KaTeX_AMS-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_AMS-Regular.woff2"; sourceTree = ""; }; 7EB36400244B03CC00D7F96F /* KaTeX_Size3-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size3-Regular.woff2"; sourceTree = ""; }; 7EB36401244B03CC00D7F96F /* KaTeX_Main-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Regular.woff2"; sourceTree = ""; }; - 7EB36402244B03CC00D7F96F /* KaTeX_Script-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Script-Regular.ttf"; sourceTree = ""; }; 7EB36403244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Caligraphic-Bold.woff2"; sourceTree = ""; }; - 7EB36404244B03CC00D7F96F /* KaTeX_Size3-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size3-Regular.ttf"; sourceTree = ""; }; - 7EB36405244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Typewriter-Regular.woff"; sourceTree = ""; }; - 7EB36406244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Caligraphic-Regular.woff"; sourceTree = ""; }; - 7EB36407244B03CC00D7F96F /* KaTeX_Typewriter-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Typewriter-Regular.ttf"; sourceTree = ""; }; - 7EB36408244B03CC00D7F96F /* KaTeX_Main-Italic.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Italic.woff"; sourceTree = ""; }; - 7EB36409244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Caligraphic-Bold.ttf"; sourceTree = ""; }; 7EB3640A244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Bold.woff2"; sourceTree = ""; }; 7EB3640B244B03CC00D7F96F /* KaTeX_Math-Italic.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Math-Italic.woff2"; sourceTree = ""; }; 7EB3640C244B03CC00D7F96F /* KaTeX_Size4-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size4-Regular.woff2"; sourceTree = ""; }; 7EB3640D244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Fraktur-Bold.woff2"; sourceTree = ""; }; - 7EB3640E244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Caligraphic-Bold.woff"; sourceTree = ""; }; - 7EB3640F244B03CC00D7F96F /* KaTeX_SansSerif-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Bold.ttf"; sourceTree = ""; }; - 7EB36410244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Fraktur-Regular.woff"; sourceTree = ""; }; - 7EB36411244B03CC00D7F96F /* KaTeX_Main-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Bold.ttf"; sourceTree = ""; }; 7EB36412244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Italic.woff2"; sourceTree = ""; }; 7EB36413244B03CC00D7F96F /* KaTeX_Main-Bold.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Bold.woff2"; sourceTree = ""; }; 7EB36414244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Regular.woff2"; sourceTree = ""; }; - 7EB36415244B03CC00D7F96F /* KaTeX_Fraktur-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Fraktur-Regular.ttf"; sourceTree = ""; }; - 7EB36416244B03CC00D7F96F /* KaTeX_Main-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Regular.ttf"; sourceTree = ""; }; - 7EB36417244B03CC00D7F96F /* KaTeX_Size2-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size2-Regular.woff"; sourceTree = ""; }; 7EB36418244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-BoldItalic.woff2"; sourceTree = ""; }; 7EB36419244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Fraktur-Regular.woff2"; sourceTree = ""; }; 7EB3641A244B03CC00D7F96F /* KaTeX_Script-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Script-Regular.woff2"; sourceTree = ""; }; - 7EB3641B244B03CC00D7F96F /* KaTeX_Size4-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size4-Regular.woff"; sourceTree = ""; }; - 7EB3641C244B03CC00D7F96F /* KaTeX_Size3-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size3-Regular.woff"; sourceTree = ""; }; - 7EB3641D244B03CC00D7F96F /* KaTeX_AMS-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_AMS-Regular.woff"; sourceTree = ""; }; - 7EB3641E244B03CC00D7F96F /* KaTeX_Main-Bold.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Bold.woff"; sourceTree = ""; }; - 7EB3641F244B03CC00D7F96F /* KaTeX_SansSerif-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Italic.ttf"; sourceTree = ""; }; - 7EB36420244B03CC00D7F96F /* KaTeX_Math-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Math-Italic.ttf"; sourceTree = ""; }; - 7EB36421244B03CC00D7F96F /* KaTeX_Size1-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size1-Regular.woff"; sourceTree = ""; }; - 7EB36422244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Regular.woff"; sourceTree = ""; }; - 7EB36423244B03CC00D7F96F /* KaTeX_Main-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Italic.ttf"; sourceTree = ""; }; - 7EB36424244B03CC00D7F96F /* KaTeX_Math-Italic.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Math-Italic.woff"; sourceTree = ""; }; 7EB36425244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Math-BoldItalic.woff2"; sourceTree = ""; }; - 7EB36426244B03CC00D7F96F /* KaTeX_Fraktur-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Fraktur-Bold.ttf"; sourceTree = ""; }; - 7EB36427244B03CC00D7F96F /* KaTeX_Size2-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size2-Regular.ttf"; sourceTree = ""; }; - 7EB36428244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Italic.woff"; sourceTree = ""; }; 7EB36429244B03CC00D7F96F /* KaTeX_Main-Italic.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-Italic.woff2"; sourceTree = ""; }; 7EB3642A244B03CC00D7F96F /* KaTeX_Size1-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size1-Regular.woff2"; sourceTree = ""; }; - 7EB3642B244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Fraktur-Bold.woff"; sourceTree = ""; }; - 7EB3642C244B03CC00D7F96F /* KaTeX_Script-Regular.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Script-Regular.woff"; sourceTree = ""; }; - 7EB3642D244B03CC00D7F96F /* KaTeX_SansSerif-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Regular.ttf"; sourceTree = ""; }; - 7EB3642E244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Math-BoldItalic.woff"; sourceTree = ""; }; - 7EB3642F244B03CC00D7F96F /* KaTeX_Size1-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size1-Regular.ttf"; sourceTree = ""; }; - 7EB36430244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Caligraphic-Regular.ttf"; sourceTree = ""; }; - 7EB36431244B03CC00D7F96F /* KaTeX_Size4-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size4-Regular.ttf"; sourceTree = ""; }; 7EB36432244B03CC00D7F96F /* KaTeX_Size2-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Size2-Regular.woff2"; sourceTree = ""; }; 7EB36433244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff2 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Caligraphic-Regular.woff2"; sourceTree = ""; }; - 7EB36434244B03CC00D7F96F /* KaTeX_Main-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Main-BoldItalic.ttf"; sourceTree = ""; }; - 7EB36435244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_SansSerif-Bold.woff"; sourceTree = ""; }; - 7EB36436244B03CC00D7F96F /* KaTeX_Math-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "KaTeX_Math-BoldItalic.ttf"; sourceTree = ""; }; 7EB36437244B03CC00D7F96F /* jupyter-main.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "jupyter-main.css"; sourceTree = ""; }; 7EB36439244B03CC00D7F96F /* shared-main.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "shared-main.css"; sourceTree = ""; }; 7EB3643A244B03CC00D7F96F /* shared-chroma.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "shared-chroma.css"; sourceTree = ""; }; @@ -538,65 +459,25 @@ isa = PBXGroup; children = ( 7EB363FB244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff2 */, - 7EB363FC244B03CC00D7F96F /* KaTeX_Main-Regular.woff */, - 7EB363FD244B03CC00D7F96F /* KaTeX_AMS-Regular.ttf */, - 7EB363FE244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff */, 7EB363FF244B03CC00D7F96F /* KaTeX_AMS-Regular.woff2 */, 7EB36400244B03CC00D7F96F /* KaTeX_Size3-Regular.woff2 */, 7EB36401244B03CC00D7F96F /* KaTeX_Main-Regular.woff2 */, - 7EB36402244B03CC00D7F96F /* KaTeX_Script-Regular.ttf */, 7EB36403244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff2 */, - 7EB36404244B03CC00D7F96F /* KaTeX_Size3-Regular.ttf */, - 7EB36405244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff */, - 7EB36406244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff */, - 7EB36407244B03CC00D7F96F /* KaTeX_Typewriter-Regular.ttf */, - 7EB36408244B03CC00D7F96F /* KaTeX_Main-Italic.woff */, - 7EB36409244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.ttf */, 7EB3640A244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff2 */, 7EB3640B244B03CC00D7F96F /* KaTeX_Math-Italic.woff2 */, 7EB3640C244B03CC00D7F96F /* KaTeX_Size4-Regular.woff2 */, 7EB3640D244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff2 */, - 7EB3640E244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff */, - 7EB3640F244B03CC00D7F96F /* KaTeX_SansSerif-Bold.ttf */, - 7EB36410244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff */, - 7EB36411244B03CC00D7F96F /* KaTeX_Main-Bold.ttf */, 7EB36412244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff2 */, 7EB36413244B03CC00D7F96F /* KaTeX_Main-Bold.woff2 */, 7EB36414244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff2 */, - 7EB36415244B03CC00D7F96F /* KaTeX_Fraktur-Regular.ttf */, - 7EB36416244B03CC00D7F96F /* KaTeX_Main-Regular.ttf */, - 7EB36417244B03CC00D7F96F /* KaTeX_Size2-Regular.woff */, 7EB36418244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff2 */, 7EB36419244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff2 */, 7EB3641A244B03CC00D7F96F /* KaTeX_Script-Regular.woff2 */, - 7EB3641B244B03CC00D7F96F /* KaTeX_Size4-Regular.woff */, - 7EB3641C244B03CC00D7F96F /* KaTeX_Size3-Regular.woff */, - 7EB3641D244B03CC00D7F96F /* KaTeX_AMS-Regular.woff */, - 7EB3641E244B03CC00D7F96F /* KaTeX_Main-Bold.woff */, - 7EB3641F244B03CC00D7F96F /* KaTeX_SansSerif-Italic.ttf */, - 7EB36420244B03CC00D7F96F /* KaTeX_Math-Italic.ttf */, - 7EB36421244B03CC00D7F96F /* KaTeX_Size1-Regular.woff */, - 7EB36422244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff */, - 7EB36423244B03CC00D7F96F /* KaTeX_Main-Italic.ttf */, - 7EB36424244B03CC00D7F96F /* KaTeX_Math-Italic.woff */, 7EB36425244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff2 */, - 7EB36426244B03CC00D7F96F /* KaTeX_Fraktur-Bold.ttf */, - 7EB36427244B03CC00D7F96F /* KaTeX_Size2-Regular.ttf */, - 7EB36428244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff */, 7EB36429244B03CC00D7F96F /* KaTeX_Main-Italic.woff2 */, 7EB3642A244B03CC00D7F96F /* KaTeX_Size1-Regular.woff2 */, - 7EB3642B244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff */, - 7EB3642C244B03CC00D7F96F /* KaTeX_Script-Regular.woff */, - 7EB3642D244B03CC00D7F96F /* KaTeX_SansSerif-Regular.ttf */, - 7EB3642E244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff */, - 7EB3642F244B03CC00D7F96F /* KaTeX_Size1-Regular.ttf */, - 7EB36430244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.ttf */, - 7EB36431244B03CC00D7F96F /* KaTeX_Size4-Regular.ttf */, 7EB36432244B03CC00D7F96F /* KaTeX_Size2-Regular.woff2 */, 7EB36433244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff2 */, - 7EB36434244B03CC00D7F96F /* KaTeX_Main-BoldItalic.ttf */, - 7EB36435244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff */, - 7EB36436244B03CC00D7F96F /* KaTeX_Math-BoldItalic.ttf */, ); path = fonts; sourceTree = ""; @@ -749,7 +630,7 @@ attributes = { BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1240; - LastUpgradeCheck = 1630; + LastUpgradeCheck = 1600; ORGANIZATIONNAME = "Han Cen"; TargetAttributes = { 10779C0C26218B2B008A903C = { @@ -765,7 +646,7 @@ }; }; buildConfigurationList = 7ECC8CE9240CB4CC000D6970 /* Build configuration list for PBXProject "Glance" */; - compatibilityVersion = "Xcode 12.0"; + compatibilityVersion = "Xcode 16.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -801,76 +682,37 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7EB36475244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff in Resources */, - 7EB36474244B03CC00D7F96F /* KaTeX_SansSerif-Regular.ttf in Resources */, - 7EB36455244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff in Resources */, - 7EB3646F244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff in Resources */, - 7EB3644F244B03CC00D7F96F /* KaTeX_Main-Italic.woff in Resources */, 7EB36448244B03CC00D7F96F /* KaTeX_Main-Regular.woff2 in Resources */, 7EB36460244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff2 in Resources */, 7EB36441244B03CC00D7F96F /* jupyter-katex.min.css in Resources */, 7E022BE62452181F000EFCD3 /* WebPreviewVC.xib in Resources */, 7EB36471244B03CC00D7F96F /* KaTeX_Size1-Regular.woff2 in Resources */, - 7EB36465244B03CC00D7F96F /* KaTeX_Main-Bold.woff in Resources */, - 7EB36456244B03CC00D7F96F /* KaTeX_SansSerif-Bold.ttf in Resources */, 7EB36459244B03CC00D7F96F /* KaTeX_SansSerif-Italic.woff2 in Resources */, - 7EB36468244B03CC00D7F96F /* KaTeX_Size1-Regular.woff in Resources */, 7E08A5102454372200B7FF53 /* TablePreviewVC.xib in Resources */, - 7EB3646B244B03CC00D7F96F /* KaTeX_Math-Italic.woff in Resources */, 7EB36451244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff2 in Resources */, 7EB36442244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff2 in Resources */, 7EB36480244B03CC00D7F96F /* shared-chroma.css in Resources */, - 7EB36473244B03CC00D7F96F /* KaTeX_Script-Regular.woff in Resources */, 7EB36470244B03CC00D7F96F /* KaTeX_Main-Italic.woff2 in Resources */, - 7EB3647B244B03CC00D7F96F /* KaTeX_Main-BoldItalic.ttf in Resources */, 7EB3645F244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff2 in Resources */, 7EB3646C244B03CC00D7F96F /* KaTeX_Math-BoldItalic.woff2 in Resources */, 7EB36461244B03CC00D7F96F /* KaTeX_Script-Regular.woff2 in Resources */, 7EB36440244B03CC00D7F96F /* jupyter-katex-auto-render.min.js in Resources */, - 7EB36466244B03CC00D7F96F /* KaTeX_SansSerif-Italic.ttf in Resources */, - 7EB3644E244B03CC00D7F96F /* KaTeX_Typewriter-Regular.ttf in Resources */, - 7EB36476244B03CC00D7F96F /* KaTeX_Size1-Regular.ttf in Resources */, - 7EB36443244B03CC00D7F96F /* KaTeX_Main-Regular.woff in Resources */, 7EB3645B244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff2 in Resources */, 7E616BB2244998650043F7AB /* MainVC.xib in Resources */, 7EB36447244B03CC00D7F96F /* KaTeX_Size3-Regular.woff2 in Resources */, - 7EB3645E244B03CC00D7F96F /* KaTeX_Size2-Regular.woff in Resources */, 7EB3643F244B03CC00D7F96F /* jupyter-katex.min.js in Resources */, - 7EB36449244B03CC00D7F96F /* KaTeX_Script-Regular.ttf in Resources */, 7EB3647A244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff2 in Resources */, - 7EB3645C244B03CC00D7F96F /* KaTeX_Fraktur-Regular.ttf in Resources */, 7EB36446244B03CC00D7F96F /* KaTeX_AMS-Regular.woff2 in Resources */, - 7EB3644C244B03CC00D7F96F /* KaTeX_Typewriter-Regular.woff in Resources */, 7EB36454244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff2 in Resources */, - 7EB36478244B03CC00D7F96F /* KaTeX_Size4-Regular.ttf in Resources */, 7EB3647F244B03CC00D7F96F /* shared-main.css in Resources */, - 7EB36457244B03CC00D7F96F /* KaTeX_Fraktur-Regular.woff in Resources */, 7EB3645A244B03CC00D7F96F /* KaTeX_Main-Bold.woff2 in Resources */, - 7EB36445244B03CC00D7F96F /* KaTeX_Main-BoldItalic.woff in Resources */, - 7EB3646E244B03CC00D7F96F /* KaTeX_Size2-Regular.ttf in Resources */, 7EB36452244B03CC00D7F96F /* KaTeX_Math-Italic.woff2 in Resources */, - 7EB3647C244B03CC00D7F96F /* KaTeX_SansSerif-Bold.woff in Resources */, 7EB3647E244B03CC00D7F96F /* jupyter-main.css in Resources */, - 7EB36472244B03CC00D7F96F /* KaTeX_Fraktur-Bold.woff in Resources */, - 7EB36469244B03CC00D7F96F /* KaTeX_SansSerif-Regular.woff in Resources */, 7EB36479244B03CC00D7F96F /* KaTeX_Size2-Regular.woff2 in Resources */, - 7EB36477244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.ttf in Resources */, 7EB36453244B03CC00D7F96F /* KaTeX_Size4-Regular.woff2 in Resources */, - 7EB36458244B03CC00D7F96F /* KaTeX_Main-Bold.ttf in Resources */, - 7EB3646A244B03CC00D7F96F /* KaTeX_Main-Italic.ttf in Resources */, - 7EB36444244B03CC00D7F96F /* KaTeX_AMS-Regular.ttf in Resources */, - 7EB36464244B03CC00D7F96F /* KaTeX_AMS-Regular.woff in Resources */, 7EB36482244B03CC00D7F96F /* markdown-main.css in Resources */, - 7EB36462244B03CC00D7F96F /* KaTeX_Size4-Regular.woff in Resources */, 7EB3644A244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.woff2 in Resources */, - 7EB3644D244B03CC00D7F96F /* KaTeX_Caligraphic-Regular.woff in Resources */, 7E022BEE245253B3000EFCD3 /* OutlinePreviewVC.xib in Resources */, - 7EB36467244B03CC00D7F96F /* KaTeX_Math-Italic.ttf in Resources */, - 7EB36463244B03CC00D7F96F /* KaTeX_Size3-Regular.woff in Resources */, - 7EB3647D244B03CC00D7F96F /* KaTeX_Math-BoldItalic.ttf in Resources */, - 7EB3646D244B03CC00D7F96F /* KaTeX_Fraktur-Bold.ttf in Resources */, - 7EB3645D244B03CC00D7F96F /* KaTeX_Main-Regular.ttf in Resources */, - 7EB36450244B03CC00D7F96F /* KaTeX_Caligraphic-Bold.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -909,7 +751,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "cd \"$PROJECT_DIR/HTMLConverter\"\nset -e\n[ ! -d /opt/homebrew ] || eval \"$(/opt/homebrew/bin/brew shellenv)\"\nMISE_BIN=\"${MISE_BIN:-}\"\nif [ -z \"$MISE_BIN\" ]; then\n\tif command -v mise >/dev/null 2>&1; then\n\t\tMISE_BIN=\"$(command -v mise)\"\n\telif [ -x \"$HOME/.local/bin/mise\" ]; then\n\t\tMISE_BIN=\"$HOME/.local/bin/mise\"\n\telif [ -x \"/opt/homebrew/bin/mise\" ]; then\n\t\tMISE_BIN=\"/opt/homebrew/bin/mise\"\n\telif [ -x \"/usr/local/bin/mise\" ]; then\n\t\tMISE_BIN=\"/usr/local/bin/mise\"\n\tfi\nfi\nif [ -z \"$MISE_BIN\" ]; then\n\techo \"mise is required to build HTMLConverter with the pinned Go toolchain\" >&2\n\texit 1\nfi\nexport MISE_TRUSTED_CONFIG_PATHS=\"$PROJECT_DIR${MISE_TRUSTED_CONFIG_PATHS:+:$MISE_TRUSTED_CONFIG_PATHS}\"\nrm -f htmlconverter-amd64.a htmlconverter-arm64.a htmlconverter.a htmlconverter-amd64.h htmlconverter-arm64.h htmlconverter.h\nexport MACOSX_DEPLOYMENT_TARGET=\"${MACOSX_DEPLOYMENT_TARGET:-14.0}\"\nexport CGO_CFLAGS=\"-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} ${CGO_CFLAGS}\"\nexport CGO_LDFLAGS=\"-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} ${CGO_LDFLAGS}\"\n# Force rebuilds so cached Go objects use the selected macOS deployment target.\nGOOS=darwin GOARCH=amd64 CGO_ENABLED=1 \"$MISE_BIN\" exec -- go build -a --buildmode=c-archive -ldflags \"-s -w\" -o ./htmlconverter-amd64.a\nGOOS=darwin GOARCH=arm64 CGO_ENABLED=1 \"$MISE_BIN\" exec -- go build -a --buildmode=c-archive -ldflags \"-s -w\" -o ./htmlconverter-arm64.a\nlipo -create -output htmlconverter.a htmlconverter-amd64.a htmlconverter-arm64.a\ncp htmlconverter-amd64.h htmlconverter.h\n"; + shellScript = "cd \"$PROJECT_DIR/HTMLConverter\"\nset -e\nif [ \"$(uname -m)\" != \"arm64\" ]; then\n\techo \"Apple Silicon is required to build HTMLConverter\" >&2\n\texit 1\nfi\n[ ! -d /opt/homebrew ] || eval \"$(/opt/homebrew/bin/brew shellenv)\"\nMISE_BIN=\"${MISE_BIN:-}\"\nif [ -z \"$MISE_BIN\" ]; then\n\tif command -v mise >/dev/null 2>&1; then\n\t\tMISE_BIN=\"$(command -v mise)\"\n\telif [ -x \"$HOME/.local/bin/mise\" ]; then\n\t\tMISE_BIN=\"$HOME/.local/bin/mise\"\n\telif [ -x \"/opt/homebrew/bin/mise\" ]; then\n\t\tMISE_BIN=\"/opt/homebrew/bin/mise\"\n\telif [ -x \"/usr/local/bin/mise\" ]; then\n\t\tMISE_BIN=\"/usr/local/bin/mise\"\n\tfi\nfi\nif [ -z \"$MISE_BIN\" ]; then\n\techo \"mise is required to build HTMLConverter with the pinned Go toolchain\" >&2\n\texit 1\nfi\nexport MISE_TRUSTED_CONFIG_PATHS=\"$PROJECT_DIR${MISE_TRUSTED_CONFIG_PATHS:+:$MISE_TRUSTED_CONFIG_PATHS}\"\nrm -f htmlconverter*.a htmlconverter*.h\nexport MACOSX_DEPLOYMENT_TARGET=\"${MACOSX_DEPLOYMENT_TARGET:-15.0}\"\nexport CGO_CFLAGS=\"-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} ${CGO_CFLAGS}\"\nexport CGO_LDFLAGS=\"-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} ${CGO_LDFLAGS}\"\n# Force rebuilds so cached Go objects use the selected macOS deployment target.\nGOOS=darwin GOARCH=arm64 CGO_ENABLED=1 \"$MISE_BIN\" exec -- go build -a --buildmode=c-archive -ldflags \"-s -w\" -o ./htmlconverter.a\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -1024,6 +866,7 @@ 10779C1526218B2B008A903C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = arm64; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; @@ -1043,7 +886,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_INCLUDE_PATHS = "$(SRCROOT)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Glance.app/Contents/MacOS/Glance"; }; name = Debug; @@ -1051,6 +894,7 @@ 10779C1626218B2B008A903C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = arm64; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; @@ -1070,7 +914,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_INCLUDE_PATHS = "$(SRCROOT)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Glance.app/Contents/MacOS/Glance"; }; name = Release; @@ -1078,6 +922,7 @@ 7E6EF20A240CC802009E4199 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = arm64; CODE_SIGN_ENTITLEMENTS = QLPlugin/QLPlugin.entitlements; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; @@ -1101,13 +946,14 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = "$(SRCROOT)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Debug; }; 7E6EF20B240CC802009E4199 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = arm64; CODE_SIGN_ENTITLEMENTS = QLPlugin/QLPlugin.entitlements; CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; @@ -1131,7 +977,7 @@ PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = "$(SRCROOT)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Release; }; @@ -1139,9 +985,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = arm64; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++23"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1187,14 +1034,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; + MACOSX_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = ""; + SWIFT_VERSION = 6.0; }; name = Debug; }; @@ -1202,9 +1049,10 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = arm64; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++23"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1244,20 +1092,21 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 14.0; + MACOSX_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = ""; + SWIFT_VERSION = 6.0; }; name = Release; }; 7ECC8CFF240CB4CC000D6970 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Glance/Glance.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -1276,13 +1125,14 @@ PRODUCT_BUNDLE_IDENTIFIER = com.chamburr.Glance; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Debug; }; 7ECC8D00240CB4CC000D6970 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Glance/Glance.entitlements; CODE_SIGN_IDENTITY = "-"; @@ -1301,7 +1151,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.chamburr.Glance; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Release; }; @@ -1360,7 +1210,7 @@ repositoryURL = "https://github.com/tsolomko/SWCompression"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 4.8.1; + minimumVersion = 4.9.0; }; }; 7E616BAE244997420043F7AB /* XCRemoteSwiftPackageReference "SwiftCSV" */ = { diff --git a/Glance.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Glance.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..84fcde2 --- /dev/null +++ b/Glance.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,42 @@ +{ + "originHash" : "1ceabeb9031cb69f64f4605e5958335a150d92b9923c53b8a4be2e9470ae4e11", + "pins" : [ + { + "identity" : "bitbytedata", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tsolomko/BitByteData", + "state" : { + "revision" : "e1a5443be67daf0833cbb5f4fa3a06a265ca3105", + "version" : "2.1.0" + } + }, + { + "identity" : "swcompression", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tsolomko/SWCompression", + "state" : { + "revision" : "4896ffae1c1803cd89869b1c9f8b68bfa18a2119", + "version" : "4.9.1" + } + }, + { + "identity" : "swiftcsv", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftcsv/SwiftCSV", + "state" : { + "revision" : "6ab5d0fe9b6ef3c79d717eefa70862df389e74d9", + "version" : "0.10.0" + } + }, + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation", + "state" : { + "revision" : "22787ffb59de99e5dc1fbfe80b19c97a904ad48d", + "version" : "0.9.20" + } + } + ], + "version" : 3 +} diff --git a/Glance/AppDelegate.swift b/Glance/AppDelegate.swift index 2146468..fdc5d29 100644 --- a/Glance/AppDelegate.swift +++ b/Glance/AppDelegate.swift @@ -1,6 +1,7 @@ import Cocoa @main +@MainActor class AppDelegate: NSObject, NSApplicationDelegate { private var mainWindowController: NSWindowController? private var statusItem: NSStatusItem? @@ -79,7 +80,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } @objc private func openMainWindow() { - NSApp.activate(ignoringOtherApps: true) + NSApp.activate() if let window = existingMainWindow() { window.deminiaturize(nil) @@ -96,7 +97,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } @objc private func openSupportedFilesWindow() { - NSApp.activate(ignoringOtherApps: true) + NSApp.activate() SupportedFilesWC.shared.showSupportedFilesWindow() } @@ -151,7 +152,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { @objc private func windowWillClose(_: Notification) { // Defer so the closing window is no longer visible when we check - DispatchQueue.main.async { [weak self] in + Task { @MainActor [weak self] in self?.updateDockIconVisibility() } } diff --git a/Glance/Extensions/NSMenuItem.swift b/Glance/Extensions/NSMenuItem.swift index ff29617..6e606c4 100644 --- a/Glance/Extensions/NSMenuItem.swift +++ b/Glance/Extensions/NSMenuItem.swift @@ -1,5 +1,4 @@ import Cocoa -import Foundation /// Source: Gifski /// v2.7.0 @@ -40,10 +39,12 @@ final class ObjectAssociation { } } +@MainActor extension NSMenuItem { typealias ActionClosure = (NSMenuItem) -> Void private enum AssociatedKeys { + @MainActor static let onActionClosure = ObjectAssociation() } diff --git a/Glance/Extensions/URL.swift b/Glance/Extensions/URL.swift index b969ba7..cef13bf 100644 --- a/Glance/Extensions/URL.swift +++ b/Glance/Extensions/URL.swift @@ -1,5 +1,4 @@ import Cocoa -import Foundation extension URL { func open() { diff --git a/Glance/SettingsWC.swift b/Glance/SettingsWC.swift index ddde520..76eda1d 100644 --- a/Glance/SettingsWC.swift +++ b/Glance/SettingsWC.swift @@ -32,7 +32,7 @@ final class SettingsWC: NSWindowController { func showSettingsWindow() { syncState() - NSApp.activate(ignoringOtherApps: true) + NSApp.activate() showWindow(nil) window?.makeKeyAndOrderFront(nil) } diff --git a/Glance/Shared/Utils/AppSettings.swift b/Glance/Shared/Utils/AppSettings.swift index 852f7e3..7a961cd 100644 --- a/Glance/Shared/Utils/AppSettings.swift +++ b/Glance/Shared/Utils/AppSettings.swift @@ -3,13 +3,13 @@ import Foundation struct AppSettingsStore { static let sharedDefaultsSuiteName = "group.com.chamburr.glance" - static let sharedDefaults: UserDefaults = { + nonisolated(unsafe) static let sharedDefaults: UserDefaults = { guard let defaults = UserDefaults(suiteName: sharedDefaultsSuiteName) else { fatalError("Failed to create UserDefaults with app group suite '\(sharedDefaultsSuiteName)'. Check that the app group is correctly configured.") } return defaults }() - static let shared = AppSettingsStore( + nonisolated(unsafe) static let shared = AppSettingsStore( defaults: sharedDefaults, standardDefaults: .standard ) diff --git a/Glance/Utils/Menu.swift b/Glance/Utils/Menu.swift index d46dd32..fb396a2 100644 --- a/Glance/Utils/Menu.swift +++ b/Glance/Utils/Menu.swift @@ -1,5 +1,4 @@ import Cocoa -import Foundation let feedbackURL = URL(string: "https://github.com/chamburr/glance/issues")! let licenseURL = URL(string: "https://github.com/chamburr/glance/blob/main/LICENSE.md")! @@ -7,6 +6,7 @@ let privacyPolicyURL = URL(string: "https://github.com/chamburr/glance/blob/main let websiteURL = URL(string: "https://github.com/chamburr/glance")! /// Used as a subclass for the menu item in Interface Builder +@MainActor final class SupportedFilesMenuItem: NSMenuItem { required init(coder decoder: NSCoder) { super.init(coder: decoder) @@ -18,6 +18,7 @@ final class SupportedFilesMenuItem: NSMenuItem { } /// Used as a subclass for the menu item in Interface Builder +@MainActor final class SettingsMenuItem: NSMenuItem { required init(coder decoder: NSCoder) { super.init(coder: decoder) @@ -29,6 +30,7 @@ final class SettingsMenuItem: NSMenuItem { } /// Used as a subclass for the menu item in Interface Builder +@MainActor final class FeedbackMenuItem: NSMenuItem { required init(coder decoder: NSCoder) { super.init(coder: decoder) @@ -40,6 +42,7 @@ final class FeedbackMenuItem: NSMenuItem { } /// Used as a subclass for the menu item in Interface Builder +@MainActor final class LicenseMenuItem: NSMenuItem { required init(coder decoder: NSCoder) { super.init(coder: decoder) @@ -51,6 +54,7 @@ final class LicenseMenuItem: NSMenuItem { } /// Used as a subclass for the menu item in Interface Builder +@MainActor final class PrivacyPolicyMenuItem: NSMenuItem { required init(coder decoder: NSCoder) { super.init(coder: decoder) @@ -62,6 +66,7 @@ final class PrivacyPolicyMenuItem: NSMenuItem { } /// Used as a subclass for the menu item in Interface Builder +@MainActor final class WebsiteMenuItem: NSMenuItem { required init(coder decoder: NSCoder) { super.init(coder: decoder) diff --git a/GlanceTests/PreviewSmokeTests.swift b/GlanceTests/PreviewSmokeTests.swift index b15760f..f189639 100644 --- a/GlanceTests/PreviewSmokeTests.swift +++ b/GlanceTests/PreviewSmokeTests.swift @@ -2,8 +2,9 @@ import Foundation import WebKit import XCTest +@MainActor final class PreviewSmokeTests: XCTestCase { - private var temporaryDirectory: URL! + nonisolated(unsafe) private var temporaryDirectory: URL! override func setUpWithError() throws { try super.setUpWithError() @@ -60,6 +61,39 @@ final class PreviewSmokeTests: XCTestCase { XCTAssertThrowsError(try JupyterPreview().createPreviewVC(file: File(url: invalidURL))) } + func testJupyterKaTeXStylesheetReferencesOnlyBundledWOFF2Fonts() throws { + let bundle = WebPreviewVC.resourceBundle + let stylesheetURL = try XCTUnwrap( + bundle.url(forResource: "jupyter-katex.min", withExtension: "css") + ) + let stylesheet = try String(contentsOf: stylesheetURL, encoding: .utf8) + let fontReferences = try katexFontReferences(in: stylesheet) + + XCTAssertFalse(fontReferences.isEmpty) + for fontReference in fontReferences { + XCTAssertEqual(fontReference.pathExtension, "woff2") + XCTAssertNotNil( + bundle.url( + forResource: fontReference.deletingPathExtension().lastPathComponent, + withExtension: fontReference.pathExtension + ), + "Missing bundled KaTeX font: \(fontReference.lastPathComponent)" + ) + } + + let resourceURL = try XCTUnwrap(bundle.resourceURL) + let bundledFallbackFonts = try FileManager.default + .contentsOfDirectory(at: resourceURL, includingPropertiesForKeys: nil) + .filter { + $0.lastPathComponent.hasPrefix("KaTeX_") + && ["ttf", "woff"].contains($0.pathExtension) + } + XCTAssertTrue( + bundledFallbackFonts.isEmpty, + "Unexpected KaTeX fallback fonts: \(bundledFallbackFonts.map(\.lastPathComponent))" + ) + } + func testWebPreviewViewBecomesVisibleAfterLoading() throws { let previewVC = WebPreviewVC(html: "

Visible content

") @@ -331,25 +365,19 @@ final class PreviewSmokeTests: XCTestCase { } private func waitForWebViewToFinishLoading(_ webView: WKWebView, timeout: TimeInterval = 5) { - guard webView.isLoading else { - return + let deadline = Date().addingTimeInterval(timeout) + while webView.isLoading, Date() < deadline { + RunLoop.current.run(mode: .default, before: Date().addingTimeInterval(0.01)) } - - let loadExpectation = keyValueObservingExpectation(for: webView, keyPath: "loading") { object, _ in - (object as? WKWebView)?.isLoading == false - } - wait(for: [loadExpectation], timeout: timeout) + XCTAssertFalse(webView.isLoading) } private func waitForWebViewToBecomeVisible(_ webView: WKWebView, timeout: TimeInterval = 15) { - let visibleExpectation = XCTNSPredicateExpectation( - predicate: NSPredicate { _, _ in - webView.alphaValue == 1 - }, - object: webView - ) - let result = XCTWaiter.wait(for: [visibleExpectation], timeout: timeout) - XCTAssertEqual(result, .completed) + let deadline = Date().addingTimeInterval(timeout) + while webView.alphaValue != 1, Date() < deadline { + RunLoop.current.run(mode: .default, before: Date().addingTimeInterval(0.01)) + } + XCTAssertEqual(webView.alphaValue, 1) } private func runProcess(_ executable: String, arguments: [String], in directory: URL? = nil) throws { @@ -374,6 +402,26 @@ final class PreviewSmokeTests: XCTestCase { } } + private func katexFontReferences(in stylesheet: String) throws -> [URL] { + let expression = try NSRegularExpression(pattern: #"url\(([^)]+)\)"#) + let matches = expression.matches( + in: stylesheet, + range: NSRange(stylesheet.startIndex.. URL? in + guard let range = Range(match.range(at: 1), in: stylesheet) else { + return nil + } + let rawReference = String(stylesheet[range]) + .trimmingCharacters(in: CharacterSet(charactersIn: #""' "#)) + guard rawReference.hasPrefix("KaTeX_") else { + return nil + } + return URL(fileURLWithPath: rawReference) + } + } + private func tarHeader(name: String, sizeField: [UInt8], typeFlag: UInt8 = UInt8(ascii: "0")) -> Data { var header = Data(repeating: 0, count: 512) write(Array(name.utf8), to: &header, at: 0, maxLength: 100) diff --git a/HTMLConverter/go.mod b/HTMLConverter/go.mod index 71e5f89..b2ffee1 100644 --- a/HTMLConverter/go.mod +++ b/HTMLConverter/go.mod @@ -3,7 +3,7 @@ module github.com/chamburr/glance go 1.26 require ( - github.com/alecthomas/chroma/v2 v2.25.0 + github.com/alecthomas/chroma/v2 v2.27.0 github.com/samuelmeuli/nbtohtml v0.5.0 github.com/stretchr/testify v1.11.1 github.com/tdewolff/minify/v2 v2.24.13 @@ -17,12 +17,12 @@ require ( github.com/buildkite/terminal-to-html v3.2.0+incompatible // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dlclark/regexp2 v1.12.0 // indirect - github.com/dlclark/regexp2/v2 v2.1.0 // indirect + github.com/dlclark/regexp2/v2 v2.2.1 // indirect github.com/gorilla/css v1.0.1 // indirect github.com/microcosm-cc/bluemonday v1.0.27 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/tdewolff/parse/v2 v2.8.13 // indirect github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 // indirect - golang.org/x/net v0.55.0 // indirect + golang.org/x/net v0.56.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/HTMLConverter/go.sum b/HTMLConverter/go.sum index c8e6ba2..63929a9 100644 --- a/HTMLConverter/go.sum +++ b/HTMLConverter/go.sum @@ -10,8 +10,8 @@ github.com/alecthomas/chroma v0.7.2/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= -github.com/alecthomas/chroma/v2 v2.25.0 h1:DWkVlxrNpxPf+Qcfe04LBqUArxUiybK8ZQ9T7OFu68E= -github.com/alecthomas/chroma/v2 v2.25.0/go.mod h1:+95AZrRWlpW9g6qXD7S7UdHviopsGP/kCIrtJcU3QoQ= +github.com/alecthomas/chroma/v2 v2.27.0 h1:FodwmyOBgJULFYmDqibcp9pvfDLWdtPRh9v/r5BXYZs= +github.com/alecthomas/chroma/v2 v2.27.0/go.mod h1:NjJ3ciIgrqBNeIkWZ4e46nseoLDslxU1LmfCoL+wcY8= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/kong v0.1.17-0.20190424132513-439c674f7ae0/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= @@ -36,8 +36,8 @@ github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55k github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8= github.com/dlclark/regexp2 v1.12.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dlclark/regexp2/v2 v2.1.0 h1:jHXRmHRZGbuQzDZjMlCAXOvQb75iv3HyLDzXGj5H1AY= -github.com/dlclark/regexp2/v2 v2.1.0/go.mod h1:Bz5TMy5d8fPK0ximH0Yi9KvsRHNnvXqUx9XG6a4wB+I= +github.com/dlclark/regexp2/v2 v2.2.1 h1:mf4KkFUj0gJuarK8P+LgiS+Lit7m9N1yAwEfPbee7R0= +github.com/dlclark/regexp2/v2 v2.2.1/go.mod h1:avUrQvPaLz2DrFNHJF0taWAFFX2C1GMSSoeiqFjcBmU= github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= @@ -93,8 +93,8 @@ github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.m golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/QLPlugin/Extensions/String.swift b/QLPlugin/Extensions/String.swift index 3740397..81c39b2 100644 --- a/QLPlugin/Extensions/String.swift +++ b/QLPlugin/Extensions/String.swift @@ -2,7 +2,7 @@ import Foundation extension String { /// Cache for compiled regular expressions to avoid recompilation on every call - private static let regexCache = NSCache() + private nonisolated(unsafe) static let regexCache = NSCache() /// Returns all matches and capturing groups for the provided regular expression applied to the /// string diff --git a/QLPlugin/MainVC.swift b/QLPlugin/MainVC.swift index 2cd8940..a2d1370 100644 --- a/QLPlugin/MainVC.swift +++ b/QLPlugin/MainVC.swift @@ -42,9 +42,9 @@ class MainVC: NSViewController, QLPreviewingController { /// Function responsible for generating file previews. It's called for previews in Finder, /// Spotlight, Quick Look and any other UI elements which implement the API. - func preparePreviewOfFile( + nonisolated func preparePreviewOfFile( at fileUrl: URL, - completionHandler handler: @escaping (Error?) -> Void + completionHandler handler: @escaping @Sendable (Error?) -> Void ) { DispatchQueue.main.async { // Only preview files when the containing app is running diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_AMS-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_AMS-Regular.ttf deleted file mode 100644 index afcd2eb..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_AMS-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_AMS-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_AMS-Regular.woff deleted file mode 100644 index 4f57515..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_AMS-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Bold.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Bold.ttf deleted file mode 100644 index f84148d..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Bold.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Bold.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Bold.woff deleted file mode 100644 index ab56ab7..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Bold.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Regular.ttf deleted file mode 100644 index 97814db..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Regular.woff deleted file mode 100644 index aec8a33..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Caligraphic-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Bold.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Bold.ttf deleted file mode 100644 index 483a7cd..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Bold.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Bold.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Bold.woff deleted file mode 100644 index 189fea5..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Bold.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Regular.ttf deleted file mode 100644 index 9aa5f67..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Regular.woff deleted file mode 100644 index d01450e..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Fraktur-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Bold.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Bold.ttf deleted file mode 100644 index dc0185a..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Bold.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Bold.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Bold.woff deleted file mode 100644 index acf48e6..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Bold.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-BoldItalic.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-BoldItalic.ttf deleted file mode 100644 index 4346f17..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-BoldItalic.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-BoldItalic.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-BoldItalic.woff deleted file mode 100644 index d2cfe4e..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-BoldItalic.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Italic.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Italic.ttf deleted file mode 100644 index f2c3eba..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Italic.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Italic.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Italic.woff deleted file mode 100644 index 1184295..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Italic.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Regular.ttf deleted file mode 100644 index 8acb365..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Regular.woff deleted file mode 100644 index 9f8228f..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Main-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-BoldItalic.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-BoldItalic.ttf deleted file mode 100644 index a645df6..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-BoldItalic.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-BoldItalic.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-BoldItalic.woff deleted file mode 100644 index 87d4f22..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-BoldItalic.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-Italic.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-Italic.ttf deleted file mode 100644 index 9c38359..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-Italic.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-Italic.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-Italic.woff deleted file mode 100644 index 959746e..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Math-Italic.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Bold.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Bold.ttf deleted file mode 100644 index ff10851..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Bold.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Bold.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Bold.woff deleted file mode 100644 index f0d6ea7..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Bold.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Italic.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Italic.ttf deleted file mode 100644 index 3dd7671..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Italic.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Italic.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Italic.woff deleted file mode 100644 index 9da0dfe..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Italic.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Regular.ttf deleted file mode 100644 index f117cd6..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Regular.woff deleted file mode 100644 index 6ed9878..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_SansSerif-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Script-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Script-Regular.ttf deleted file mode 100644 index e6f3454..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Script-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Script-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Script-Regular.woff deleted file mode 100644 index 4a48e65..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Script-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size1-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size1-Regular.ttf deleted file mode 100644 index 37faa0f..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size1-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size1-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size1-Regular.woff deleted file mode 100644 index 0832f7a..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size1-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size2-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size2-Regular.ttf deleted file mode 100644 index cf32623..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size2-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size2-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size2-Regular.woff deleted file mode 100644 index 14f6485..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size2-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size3-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size3-Regular.ttf deleted file mode 100644 index ff7e2b9..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size3-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size3-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size3-Regular.woff deleted file mode 100644 index d3626ce..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size3-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size4-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size4-Regular.ttf deleted file mode 100644 index 3034091..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size4-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size4-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Size4-Regular.woff deleted file mode 100644 index 93c57a6..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Size4-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Typewriter-Regular.ttf b/QLPlugin/Resources/jupyter/fonts/KaTeX_Typewriter-Regular.ttf deleted file mode 100644 index 2fd8529..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Typewriter-Regular.ttf and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/fonts/KaTeX_Typewriter-Regular.woff b/QLPlugin/Resources/jupyter/fonts/KaTeX_Typewriter-Regular.woff deleted file mode 100644 index e90fa2b..0000000 Binary files a/QLPlugin/Resources/jupyter/fonts/KaTeX_Typewriter-Regular.woff and /dev/null differ diff --git a/QLPlugin/Resources/jupyter/jupyter-katex.min.css b/QLPlugin/Resources/jupyter/jupyter-katex.min.css index 7f3c39e..2a5499b 100644 --- a/QLPlugin/Resources/jupyter/jupyter-katex.min.css +++ b/QLPlugin/Resources/jupyter/jupyter-katex.min.css @@ -23,4 +23,4 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -@font-face{font-family:KaTeX_AMS;src:url(KaTeX_AMS-Regular.woff2) format("woff2"),url(KaTeX_AMS-Regular.woff) format("woff"),url(KaTeX_AMS-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(KaTeX_Caligraphic-Bold.woff) format("woff"),url(KaTeX_Caligraphic-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(KaTeX_Caligraphic-Regular.woff) format("woff"),url(KaTeX_Caligraphic-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(KaTeX_Fraktur-Bold.woff2) format("woff2"),url(KaTeX_Fraktur-Bold.woff) format("woff"),url(KaTeX_Fraktur-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(KaTeX_Fraktur-Regular.woff2) format("woff2"),url(KaTeX_Fraktur-Regular.woff) format("woff"),url(KaTeX_Fraktur-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-Bold.woff2) format("woff2"),url(KaTeX_Main-Bold.woff) format("woff"),url(KaTeX_Main-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-BoldItalic.woff2) format("woff2"),url(KaTeX_Main-BoldItalic.woff) format("woff"),url(KaTeX_Main-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-Italic.woff2) format("woff2"),url(KaTeX_Main-Italic.woff) format("woff"),url(KaTeX_Main-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-Regular.woff2) format("woff2"),url(KaTeX_Main-Regular.woff) format("woff"),url(KaTeX_Main-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(KaTeX_Math-BoldItalic.woff2) format("woff2"),url(KaTeX_Math-BoldItalic.woff) format("woff"),url(KaTeX_Math-BoldItalic.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(KaTeX_Math-Italic.woff2) format("woff2"),url(KaTeX_Math-Italic.woff) format("woff"),url(KaTeX_Math-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(KaTeX_SansSerif-Bold.woff2) format("woff2"),url(KaTeX_SansSerif-Bold.woff) format("woff"),url(KaTeX_SansSerif-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(KaTeX_SansSerif-Italic.woff2) format("woff2"),url(KaTeX_SansSerif-Italic.woff) format("woff"),url(KaTeX_SansSerif-Italic.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(KaTeX_SansSerif-Regular.woff2) format("woff2"),url(KaTeX_SansSerif-Regular.woff) format("woff"),url(KaTeX_SansSerif-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(KaTeX_Script-Regular.woff2) format("woff2"),url(KaTeX_Script-Regular.woff) format("woff"),url(KaTeX_Script-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(KaTeX_Size1-Regular.woff2) format("woff2"),url(KaTeX_Size1-Regular.woff) format("woff"),url(KaTeX_Size1-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(KaTeX_Size2-Regular.woff2) format("woff2"),url(KaTeX_Size2-Regular.woff) format("woff"),url(KaTeX_Size2-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(KaTeX_Size3-Regular.woff2) format("woff2"),url(KaTeX_Size3-Regular.woff) format("woff"),url(KaTeX_Size3-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(KaTeX_Size4-Regular.woff2) format("woff2"),url(KaTeX_Size4-Regular.woff) format("woff"),url(KaTeX_Size4-Regular.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(KaTeX_Typewriter-Regular.woff2) format("woff2"),url(KaTeX_Typewriter-Regular.woff) format("woff"),url(KaTeX_Typewriter-Regular.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.11.1"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} +@font-face{font-family:KaTeX_AMS;src:url(KaTeX_AMS-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(KaTeX_Caligraphic-Bold.woff2) format("woff2");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(KaTeX_Caligraphic-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(KaTeX_Fraktur-Bold.woff2) format("woff2");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(KaTeX_Fraktur-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-Bold.woff2) format("woff2");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-BoldItalic.woff2) format("woff2");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-Italic.woff2) format("woff2");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(KaTeX_Main-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(KaTeX_Math-BoldItalic.woff2) format("woff2");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(KaTeX_Math-Italic.woff2) format("woff2");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(KaTeX_SansSerif-Bold.woff2) format("woff2");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(KaTeX_SansSerif-Italic.woff2) format("woff2");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(KaTeX_SansSerif-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(KaTeX_Script-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(KaTeX_Size1-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(KaTeX_Size2-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(KaTeX_Size3-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(KaTeX_Size4-Regular.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(KaTeX_Typewriter-Regular.woff2) format("woff2");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.11.1"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} diff --git a/QLPlugin/Views/PreviewVC.swift b/QLPlugin/Views/PreviewVC.swift index f183353..32ce562 100644 --- a/QLPlugin/Views/PreviewVC.swift +++ b/QLPlugin/Views/PreviewVC.swift @@ -1,5 +1,4 @@ import Cocoa -import Foundation /// View controller for rendering previews of a specific file type. protocol PreviewVC: NSViewController {} @@ -7,5 +6,5 @@ protocol PreviewVC: NSViewController {} /// Class that can be used to create an instance of a `PreviewVC` for the corresponding file type. protocol Preview { init() - func createPreviewVC(file: File) throws -> PreviewVC + @MainActor func createPreviewVC(file: File) throws -> PreviewVC } diff --git a/QLPlugin/Views/PreviewVCs/WebPreviewVC.swift b/QLPlugin/Views/PreviewVCs/WebPreviewVC.swift index 021e687..dcccedf 100644 --- a/QLPlugin/Views/PreviewVCs/WebPreviewVC.swift +++ b/QLPlugin/Views/PreviewVCs/WebPreviewVC.swift @@ -1,5 +1,4 @@ import Cocoa -import Foundation import WebKit class WebPreviewVC: NSViewController, PreviewVC, WKNavigationDelegate { @@ -9,7 +8,7 @@ class WebPreviewVC: NSViewController, PreviewVC, WKNavigationDelegate { private let previewNonce = UUID().uuidString.replacingOccurrences(of: "-", with: "") private var webView: WKWebView? - static let resourceBundle: Bundle = { + nonisolated static let resourceBundle: Bundle = { let embeddedPluginBundle = Bundle.main.builtInPlugInsURL .flatMap { Bundle(url: $0.appendingPathComponent("QLPlugin.appex")) } let candidates = [ @@ -62,8 +61,10 @@ class WebPreviewVC: NSViewController, PreviewVC, WKNavigationDelegate { } deinit { - webView?.navigationDelegate = nil - webView?.stopLoading() + MainActor.assumeIsolated { + webView?.navigationDelegate = nil + webView?.stopLoading() + } } override func viewDidLoad() { diff --git a/README.md b/README.md index e4b5553..47fc44d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ > This repository is a fork of [chamburr/glance](https://github.com/chamburr/glance) with additional maintenance and distribution work. > Compared with upstream, this fork includes: > -> - macOS 14+ modernization +> - macOS 15+ modernization +> - Apple Silicon-only builds > - newer Quick Look and WebKit fixes > - `.toml`, `.ttml`, and `.elrc` source-code previews > - expanded archive support @@ -24,7 +25,7 @@ ## About -This is a fork of the [original Glance plugin](https://github.com/samuelmeuli/glance). Unfortunately, the owner seems to have discarded the project a while ago, and the app is largely broken on newer macOS systems. The aim of this fork is to revive the project and maintain it for future updates. Current builds target macOS 14 or newer and include fixes for newer macOS releases. +This is a fork of the [original Glance plugin](https://github.com/samuelmeuli/glance). Unfortunately, the owner seems to have discarded the project a while ago, and the app is largely broken on newer macOS systems. The aim of this fork is to revive the project and maintain it for future updates. Current builds target Apple Silicon Macs running macOS 15 or newer and include fixes for newer macOS releases. ## Installation @@ -70,9 +71,9 @@ Alternatively, you can install Glance directly. The installation is slightly com - Some plugins still use the deprecated Quick Look Generator API and might stop working in the future. - Glance can easily be extended to support other file types. -**Why isn't the app available on older macOS versions?** +**Why isn't the app available on older macOS versions or Intel Macs?** -The app uses modern Quick Look, WebKit, and archive dependencies that now require macOS 14 or newer. +The app uses modern Quick Look, WebKit, and archive dependencies that now require macOS 15 or newer. This fork intentionally ships Apple Silicon-only builds. **Why are images in my Markdown files not loading?** diff --git a/mise.toml b/mise.toml index 021dc34..2c8b56e 100644 --- a/mise.toml +++ b/mise.toml @@ -1,5 +1,5 @@ [tools] -go = "1.26.3" +go = "1.26.4" swiftformat = "0.61.1" swiftlint = "0.63.3" @@ -73,12 +73,7 @@ APP_NAME="${APP_NAME:-Glance}" echo "Cleaning build artifacts..." rm -rf build rm -rf "$HOME/Library/Developer/Xcode/DerivedData/$APP_NAME"-* -rm -f HTMLConverter/htmlconverter-amd64.a \ - HTMLConverter/htmlconverter-arm64.a \ - HTMLConverter/htmlconverter.a \ - HTMLConverter/htmlconverter-amd64.h \ - HTMLConverter/htmlconverter-arm64.h \ - HTMLConverter/htmlconverter.h +rm -f HTMLConverter/htmlconverter*.a HTMLConverter/htmlconverter*.h echo "Clean complete" '''