diff --git a/.gemini/config.yaml b/.gemini/config.yaml
deleted file mode 100644
index d9687c2..0000000
--- a/.gemini/config.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-have_fun: false
-code_review:
- disable: false
- comment_severity_threshold: MEDIUM
- max_review_comments: -1
- pull_request_opened:
- help: false
- summary: true
- code_review: true
diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
index 27b46b2..5f77360 100644
--- a/.github/workflows/gh-pages.yml
+++ b/.github/workflows/gh-pages.yml
@@ -1,4 +1,4 @@
-name: GitHub Pages
+name: Deploy React Site
on:
push:
@@ -8,30 +8,31 @@ on:
branches:
- main
+permissions:
+ contents: write
+
jobs:
- build:
+ build-and-deploy:
runs-on: ubuntu-latest
steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Set up Ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: '3.3'
- bundler-cache: true
-
- - name: Install dependencies
- run: |
- gem install bundler
- bundle install
-
- - name: Build the site
- run: bundle exec jekyll build
-
- - name: Deploy to GitHub Pages
- uses: peaceiris/actions-gh-pages@v3
- with:
- github_token: ${{ secrets.MYBLOGACTIONSECRET }}
- publish_dir: ./_site
+ - name: Checkout repository
+ uses: actions/checkout@v6
+
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@v2
+ with:
+ bun-version: latest
+
+ - name: Install dependencies
+ run: bun install --frozen-lockfile
+
+ - name: Build the site
+ run: bun run build
+
+ - name: Deploy to GitHub Pages
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ github_token: ${{ secrets.MYBLOGACTIONSECRET }}
+ folder: dist
+ branch: gh-pages
diff --git a/.gitignore b/.gitignore
index 16a53a1..a547bf3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,24 @@
-.vscode/*
-!.vscode/tasks.json
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
-_site/
-.sass-cache/
-.jekyll-cache/
-.jekyll-metadata/
-vendor/
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index bde465d..92cd1e2 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -2,22 +2,36 @@
"version": "2.0.0",
"tasks": [
{
- "label": "local install",
+ "label": "install",
"type": "shell",
- "command": "sh scripts/install.sh",
+ "command": "bun install",
"group": {
"kind": "build",
"isDefault": true
},
},
{
- "label": "local test",
+ "label": "build",
"type": "shell",
- "command": "sh scripts/test.sh",
+ "command": "bun run build",
"group": {
"kind": "build",
"isDefault": true
},
},
+ {
+ "label": "dev",
+ "type": "shell",
+ "command": "bun run dev",
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ },
+ "problemMatcher": [],
+ "presentation": {
+ "reveal": "always",
+ "panel": "new"
+ }
+ },
]
-}
+}
\ No newline at end of file
diff --git a/404.html b/404.html
deleted file mode 100644
index 3d886f9..0000000
--- a/404.html
+++ /dev/null
@@ -1,6 +0,0 @@
----
-permalink: /404.html
-layout: default
----
-
-
Page not found
diff --git a/Gemfile b/Gemfile
deleted file mode 100644
index 60b2b7c..0000000
--- a/Gemfile
+++ /dev/null
@@ -1,14 +0,0 @@
-source "https://rubygems.org"
-
-gem "jekyll", "~> 4.4.1"
-gem "minima", "~> 2.5"
-gem "sassc", "~> 2.4"
-
-group :jekyll_plugins do
- gem "jekyll-feed", "~> 0.12"
-end
-
-gem "minimal-mistakes-jekyll"
-gem "kramdown"
-gem "rouge"
-gem "jekyll-sass-converter"
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644
index 3bad19d..0000000
--- a/Gemfile.lock
+++ /dev/null
@@ -1,201 +0,0 @@
-GEM
- remote: https://rubygems.org/
- specs:
- addressable (2.8.7)
- public_suffix (>= 2.0.2, < 7.0)
- base64 (0.2.0)
- bigdecimal (3.1.9)
- colorator (1.1.0)
- concurrent-ruby (1.3.5)
- csv (3.3.3)
- em-websocket (0.5.3)
- eventmachine (>= 0.12.9)
- http_parser.rb (~> 0)
- eventmachine (1.2.7)
- faraday (2.12.2)
- faraday-net_http (>= 2.0, < 3.5)
- json
- logger
- faraday-net_http (3.4.0)
- net-http (>= 0.5.0)
- ffi (1.17.1)
- ffi (1.17.1-aarch64-linux-gnu)
- ffi (1.17.1-aarch64-linux-musl)
- ffi (1.17.1-arm-linux-gnu)
- ffi (1.17.1-arm-linux-musl)
- ffi (1.17.1-arm64-darwin)
- ffi (1.17.1-x86-linux-gnu)
- ffi (1.17.1-x86-linux-musl)
- ffi (1.17.1-x86_64-darwin)
- ffi (1.17.1-x86_64-linux-gnu)
- ffi (1.17.1-x86_64-linux-musl)
- forwardable-extended (2.6.0)
- google-protobuf (4.30.2)
- bigdecimal
- rake (>= 13)
- google-protobuf (4.30.2-aarch64-linux)
- bigdecimal
- rake (>= 13)
- google-protobuf (4.30.2-arm64-darwin)
- bigdecimal
- rake (>= 13)
- google-protobuf (4.30.2-x86-linux)
- bigdecimal
- rake (>= 13)
- google-protobuf (4.30.2-x86_64-darwin)
- bigdecimal
- rake (>= 13)
- google-protobuf (4.30.2-x86_64-linux)
- bigdecimal
- rake (>= 13)
- http_parser.rb (0.8.0)
- i18n (1.14.7)
- concurrent-ruby (~> 1.0)
- jekyll (4.4.1)
- addressable (~> 2.4)
- base64 (~> 0.2)
- colorator (~> 1.0)
- csv (~> 3.0)
- em-websocket (~> 0.5)
- i18n (~> 1.0)
- jekyll-sass-converter (>= 2.0, < 4.0)
- jekyll-watch (~> 2.0)
- json (~> 2.6)
- kramdown (~> 2.3, >= 2.3.1)
- kramdown-parser-gfm (~> 1.0)
- liquid (~> 4.0)
- mercenary (~> 0.3, >= 0.3.6)
- pathutil (~> 0.9)
- rouge (>= 3.0, < 5.0)
- safe_yaml (~> 1.0)
- terminal-table (>= 1.8, < 4.0)
- webrick (~> 1.7)
- jekyll-feed (0.17.0)
- jekyll (>= 3.7, < 5.0)
- jekyll-gist (1.5.0)
- octokit (~> 4.2)
- jekyll-include-cache (0.2.1)
- jekyll (>= 3.7, < 5.0)
- jekyll-paginate (1.1.0)
- jekyll-sass-converter (3.1.0)
- sass-embedded (~> 1.75)
- jekyll-seo-tag (2.8.0)
- jekyll (>= 3.8, < 5.0)
- jekyll-sitemap (1.4.0)
- jekyll (>= 3.7, < 5.0)
- jekyll-watch (2.2.1)
- listen (~> 3.0)
- json (2.10.2)
- kramdown (2.5.1)
- rexml (>= 3.3.9)
- kramdown-parser-gfm (1.1.0)
- kramdown (~> 2.0)
- liquid (4.0.4)
- listen (3.9.0)
- rb-fsevent (~> 0.10, >= 0.10.3)
- rb-inotify (~> 0.9, >= 0.9.10)
- logger (1.7.0)
- mercenary (0.4.0)
- minima (2.5.2)
- jekyll (>= 3.5, < 5.0)
- jekyll-feed (~> 0.9)
- jekyll-seo-tag (~> 2.1)
- minimal-mistakes-jekyll (4.26.2)
- jekyll (>= 3.7, < 5.0)
- jekyll-feed (~> 0.1)
- jekyll-gist (~> 1.5)
- jekyll-include-cache (~> 0.1)
- jekyll-paginate (~> 1.1)
- jekyll-sitemap (~> 1.3)
- net-http (0.6.0)
- uri
- octokit (4.25.1)
- faraday (>= 1, < 3)
- sawyer (~> 0.9)
- pathutil (0.16.2)
- forwardable-extended (~> 2.6)
- public_suffix (6.0.1)
- rake (13.2.1)
- rb-fsevent (0.11.2)
- rb-inotify (0.11.1)
- ffi (~> 1.0)
- rexml (3.4.1)
- rouge (4.5.1)
- safe_yaml (1.0.5)
- sass-embedded (1.86.0)
- google-protobuf (~> 4.30)
- rake (>= 13)
- sass-embedded (1.86.0-aarch64-linux-android)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-aarch64-linux-gnu)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-aarch64-linux-musl)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-arm-linux-androideabi)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-arm-linux-gnueabihf)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-arm-linux-musleabihf)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-arm64-darwin)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-riscv64-linux-android)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-riscv64-linux-gnu)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-riscv64-linux-musl)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-x86_64-darwin)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-x86_64-linux-android)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-x86_64-linux-gnu)
- google-protobuf (~> 4.30)
- sass-embedded (1.86.0-x86_64-linux-musl)
- google-protobuf (~> 4.30)
- sassc (2.4.0)
- ffi (~> 1.9)
- sawyer (0.9.2)
- addressable (>= 2.3.5)
- faraday (>= 0.17.3, < 3)
- terminal-table (3.0.2)
- unicode-display_width (>= 1.1.1, < 3)
- unicode-display_width (2.6.0)
- uri (1.0.3)
- webrick (1.9.1)
-
-PLATFORMS
- aarch64-linux
- aarch64-linux-android
- aarch64-linux-gnu
- aarch64-linux-musl
- arm-linux-androideabi
- arm-linux-gnu
- arm-linux-gnueabihf
- arm-linux-musl
- arm-linux-musleabihf
- arm64-darwin
- riscv64-linux-android
- riscv64-linux-gnu
- riscv64-linux-musl
- ruby
- x86-linux
- x86-linux-gnu
- x86-linux-musl
- x86_64-darwin
- x86_64-linux
- x86_64-linux-android
- x86_64-linux-musl
-
-DEPENDENCIES
- jekyll (~> 4.4.1)
- jekyll-feed (~> 0.12)
- jekyll-sass-converter
- kramdown
- minima (~> 2.5)
- minimal-mistakes-jekyll
- rouge
- sassc (~> 2.4)
-
-BUNDLED WITH
- 2.6.6
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ac5354b
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+My Technical Writing Licensed under **CC BY-NC-SA 4.0**, see [LICENSE](LICENSE) file.
\ No newline at end of file
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index 43d859c..0000000
--- a/_config.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-title: Gapry's Blog
-
-email: gapry [at] protonmail [dot] com
-
-description: ""
-
-baseurl: ""
-
-url: ""
-
-twitter_username: ""
-
-github_username: ""
-
-theme: minimal-mistakes-jekyll
-
-future: true
-
-analytics:
- provider: "google-gtag"
- google:
- tracking_id: "G-4DG3HSBT1T"
- anonymize_ip: true
-
-plugins:
- - jekyll-feed
-
-markdown: kramdown
-
-kramdown:
- input: GFM
- syntax_highlighter: rouge
- syntax_highlighter_opts:
- css_class: 'highlight'
- span:
- line_numbers: false
- block:
- line_numbers: false
-
-exclude:
- - .sass-cache/
- - .jekyll-cache/
- - gemfiles/
- - Gemfile
- - Gemfile.lock
- - node_modules/
- - vendor/bundle/
- - vendor/cache/
- - vendor/gems/
- - vendor/ruby/
- - bpc/
- - .nojekyll
- - install.sh
- - test.sh
-
-footer:
- links:
- - label: "GitHub"
- icon: "fab fa-fw fa-github"
- url: https://github.com/gapry
- - label: "Twitter"
- icon: "fab fa-fw fa-twitter-square"
- url: https://twitter.com/_gapry
diff --git a/_data/navigation.yml b/_data/navigation.yml
deleted file mode 100644
index 66c57b5..0000000
--- a/_data/navigation.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-main:
- - title: "About"
- url: /about/
diff --git a/_includes/google-analytics.html b/_includes/google-analytics.html
deleted file mode 100644
index 8bd5b77..0000000
--- a/_includes/google-analytics.html
+++ /dev/null
@@ -1,16 +0,0 @@
-{% if site.analytics.google.tracking_id %}
-
-
-
-
-
-{% endif %}
diff --git a/_includes/head/custom.html b/_includes/head/custom.html
deleted file mode 100644
index 2da9941..0000000
--- a/_includes/head/custom.html
+++ /dev/null
@@ -1 +0,0 @@
-{% include google-analytics.html %}
diff --git a/_layouts/home.html b/_layouts/home.html
deleted file mode 100644
index 4533612..0000000
--- a/_layouts/home.html
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: archive
----
-
-
-
diff --git a/_posts/2026-01-01-Advent-of-Compiler-Optimisations-Study-Notes-01.md b/_posts/2026-01-01-Advent-of-Compiler-Optimisations-Study-Notes-01.md
deleted file mode 100644
index e3fcabb..0000000
--- a/_posts/2026-01-01-Advent-of-Compiler-Optimisations-Study-Notes-01.md
+++ /dev/null
@@ -1,315 +0,0 @@
----
-layout: default
-title: "Study Notes: Why xor eax, eax?, Advent of Compiler Optimisations 2025"
-date: 2026-01-01
-tag: compiler
----
-
-## Study Notes: Why xor eax, eax?, Advent of Compiler Optimisations 2025
-
-These notes are based on the post [**Why xor eax, eax?**](https://xania.org/202512/01-xor-eax-eax), which is Day 1 of the [Advent of Compiler Optimisations 2025](https://xania.org/AoCO2025-archive) Series by [Matt Godbolt](https://xania.org/MattGodbolt).
-
-#### Development Environment
-
-```
-$ lsb_release -d
-Description: Ubuntu 24.04.3 LTS
-
-$ gcc -v
-gcc version 13.3.0
-
-$ clang -v
-Ubuntu clang version 18.1.8
-
-$ llvm-objdump -v
-Ubuntu LLVM version 18.1.8
-
-$ lldb -v
-lldb version 18.1.8
-
-$ nvim --version
-NVIM v0.11.5
-
-$ echo $SHELL
-/usr/bin/fish
-```
-
-#### The difference between `-O0`, `-O1`, and `-O2`
-
-Basically, we know the compiler has the following stages. If we use the same code but choose different
-optimization levels, the final assembly code will be different.
-
-```
- [ FRONTEND ] [ MIDDLE-END ] [ BACKEND ]
- .----------. .------------. .------------.
- | Lexer | | | | Code |
-Source Code (*.c) ---> | & | ---> | Optimizer | ---> | Generator | ---> [ Assembly (*.s) ]
- | Parser | | | | (e.g. x86) |
- '----------' '------------' '------------'
-```
-
-For now, we use `main.c` as input (shown below), apply different optimization levels,
-and use `llvm-objdump` to analyze the corresponding assembly code.
-
-```
-$ nvim main.c
-```
-
-```c
-int main() {
- return 0;
-}
-```
-
-###### Use `-O0` as optimization level
-
-```
-$ rm -f (path filter *.o); gcc -O0 -c main.c; llvm-objdump -d --x86-asm-syntax=att main.o
-```
-
-```
-main.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: f3 0f 1e fa endbr64
- 4: 55 pushq %rbp
- 5: 48 89 e5 movq %rsp, %rbp
- 8: b8 00 00 00 00 movl $0x0, %eax
- d: 5d popq %rbp
- e: c3 retq
-```
-
-```
-$ size main.o
-```
-
-```
-text data bss dec hex filename
- 103 0 0 103 67 main.o
-```
-
-As `-O0`, the compiler generates a stack frame, leading to unnecessary instruction overhead.
-
-###### Use `-O1` as optimization level
-```
-$ rm -f (path filter *.o); gcc -O1 -c main.c; llvm-objdump -d --x86-asm-syntax=att main.o
-```
-
-```
-main.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: f3 0f 1e fa endbr64
- 4: b8 00 00 00 00 movl $0x0, %eax
- 9: c3 retq
-```
-
-```
-$ size main.o
-```
-
-```
-text data bss dec hex filename
- 90 0 0 90 5a main.o
-```
-
-It reduces the output from six instructions to three by removing the stack frame setup.
-
-###### Use `-O2` as optimization level
-```
-$ rm -f (path filter *.o); gcc -O2 -c main.c; llvm-objdump -d --x86-asm-syntax=att main.o
-```
-
-```
-main.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: f3 0f 1e fa endbr64
- 4: 31 c0 xorl %eax, %eax
- 6: c3 retq
-```
-
-```
-$ size main.o
-```
-
-```
-text data bss dec hex filename
- 87 0 0 87 57 main.o
-```
-
-As you can see, `-O2` and `-O1` both produce three instructions.
-The only differences is that `-O2` changes from `movl` to `xorl`.
-The reason is the instruction size. `xorl %eax, %eax` only use two bytes,
-making it smaller than the five bytes `movl $0x0, %eax`.
-Hence, you can see the total `.text` size reduces from 90 bytes to 87 bytes.
-
-#### How about we change `gcc` to `clang`?
-```
-$ rm -f (path filter *.o); clang -O1 -c main.c; llvm-objdump -d --x86-asm-syntax=att main.o
-```
-
-```
-rm -f (path filter *.o); clang -O1 -c main.c; llvm-objdump -d --x86-asm-syntax=att main.o
-
-main.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 31 c0 xorl %eax, %eax
- 2: c3 retq
-```
-
-You will find that the Clang's `-O1` output already uses `xorl`, making it similar to GCC's `-O2`.
-Additionally, it consists of only two instructions because Clang does not generate the `endbr64` instruction.
-
-#### Why `eax`, not `rax` ?
-
-```
-$ nvim get_val.c
-```
-
-```c
-long get_val() {
- return 0;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c get_val.c; llvm-objdump -d --x86-asm-syntax=att get_val.o
-```
-
-```
-get_val.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 31 c0 xorl %eax, %eax
- 2: c3 retq
-```
-
-As we know, the x86-64 calling convention requires the return value to be stored in the
-64-bit `rax` register. However, we see that the compiler uses the 32-bit `eax` register for the `xorl` instruction.
-The reason is that in x86-64, any operation that writes to a 32-bit register automatically zero-extends the result
-into the upper 32 bits of the corresponding 64-bit register.
-
-Let's see an example for verifying Zero-Extension with LLDB
-
-```
-$ nvim main.c
-```
-
-```c
-int main() {
- return 0;
-}
-```
-
-```
-$ rm -f (path filter *.out); clang -g -O2 -o app.out main.c; lldb app.out
-```
-
-```
-(lldb) target create "app.out"
-Current executable set to '/home/gapry/Workspaces/test/app.out' (x86_64).
-(lldb) breakpoint set -n main
-Breakpoint 1: where = app.out`main at main.c:2:3, address = 0x0000000000001130
-(lldb) r
-Process 409020 launched: '/home/gapry/Workspaces/test/app.out' (x86_64)
-Process 409020 stopped
-* thread #1, name = 'app.out', stop reason = breakpoint 1.1
- frame #0: 0x0000555555555130 app.out`main at main.c:2:3
- 1 int main() {
--> 2 return 0;
- 3 }
-(lldb) register write rax 0xffffffffffffffff
-(lldb) register read rax
- rax = 0xffffffffffffffff
-(lldb) disassemble --pc
-app.out`main:
--> 0x555555555130 <+0>: xorl %eax, %eax
- 0x555555555132 <+2>: retq
- 0x555555555133: addb %dh, %bl
-(lldb) thread step-inst
-Process 409020 stopped
-* thread #1, name = 'app.out', stop reason = instruction step into
- frame #0: 0x0000555555555132 app.out`main at main.c:2:3
- 1 int main() {
--> 2 return 0;
- 3 }
-(lldb) disassemble --pc
-app.out`main:
--> 0x555555555132 <+2>: retq
- 0x555555555133: addb %dh, %bl
-(lldb) register read rax
- rax = 0x0000000000000000
-(lldb)
-```
-
-The LLDB output confirms that even though `xorl` only targets the lower 32 bits `%eax` register,
-the hardware automatically cleared the entire 64-bit `%rax` register.
-
-#### Caller/Callee Arguments
-```
-$ nvim main.c
-```
-
-```c
-extern void g(long arg1,
- long arg2,
- long arg3,
- long arg4,
- long arg5,
- long arg6);
-
-void f() {
- g(0, 0, 0, 0, 0, 0);
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c main.c; llvm-objdump -d --disassemble-symbols=f --x86-asm-syntax=att main.o
-```
-
-```
-main.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 31 ff xorl %edi, %edi
- 2: 31 f6 xorl %esi, %esi
- 4: 31 d2 xorl %edx, %edx
- 6: 31 c9 xorl %ecx, %ecx
- 8: 45 31 c0 xorl %r8d, %r8d
- b: 45 31 c9 xorl %r9d, %r9d
- e: e9 00 00 00 00 jmp 0x13
-```
-
-According to the x86-64 System V ABI, the first six integer or pointer arguments are passed in
-specific registers. To pass `0` to all of them, the compiler again uses the `xorl` optimization to
-zero out each one:
-
-| Argument | 64-bit Register | 32-bit Register |
-| :--- | :--- | :--- |
-| 1st | `%rdi` | `%edi` |
-| 2nd | `%rsi` | `%esi` |
-| 3rd | `%rdx` | `%edx` |
-| 4th | `%rcx` | `%ecx` |
-| 5th | `%r8` | `%r8d` |
-| 6th | `%r9` | `%r9d` |
-
-The `xorl` optimization does not only appear for return values, you will also see it frequently
-when a caller prepares arguments for a callee. As with the previous example, zeroing the 32-bit
-version of these registers automatically zero-extends to the full 64-bit register.
-
-## References
-- [x64 architecture](https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/x64-architecture)
\ No newline at end of file
diff --git a/_posts/2026-01-31-Advent-of-Compiler-Optimisations-Study-Notes-02.md b/_posts/2026-01-31-Advent-of-Compiler-Optimisations-Study-Notes-02.md
deleted file mode 100644
index 6c65286..0000000
--- a/_posts/2026-01-31-Advent-of-Compiler-Optimisations-Study-Notes-02.md
+++ /dev/null
@@ -1,193 +0,0 @@
----
-layout: default
-title: "Study Notes: Addressing the adding situation, Advent of Compiler Optimisations 2025"
-date: 2026-01-31
-tag: compiler
----
-
-## Study Notes: Addressing the adding situation, Advent of Compiler Optimisations 2025
-
-These notes are based on the post [**Addressing the adding situation**](https://xania.org/202512/02-adding-integers) and the YouTube video [**[AoCO 2/25] Adding Integers on x86 - just an ADD, right?**](https://www.youtube.com/watch?v=BOvg0sGJnes&list=PL2HVqYf7If8cY4wLk7JUQ2f0JXY_xMQm2&index=3) which are Day 2 of the [Advent of Compiler Optimisations 2025](https://xania.org/AoCO2025-archive) Series by [Matt Godbolt](https://xania.org/MattGodbolt).
-
-My notes focus on reproducing and verifying [Matt Godbolt](https://xania.org/MattGodbolt)'s teaching within a local development environment using `LLVM` toolchain on `Ubuntu`.
-
-Additionally, I have extended the discussion by implementing a manual Proof of Concept in assembly to demonstrate the equivalence of `add` vs `lea` instructions.
-
-Selected technical insights from the YouTube comment section are reproduced at the end of these notes to provide additional context.
-
-Written by me and assisted by AI, proofread by me and assisted by AI.
-
-#### Development Environment
-```
-$ lsb_release -d
-Description: Ubuntu 24.04.3 LTS
-
-$ clang -v
-Ubuntu clang version 18.1.8
-
-$ llvm-objdump -v
-Ubuntu LLVM version 18.1.8
-
-$ nvim --version
-NVIM v0.11.5
-
-$ echo $SHELL
-/usr/bin/fish
-```
-
-## Integer Addition
-
-To understand how `clang` translates `C` addition into `x86-64` machine instructions, we use the following implementation
-
-```
-$ nvim add.c
-```
-
-```c
-int add(int x, int y) {
- return x + y;
-}
-```
-
-## Unoptimized Analysis
-
-```
-$ rm -f (path filter *.o); clang -O0 -c add.c; llvm-objdump -d --x86-asm-syntax=att add.o
-```
-
-```
-add.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 55 pushq %rbp
- 1: 48 89 e5 movq %rsp, %rbp
- 4: 89 7d fc movl %edi, -0x4(%rbp)
- 7: 89 75 f8 movl %esi, -0x8(%rbp)
- a: 8b 45 fc movl -0x4(%rbp), %eax
- d: 03 45 f8 addl -0x8(%rbp), %eax
- 10: 5d popq %rbp
- 11: c3 retq
-```
-
-In C, the expression `a = b + c` allows for three distinct variables to execute the addition.
-However, the x86-64 ISA does not support a three-operand format for standard addition.
-The format for the `add` instruction is `add source, destination`, which executes the operation
-`destination = destination + source`.
-
-Because the hardware logic requires the destination register to overlap with one of the source operands,
-the compiler cannot translate `a = b + c` directly to a single `add` instruction. To prevent overwriting the original
-value of `b` or `c` before the operation is executed, the compiler needs to use `mov` instruction to
-initialize the destination with one of the operands first:
-
-```
-movl -0x4(%rbp), %eax
-addl -0x8(%rbp), %eax
-```
-
-Hence, the compiler needs to use two instructions to execute the addition at the -O0 level.
-
-## Optimized Analysis
-```
-rm -f (path filter *.o); clang -O2 -c add.c; llvm-objdump -d --x86-asm-syntax=att add.o
-```
-
-```
-add.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 8d 04 37 leal (%rdi,%rsi), %eax
- 3: c3 retq
-```
-
-At the `-O2` level, the compiler translates the `C` statement `return x + y;` directly into a single `lea` instruction.
-Because lea supports two source registers, the compiler can take two independent inputs (`%rdi` and `%rsi`) and
-store the result in an independent destination (`%eax`) without overwriting the original operands.
-This allows the `a = b + c` logic to be executed in one step,
-eliminating the need for the extra mov instruction required at the `-O0` level.
-
-## Proof of Concept
-The following assembly code demonstrates these two approaches:
-one utilizing the `mov` + `add` instruction sequence,
-and the other employing a single `lea` instruction.
-
-```
-$ nvim add.s
-```
-
-```
-.section .note.GNU-stack, "", @progbits
-
-.section .rodata
- fmt: .string "Result: %d\n"
-
-.section .text
- .globl main
- .extern printf
-
-main:
- pushq %rbp
- movq %rsp, %rbp
-
- # --- Case A: Using mov + add ---
- movl $1, %edx
- movl $2, %ecx
- movl %edx, %eax
- addl %ecx, %eax
-
- # Print Result
- movq fmt@GOTPCREL(%rip), %rdi
- movslq %eax, %rsi
- movl $0, %eax
- call printf
-
- # --- Case B: Using lea ---
- movl $1, %edx
- movl $2, %ecx
- leal (%edx, %ecx), %eax
-
- # Print Result
- movq fmt@GOTPCREL(%rip), %rdi
- movslq %eax, %rsi
- movl $0, %eax
- call printf
-
- movl $0, %eax
- popq %rbp
- retq
-```
-
-```
-$ rm -f (path filter *.out); clang -o add.out add.s; ./add.out
-Result: 3
-Result: 3
-```
-
-As demonstrated, both approaches produce identical results, confirming that the single `lea` instruction is
-logically equivalent to the `a = b + c` mathematical operation.
-
-## YouTube Comment Insights
-
-Since YouTube does not currently support generating direct permanent links to individual comments,
-I have reproduced the relevant technical insight below in its entirety to ensure both accuracy and proper attribution.
-
-```
-@sulix314
-LEA doesn't affect flags. While this is sometimes annoying (when you need to carry with ADC),
-it is often extremely useful because you can perform arithmetic without destroying the flag state
-needed for a subsequent conditional jump or another calculation.
-
-@incubus3827
-In addition, LEA could run on the V-pipeline in the original Pentium, which often allowed performing some arithmetics + reshuffling registers
-for no additional cycles. A true gamechanger for software rasterizers.
-
-@mytech6779
-I recall the LEA instruction also uses a dedicated module on the CPU with an independent execution pipeline,
-so the LEA operation can be concurrent with an ALU operation.
-I can't say the address module addition [in isolation] is faster or the same cycle count as the ALU,
-but being specialized I imagine the address module is somewhat simpler with fewer transistors
-(reducing area and heat some small amount).
-```
diff --git a/_posts/2026-01-31-Advent-of-Compiler-Optimisations-Study-Notes-03.md b/_posts/2026-01-31-Advent-of-Compiler-Optimisations-Study-Notes-03.md
deleted file mode 100644
index e471a91..0000000
--- a/_posts/2026-01-31-Advent-of-Compiler-Optimisations-Study-Notes-03.md
+++ /dev/null
@@ -1,277 +0,0 @@
----
-layout: default
-title: "Study Notes: You can't fool the optimiser, Advent of Compiler Optimisations 2025"
-date: 2026-01-31
-tag: compiler
----
-
-## Study Notes: You can't fool the optimiser, Advent of Compiler Optimisations 2025
-
-These notes are based on the post [**You can't fool the optimiser**](https://xania.org/202512/03-more-adding-integers) and the YouTube video [**[AoCO 3/25] More Adding**](https://www.youtube.com/watch?v=wHg9lYPMvvE&list=PL2HVqYf7If8cY4wLk7JUQ2f0JXY_xMQm2&index=4) which are Day 3 of the [Advent of Compiler Optimisations 2025](https://xania.org/AoCO2025-archive) Series by [Matt Godbolt](https://xania.org/MattGodbolt).
-
-My notes focus on reproducing and verifying [Matt Godbolt](https://xania.org/MattGodbolt)'s teaching within a local development environment using `LLVM` toolchain on `Ubuntu`.
-
-Written by me and assisted by AI, proofread by me and assisted by AI.
-
-## Development Environment
-```
-$ lsb_release -d
-Description: Ubuntu 24.04.3 LTS
-
-$ clang -v
-Ubuntu clang version 18.1.8
-
-$ sudo apt install gcc-aarch64-linux-gnu libc6-dev-arm64-cross
-
-$ aarch64-linux-gnu-gcc -v
-COLLECT_GCC=aarch64-linux-gnu-gcc
-gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04)
-
-$ qemu-aarch64 -version
-qemu-aarch64 version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.11)
-
-$ llvm-objdump -v
-Ubuntu LLVM version 18.1.8
-
-$ nvim --version
-NVIM v0.11.5
-
-$ echo $SHELL
-/usr/bin/fish
-```
-
-## Recursion Integer Addition
-
-We can observe the compiler's optimization by implementing addition through recursion, as shown in the following code:
-
-```
-$ nvim add.c
-```
-
-```c
-#include
-
-unsigned add(unsigned x, unsigned y) {
- return y <= 0 ? x : add(x + 1, y - 1);
-}
-
-int main(void) {
- unsigned a = 1;
- unsigned b = 10;
- unsigned r = add(a, b);
- printf("%u = %u\n", r, a + b);
- return 0;
-}
-```
-
-## Unoptimized Analysis
-
-The following analysis examines the unoptimized assembly code generated with the `-O0` flag.
-
-```
-$ rm -f (path filter *.out); clang -O0 -target aarch64-linux-gnu --sysroot=/usr/aarch64-linux-gnu -static add.c -o app.out; qemu-aarch64 ./app.out
-11 = 11
-```
-
-```
-$ llvm-objdump -d --disassemble-symbols=add app.out
-
-app.out: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-00000000004007f0 :
- 4007f0: d10083ff sub sp, sp, #0x20 // Allocate 32 bytes on stack
- 4007f4: a9017bfd stp x29, x30, [sp, #0x10] // Save Frame Pointer (x29) and Link Register (x30)
- 4007f8: 910043fd add x29, sp, #0x10 // Set up new Frame Pointer
- 4007fc: b81fc3a0 stur w0, [x29, #-0x4] // Store 'x' (w0) into stack
- 400800: b9000be1 str w1, [sp, #0x8] // Store 'y' (w1) into stack
- 400804: b9400be8 ldr w8, [sp, #0x8] // Load 'y' from stack into w8
- 400808: 71000108 subs w8, w8, #0x0 // Compare w8 (y) with 0
- 40080c: 540000a8 b.hi 0x400820 // If y > 0, jump to recursive case (400820)
- 400810: 14000001 b 0x400814 // Else, branch to base case logic
- 400814: b85fc3a0 ldur w0, [x29, #-0x4] // [Base Case] Load 'x' into w0
- 400818: b90007e0 str w0, [sp, #0x4] // Store 'x' as the potential return value
- 40081c: 14000008 b 0x40083c // Jump to epilogue (return)
- 400820: b85fc3a8 ldur w8, [x29, #-0x4] // [Recursive Case] Load 'x' into w8
- 400824: 11000500 add w0, w8, #0x1 // w0 = x + 1 (Preparing 1st argument)
- 400828: b9400be8 ldr w8, [sp, #0x8] // Load 'y' into w8
- 40082c: 71000501 subs w1, w8, #0x1 // w1 = y - 1 (Preparing 2nd argument)
- 400830: 97fffff0 bl 0x4007f0 // Recursive call: add(x + 1, y - 1)
- 400834: b90007e0 str w0, [sp, #0x4] // Store the recursive result onto stack
- 400838: 14000001 b 0x40083c // Jump to epilogue (return)
- 40083c: b94007e0 ldr w0, [sp, #0x4] // Load the result from stack into w0
- 400840: a9417bfd ldp x29, x30, [sp, #0x10] // Restore Frame Pointer and Link Register
- 400844: 910083ff add sp, sp, #0x20 // Deallocate stack space
- 400848: d65f03c0 ret // Return to caller
-```
-
-#### Part 01: Function Prologue
-```
-4007f0: d10083ff sub sp, sp, #0x20 // Allocate 32 bytes on stack
-4007f4: a9017bfd stp x29, x30, [sp, #0x10] // Save Frame Pointer (x29) and Link Register (x30)
-4007f8: 910043fd add x29, sp, #0x10 // Set up new Frame Pointer
-```
-
-Each recursive invocation initiates a Function Prologue to establish the execution context.
-The instruction `sub sp, sp, #0x20` performs Stack Allocation by decrementing the Stack Pointer (`SP`), reserving 32 bytes for the current Stack Frame.
-The subsequent `stp` (Store Pair) instruction implements Context Saving, pushing the Frame Pointer (`X29`) and Link Register (`X30`) onto the stack to
-facilitate the Stack Unwinding process during the Function Epilogue.
-
-```
-| Higher Address |
-| |
-+----------------+ <--- Previous SP
-| Unused / Local | (16 bytes)
-+----------------+
-| Link Register | (X30)
-+----------------+ <--- X29 (New Frame Pointer)
-| Frame Pointer | (X29)
-+----------------+ <--- SP (Current Stack Pointer)
-| |
-| Lower Address |
-```
-
-#### Part 02: Parameter Storage
-```
-4007fc: b81fc3a0 stur w0, [x29, #-0x4] // Store 'x' (w0) into stack
-400800: b9000be1 str w1, [sp, #0x8] // Store 'y' (w1) into stack
-400804: b9400be8 ldr w8, [sp, #0x8] // Load 'y' from stack into w8
-```
-
-The input parameters `x` and `y` are stored from registers (`w0` and `w1`) into stack memory.
-Since it is at the `-O0` optimization level,
-an additional instruction is used to load `y` from stack memory back into a register (`w8`) for subsequent conditional evaluation.
-
-#### Part 03: Branching
-```
-400808: 71000108 subs w8, w8, #0x0 // Compare w8 (y) with 0
-40080c: 540000a8 b.hi 0x400820 // If y > 0, jump to recursive case (400820)
-400810: 14000001 b 0x400814 // Else, branch to base case logic
-```
-
-The subs instruction performs an arithmetic subtraction to compare `y` (in `w8`) with `0`,
-updating the Condition Flags in the processor's state register.
-The `b.hi` (Branch if Higher) instruction then evaluates these flags:
-if `y > 0`, the Program Counter (`PC`) jumps to the Recursive Case;
-otherwise, it jumps to the Base Case.
-
-#### Part 04: The Base Case: `y == 0`
-```
-400814: b85fc3a0 ldur w0, [x29, #-0x4] // [Base Case] Load 'x' into w0
-400818: b90007e0 str w0, [sp, #0x4] // Store 'x' as the potential return value
-40081c: 14000008 b 0x40083c // Jump to epilogue (return) (Part 06)
-```
-
-When the base case is met, the value of `x` is loaded into register `W0`.
-The compiler then executes a `store` operation from register `W0` to stack memory to preserve the
-return value.
-
-#### Part 05: The Recursive Step: `add(x + 1, y - 1)`
-```
-400820: b85fc3a8 ldur w8, [x29, #-0x4] // [Recursive Case] Load 'x' into w8
-400824: 11000500 add w0, w8, #0x1 // w0 = x + 1 (Preparing 1st argument)
-400828: b9400be8 ldr w8, [sp, #0x8] // Load 'y' into w8
-40082c: 71000501 subs w1, w8, #0x1 // w1 = y - 1 (Preparing 2nd argument)
-400830: 97fffff0 bl 0x4007f0 // Recursive call: add(x + 1, y - 1)
-400834: b90007e0 str w0, [sp, #0x4] // Store the recursive result onto stack
-400838: 14000001 b 0x40083c // Jump to epilogue (return)
-```
-
-The compiler prepares the arguments for the recursive call by loading values from the stack into registers `w0` (`x + 1`) and `w1` (`y - 1`) according to the Procedure Call Standard.
-The `bl` (Branch with Link) instruction then executes the recursive call, redirecting the Control Flow back to the function start.
-Once the recursive call returns, the resulting value in `w0` is stored into stack memory before jumping to the epilogue.
-
-#### Part 06: Function Epilogue
-```
-40083c: b94007e0 ldr w0, [sp, #0x4] // Load the result from stack into w0
-400840: a9417bfd ldp x29, x30, [sp, #0x10] // Restore Frame Pointer and Link Register
-400844: 910083ff add sp, sp, #0x20 // Deallocate stack space
-400848: d65f03c0 ret // Return to caller
-```
-
-The function epilogue restores the caller's execution environment.
-The return value is loaded from stack memory into register `w0`.
-The `ldp` instruction performs a pair load to restore the frame pointer (`x29`) and link register (`x30`).
-Finally, the stack pointer (`sp`) is incremented by 32 bytes to perform stack deallocation before the ret instruction
-redirects the Control Flow back to the address stored in the link register.
-
-## Optimized Analysis
-
-The following analysis examines the optimized assembly code generated with the `-O2` flag.
-
-```
-$ rm -f (path filter *.out); clang -O2 -target aarch64-linux-gnu --sysroot=/usr/aarch64-linux-gnu -static add.c -o app.out; qemu-aarch64 ./app.out
-11 = 11
-```
-
-```
-$ llvm-objdump -d --disassemble-symbols=add app.out
-
-app.out: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-00000000004007f0 :
- 4007f0: 0b000020 add w0, w1, w0
- 4007f4: d65f03c0 ret
-```
-
-#### Recursion Call
-
-In the unoptimized execution, each recursive call of `add(x + 1, y - 1)` triggers the function prologue,
-resulting in the allocation of a new activation record.
-This manifests as `O(n)` space complexity, as the stack grows linearly with the input value of `y`.
-
-```
-| Higher Address |
-+--------------------+
-| add(1, 10) Frame | (Initial Call: a = 1, b = 10)
-+--------------------+
-| add(2, 9) Frame |
-+--------------------+
-| add(3, 8) Frame |
-+--------------------+
-| add(4, 7) Frame |
-+--------------------+
-| add(5, 6) Frame |
-+--------------------+
-| add(6, 5) Frame |
-+--------------------+
-| add(7, 4) Frame |
-+--------------------+
-| add(8, 3) Frame |
-+--------------------+
-| add(9, 2) Frame |
-+--------------------+
-| add(10, 1) Frame |
-+--------------------+
-| add(11, 0) Frame | (Base Case: x = 11, returns x)
-+--------------------+ <--- SP (Current Stack Pointer)
-| Lower Address |
-```
-
-#### Tail Recursion Call
-
-The `-O2` optimization level identifies the recursive call as a Tail Call.
-The compiler recognizes that the current stack frame can be reused,
-as no further operations are required after the callee returns.
-This reduces the space complexity from `O(n)` to `O(1)` and eliminates the overhead associated
-with stack frame allocation and deallocation.
-
-```
-| Higher Address | | Higher Address | | Higher Address |
-+--------------------+ +-------------------+ +-------------------+ <--- Previous SP
-| add(1, 10) Frame | -> | add(2, 9) Frame | -> ... -> | add(11, 0) Frame | (Reused for all steps)
-+--------------------+ +-------------------+ +-------------------+ <--- SP (Static: Never moves)
-| Lower Address | | Lower Address | | Lower Address |
-```
-
-#### Arithmetic Folding
-While Tail Call Optimization handles the stack efficiency, Arithmetic Folding is an optimization technique
-where the compiler analyzes the symbolic behavior of a loop or recursion to replace it with a simplified mathematical expression.
-
-#### Conclusion
-Through Tail Call Optimization and Arithmetic Folding,
-the compiler optimizes the recursive logic by eliminating the stack-related and control-flow instructions (totaling 21 instructions) into a single `add` instruction.
-It effectively reduces the space complexity from `O(n)` to `O(1)` and minimizes the execution latency to a single instruction cycle.
\ No newline at end of file
diff --git a/_posts/2026-02-27-Advent-of-Compiler-Optimisations-Study-Notes-04.md b/_posts/2026-02-27-Advent-of-Compiler-Optimisations-Study-Notes-04.md
deleted file mode 100644
index 6722948..0000000
--- a/_posts/2026-02-27-Advent-of-Compiler-Optimisations-Study-Notes-04.md
+++ /dev/null
@@ -1,406 +0,0 @@
----
-layout: default
-title: "Study Notes: Multiplying with a constant, Advent of Compiler Optimisations 2025"
-date: 2026-02-27
-tag: compiler
----
-
-## Study Notes: Multiplying with a constant, Advent of Compiler Optimisations 2025
-
-These notes are based on the post [**Multiplying with a constant**](https://xania.org/202512/04-multiplying-integers) and the YouTube video [**[AoCO 4/25] Multiplying with a Constant**](https://www.youtube.com/watch?v=1X88od0miHs&list=PL2HVqYf7If8cY4wLk7JUQ2f0JXY_xMQm2&index=5) which are Day 4 of the [Advent of Compiler Optimisations 2025](https://xania.org/AoCO2025-archive) Series by [Matt Godbolt](https://xania.org/MattGodbolt).
-
-My notes focus on reproducing and verifying [Matt Godbolt](https://xania.org/MattGodbolt)'s teaching within a local development environment using `LLVM` toolchain on `Ubuntu`.
-
-Selected technical insights from the YouTube comment section are reproduced at the end of these notes to provide additional context.
-
-Written by me and assisted by AI, proofread by me and assisted by AI.
-
-#### Development Environment
-```
-$ lsb_release -d
-Description: Ubuntu 24.04.3 LTS
-
-$ clang -v
-Ubuntu clang version 18.1.8
-
-$ llvm-objdump -v
-Ubuntu LLVM version 18.1.8
-
-$ nvim --version
-NVIM v0.11.5
-
-$ echo $SHELL
-/usr/bin/fish
-```
-
-## Introduction
-
-After studying the Day 04 YouTube video and blog post, I conducted a series of sequential tests by multiplying `x` by every constant from `2` to `20`.
-
-By analyzing the assembly output for each case, I identified and selected 10 distinct compiler optimization strategies.
-
-These notes document specific patterns and filter out redundant results, highlighting unique compiler optimization strategies.
-
-## Case 01 : `x * 2`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 2;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 8d 04 3f leal (%rdi,%rdi), %eax
- 3: c3 retq
-```
-
-The compiler avoids the `imul` instruction in favor of the `shift`, `add`, and `lea` instructions for the following reasons:
-
-- Constant multiplication can often be expressed using free address generation
-- `lea` can compute `x + x * scale` without using ALU ports
-- It may reduce dependency chains
-
-Here, it uses the leal instruction to perform `x + x` in a single cycle.
-
-## Case 02: `x * 3`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 3;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 8d 04 7f leal (%rdi,%rdi,2), %eax
- 3: c3 retq
-```
-
-It utilizes x86 the `lea` with **Base + (Index * Scale)** addressing to calculate `x + x * 2`
-
-## Case 03: `x * 4`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 4;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 8d 04 bd 00 00 00 00 leal (,%rdi,4), %eax
- 7: c3 retq
-```
-
-Using the `lea` instruction with a scale factor enables multiplication to be performed in a single instruction,
-eliminating the need for separate shift and multiply instructions.
-
-## Case 04 : `x * 6`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 6;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 01 ff addl %edi, %edi
- 2: 8d 04 7f leal (%rdi,%rdi,2), %eax
- 5: c3 retq
-```
-
-The compiler splits the multiplication `x * 6` into two distinct steps: first `x + x`, followed by `2x + (2x * 2)`.
-
-You might wonder why the compiler doesn't simply use a single instruction like `leal (%rdi,%rdi,6), %eax`.
-
-The reason lies in the instruction encoding.
-
-The `leal` instruction calculates addresses using the formula **Base + (Index * Scale)**, where the scale factor is encoded at the bit level.
-
-If we assume the scale field uses **2 bits** within the instruction encoding, there are only four possible binary combinations: `00`, `01`, `10`, and `11`.
-
-These bits correspond to the multipliers **1, 2, 4, and 8**. Because of this limitation, it is not possible for the hardware to represent a scale of `6`.
-
-Consequently, the compiler must break the operation into multiple valid steps to achieve the desired result.
-
-## Case 05 : `x * 7`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 7;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 8d 04 fd 00 00 00 00 leal (,%rdi,8), %eax
- 7: 29 f8 subl %edi, %eax
- 9: c3 retq
-```
-
-The compiler uses **multiply and subtract** logic: It first scales `x` by 8 using leal and then subtracts the original `x`.
-
-## Case 06 : `x * 11`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 11;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 8d 04 bf leal (%rdi,%rdi,4), %eax
- 3: 8d 04 47 leal (%rdi,%rax,2), %eax
- 6: c3 retq
-```
-
-The compiler splits the multiplication `x * 11` into two distinct steps:
-first `x + x * 4`, followed by `x + (5x * 2)`.
-
-## Case 07 : `x * 12`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 12;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: c1 e7 02 shll $0x2, %edi
- 3: 8d 04 7f leal (%rdi,%rdi,2), %eax
- 6: c3 retq
-```
-
-The compiler splits the multiplication `x * 12` into two distinct steps:
-first `x << 2`, followed by `4x + (4x * 2)`.
-
-## Case 08: `x * 14`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 14;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 89 f8 movl %edi, %eax
- 2: 8d 0c 00 leal (%rax,%rax), %ecx
- 5: c1 e0 04 shll $0x4, %eax
- 8: 29 c8 subl %ecx, %eax
- a: c3 retq
-```
-
-The compiler splits the multiplication `x * 14` into three distinct steps:
-1. calculates 2x and store it in ecx (`ecx = x + x`)
-2. calculates 16x and store it in eax (`eax = 16 * x`)
-3. calculates 14x by subtracting the two results (`eax - ecx = 16x - 2x = 14x`)
-
-## Case 09: `x * 16`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 16;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 89 f8 movl %edi, %eax
- 2: c1 e0 04 shll $0x4, %eax
- 5: c3 retq
-```
-
-According the x86-64 calling convention, the result must be returned in %eax.
-The compiler cannot simply generate a single `shll $0x4, %edi` instruction.
-It need to generate an extra instruction to move the input value from `%edi` to `%eax` before the shift operation.
-
-## Case 10: `x * 17`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 17;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c mul.c; llvm-objdump -d --x86-asm-syntax=att mul.o
-```
-
-```
-mul.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 89 f8 movl %edi, %eax
- 2: c1 e0 04 shll $0x4, %eax
- 5: 01 f8 addl %edi, %eax
- 7: c3 retq
-```
-
-Similar to case 09, we first need to move the input value from `%edi` to `%eax` to satisfy the calling convention.
-Then we get `16 * x`. Finally, we get `x + 16x`.
-
-## YouTube Comment Insights
-
-Since YouTube does not currently support generating direct permanent links to individual comments,
-I have reproduced the relevant technical insight below in its entirety to ensure both accuracy and proper attribution.
-
-```
-@moregirl4585
-Fact: on some architecture x*-3 is better expressed as x-(x<<2) and some better as -(x+x+x). Seems compilers don't work well for both case
-
-@SLiV9
-Do you know why for multiplying by 6, it uses an ADD for the second x2? Why not another LEA like for multiplying by 2?
-|
-|--> @nurmr
-| My suspicion is that address adder is "cheaper" to use than an ALU.
-| Especially with more complex code which might have other operations pipelined and running on an ALU.
-|
-|--> @HenryLoenwind
- lea is faster than mov+add, but not faster than a "naked" add.
- And even if the cpu cycles are the same in the end,
- add reg,reg is a 2-byte instruction (like the xor we had on day 1).
-
-@lpprogrammingllc
-It's worth noting the shifts-and-adds version might still be faster on modern CPUs due to instruction pipelining.
-Yes, the total work done is more than a single imul, but it can do each part in parallel, until the final add.
-However, it also requires more code, and more "slots" in the decoding/execution pipeline.
-Lots of modern machines have a 4-wide instruction frontend.
-So with the imul, one of them handles the imul, and 3 keep going on any other calculations they can.
-With the shifts-and-adds version, 3 get held up waiting on the shifts, to then issue the adds.
-Only one gets to work on anything else.
-The compiler assumes there will usually be other work to do,
-so aims for maximum throughput rather than prioritizing finishing the mult as soon as possible.
-
-@lpprogrammingllc
-The CPU execution backend may well execute shifts and adds. However between your code in memory and that backend is the instruction decoder,
-which uses the microcode to turn your single imul into whatever real micro instructions are required for the execution backend.
-
-If I understand the implicit part of your comment correctly,
-you think there is no value in giving the instruction decoder the split-apart shift-and-add instructions because what the backend executes may be the same in either case.
-This is incorrect. The cyclic latency (the number of cycles from beginning decode to commit) in the imul instruction is the number of cycles required for the instruction decoder
-to issue microcode to the backend and for the backend to execute that microcode. Often the limiting factor is the frontend decode speed.
-If you can decrease the number of cycles spent by the frontend doing the decode, you can decrease the total cycles required,
-at the expense of more power use or less other work happening at the same time.
-```
-
-## References
-[1] https://cs61.seas.harvard.edu/site/2018/Asm1/
\ No newline at end of file
diff --git a/_posts/2026-02-28-Advent-of-Compiler-Optimisations-Study-Notes-05.md b/_posts/2026-02-28-Advent-of-Compiler-Optimisations-Study-Notes-05.md
deleted file mode 100644
index 15d8233..0000000
--- a/_posts/2026-02-28-Advent-of-Compiler-Optimisations-Study-Notes-05.md
+++ /dev/null
@@ -1,299 +0,0 @@
----
-layout: default
-title: "Study Notes: ARM's barrel shifter tricks, Advent of Compiler Optimisations 2025"
-date: 2026-02-28
-tag: compiler
----
-
-## Study Notes: ARM's barrel shifter tricks, Advent of Compiler Optimisations 2025
-
-These notes are based on the post [**ARM's barrel shifter tricks**](https://xania.org/202512/05-barrel-shifting-with-arm) and the YouTube video [**[AoCO 5/25] Multiplying with a Constant**](https://www.youtube.com/watch?v=TZubUyr2UEY&list=PL2HVqYf7If8cY4wLk7JUQ2f0JXY_xMQm2&index=6) which are Day 5 of the [Advent of Compiler Optimisations 2025](https://xania.org/AoCO2025-archive) Series by [Matt Godbolt](https://xania.org/MattGodbolt).
-
-My notes focus on reproducing and verifying [Matt Godbolt](https://xania.org/MattGodbolt)'s teaching within a local development environment using `LLVM` toolchain on `Ubuntu`.
-
-Selected technical insights from the YouTube comment section are reproduced at the end of these notes to provide additional context.
-
-Written by me and assisted by AI, proofread by me and assisted by AI.
-
-#### Development Environment
-```
-$ lsb_release -d
-Description: Ubuntu 24.04.3 LTS
-
-$ clang -v
-Ubuntu clang version 18.1.8
-
-$ llvm-objdump -v
-Ubuntu LLVM version 18.1.8
-
-$ nvim --version
-NVIM v0.11.5
-
-$ echo $SHELL
-/usr/bin/fish
-```
-
-## Introduction
-
-Following the Day 05 technical materials, I performed sequential tests for constant
-
-multiplication ranging from x multiplied by two to x multiplied by twenty on the AArch64 target.
-
-After evaluating the assembly output,
-
-I identified six distinct compiler optimization strategies that I would like to share with you.
-
-## Case 01 : `x * 2`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 2;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c mul.c; llvm-objdump -d mul.o
-```
-
-```
-mul.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 531f7800 lsl w0, w0, #1
- 4: d65f03c0 ret
-```
-
-ARM Instruction: `lsl , , #`
-
-The compiler utilizes a Logical Shift Left (`lsl`) to perform multiplication by powers of two.
-Here, w0 is the destination (`Rd`), the original `w0` is the source (`Rn`), and `#1` is the immediate shift value.
-Shifting a register left by 1 bit is equivalent to multiplying by 2.
-
-## Case 02: `x * 3`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 3;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c mul.c; llvm-objdump -d mul.o
-```
-
-```
-mul.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 0b000400 add w0, w0, w0, lsl #1
- 4: d65f03c0 ret
-```
-
-ARM Instruction: `add , , , lsl #`
-
-AArch64 supports shifted-register operands within arithmetic instructions.
-This add instruction performs a left shift of 1 bit on the second source register (`Rm`) before addition.
-The operation represents the formula `w0 = w0 + (w0 << 1)`, which computes `x = x + x * 2`.
-
-## Case 03 : `x * 6`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 6;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c mul.c; llvm-objdump -d mul.o
-```
-
-```
-mul.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 0b000408 add w8, w0, w0, lsl #1
- 4: 531f7900 lsl w0, w8, #1
- 8: d65f03c0 ret
-```
-
-ARM Instructions:
-- `add , , , lsl #`
-- `lsl , , #`
-
-The multiplication of 6x is decomposed into two discrete stages.
-First, the compiler calculates `w8 = w0 + (w0 << 1) = w0 + 2 * w0 = 3 * w0`.
-Second, it calculates `w0 = (w8 << 1) = 2 * w8 = 2 * (3 * w0) = 6 * w0`
-
-## Case 04 : `x * 7`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 7;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c mul.c; llvm-objdump -d mul.o
-```
-
-```
-mul.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 531d7008 lsl w8, w0, #3
- 4: 4b000100 sub w0, w8, w0
- 8: d65f03c0 ret
-```
-
-ARM Instructions:
-- `lsl , , #`
-- `sub , , `
-
-The compiler implements a shift-and-subtract strategy for constants near powers of two.
-To compute `7x`, it first executes `w8 = w0 << 3 = 8 * w0`
-It then performs `w0 = w8 - w0 = 8 * w0 - w0 = 7 * w0`.
-
-## Case 05 : `x * 11`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 11;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c mul.c; llvm-objdump -d mul.o
-```
-
-```
-mul.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 52800168 mov w8, #0xb // =11
- 4: 1b087c00 mul w0, w0, w8
- 8: d65f03c0 ret
-```
-
-ARM Instructions:
-- `mov , `
-- `mul , , `
-
-The compiler defaults to the `mul` instruction because decomposing the constant `11` cannot be achieved in only two instructions.
-
-If the compiler were to adopt a manual shift-and-subtract strategy,
-the code generator would need to output three instructions:
-```
-add w8, w0, w0, lsl 1 // w8 = x + 2x = 3x
-lsl w8, w8, #2 // w8 = w8 << 2 = 3x << 2 = 3x * 4 = 12x
-sub w0, w8, w0 // w0 = 12x - x = 11x
-```
-Obviously, this requires 3 instructions. By using mov followed by mul,
-the compiler achieves the same result in only 2 instructions.
-
-## Case 06 : `x * 14`
-
-```
-$ nvim mul.c
-```
-
-```
-int mul(int x) {
- return x * 14;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c mul.c; llvm-objdump -d mul.o
-```
-
-```
-mul.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 531c6c08 lsl w8, w0, #4
- 4: 4b000500 sub w0, w8, w0, lsl #1
- 8: d65f03c0 ret
-```
-
-ARM Instructions:
-- `lsl , , #`
-- `sub , , , lsl #`
-
-The computation of 14x demonstrates the flexibility of the sub instruction with shifted operands.
-The compiler first calculates `w8 = w0 << 4 = 16 * w0`.
-Subsequently, it performs `w0 = w8 - (w0 << 1) = w8 - w0 * 2 = 16 * w0 - 2 * w0 = 14 * w0`.
-
-## YouTube Comment Insights
-
-Since YouTube does not currently support generating direct permanent links to individual comments,
-I have reproduced the relevant technical insight below in its entirety to ensure both accuracy and proper attribution.
-
-```
-@kruador
-@ciberman Yes, it means 'ARMv8'. That's not quite right because ARM Ltd enhanced the 32-bit instruction set (which they now call A32)
-as well as adding the 64-bit instruction set (A64) in version 8.
-
-They also refer to 'AArch32' and 'AArch64' for extra confusion. I think 'AArch32' means 'the architectural state of a 32-bit ARM processor'
-because you can use the alternative "Thumb" instruction set (which ARM Ltd renamed to T32 with ARMv8, in their documentation at least) instead of A32.
-The embedded ARM Cortex-M only support T32, not A32.
-
-There is no equivalent of Thumb for AArch64 (no 'T64'), at least not as of yet (probably not ever), so 'AArch64' and 'A64' are virtually interchangeable.
-And most people just say 'arm64' because 'AArch64' is unpronounceable while 'A64' is too ambiguous.
-
-@tlhIngan
-ARMv8 was designed to be more streamlined for modern superscalar architectures so it jettisoned a lot of ARM stuff that was responsible
-for causing pipeline stalls and dependencies in favor of simpler instructions that can run faster.
-When AArch64 was being introduced I remember seeing the ARM presentations on why the instruction set dumped a lot of it.
-It's why an ARMv8 core only beats an ARMv7 core by about 10% in AArch32 mode but running the same code in AArch64 mode you can achieve a 50+% speedup.
-Losing RSB for a two instruction LSB/SUB combination was deemed far superior in simplifying ALU operations.
-
-@kruador
-I think RSB was only really useful for this kind of operation. If you're not doing a shift on one of the operands, you can just swap which register is which.
-But the 32-bit ARM architecture only supports the shift on operand 2,
-so you have to have an instruction that does say Rdest := operand2 - Rn instead of Rdest := Rm - operand2.
-
-ARM1 didn't even have a multiply instruction. Adds, shifts and subtracts were the only options out there.
-No room for a multiplier in only 25,000 transistors! So RSB was really helpful there. However, these days there an abundance of transistors available:
-even the lowly ARM Cortex-M0 (a 32-bit ARMv6 architecture core that only supports the Thumb instruction set, and not all of that) can be configured with a single-cycle multiplier.
-
-The main issue wasn't simplifying the ALU operations, I don't think, but simply releasing bits to be able to encode more different operations and more registers.
-AArch64 needs three bits more per instruction for register mapping - one for the destination register and one for each source - because it has twice as many registers as AArch32 (32 vs 16).
-```
-
-## References
-1. https://developer.arm.com/documentation/dui0473/m/overview-of-the-arm-architecture/access-to-the-inline-barrel-shifter
-2. https://www.davespace.co.uk/arm/introduction-to-arm/barrel-shifter.html
-3. https://www.d.umn.edu/~gshute/logic/barrel-shifter.html
-4. https://community.element14.com/technologies/fpga-group/b/blog/posts/systemverilog-study-notes-barrel-shifter-rtl-combinational-circuit
diff --git a/_posts/2026-02-28-Advent-of-Compiler-Optimisations-Study-Notes-06.md b/_posts/2026-02-28-Advent-of-Compiler-Optimisations-Study-Notes-06.md
deleted file mode 100644
index a8fa1aa..0000000
--- a/_posts/2026-02-28-Advent-of-Compiler-Optimisations-Study-Notes-06.md
+++ /dev/null
@@ -1,254 +0,0 @@
----
-layout: default
-title: "Study Notes: Division, Advent of Compiler Optimisations 2025"
-date: 2026-02-28
-tag: compiler
----
-
-## Study Notes: Division, Advent of Compiler Optimisations 2025
-
-These notes are based on the post [**Division**](https://xania.org/202512/06-dividing-to-conquer) and the YouTube video [**[AoCO 6/25] Integer Division**](https://www.youtube.com/watch?v=7Rtk0qOX9zs&list=PL2HVqYf7If8cY4wLk7JUQ2f0JXY_xMQm2&index=7) which are Day 6 of the [Advent of Compiler Optimisations 2025](https://xania.org/AoCO2025-archive) Series by [Matt Godbolt](https://xania.org/MattGodbolt).
-
-My notes focus on reproducing and verifying [Matt Godbolt](https://xania.org/MattGodbolt)'s teaching within a local development environment using `LLVM` toolchain on `Ubuntu`.
-
-Written by me and assisted by AI, proofread by me and assisted by AI.
-
-#### Development Environment
-```
-$ lsb_release -d
-Description: Ubuntu 24.04.3 LTS
-
-$ clang -v
-Ubuntu clang version 18.1.8
-
-$ llvm-objdump -v
-Ubuntu LLVM version 18.1.8
-
-$ nvim --version
-NVIM v0.11.5
-
-$ echo $SHELL
-/usr/bin/fish
-```
-
-## x86 Signed Integer Division
-
-```
-$ nvim div.c
-```
-
-```
-int div(int x) {
- return x / 512;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c div.c; llvm-objdump -d --x86-asm-syntax=att div.o
-```
-
-```
-div.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 8d 87 ff 01 00 00 leal 0x1ff(%rdi), %eax
- 6: 85 ff testl %edi, %edi
- 8: 0f 49 c7 cmovnsl %edi, %eax
- b: c1 f8 09 sarl $0x9, %eax
- e: c3 retq
-```
-
-Instructions:
-```
-- leal
(), ; = offset + base
-- cmovnsl , ; cmov = conditional move
- ; ns = Not Signed
- ; cmovns = Conditional Move if Not Sign
-- sarl , ; sar = Shift Arithmetic Right
-```
-
-In C, signed integer division truncates toward zero. For example:
-```
-#include
-
-int main(void) {
- printf("%d %d\n", 1 / 512, -1 / 512);
- return 0;
-}
-```
-
-```
-$ clang -o app.out main.c
-$ ./app.out
-$ 0 0
-```
-
-But replacing division with an arithmetic right shift does not produce the same result for negative numbers.
-
-```
-#include
-
-int main(void) {
- printf("%d %d\n", 1 >> 9, -1 >> 9);
- return 0;
-}
-```
-
-```
-$ clang -o app.out main.c
-$ ./app.out
-$ 0 -1
-```
-
-To resolve this problem, the compiler adds `2^n - 1` to the negative number.
-In this case, n = 9, hence it is `2^9 - 1 = 512 - 1 = 511 = 0x1FF`
-
-Why `2^n - 1` ? Let's consider `n = 9`
-
-In binary, `2^9 - 1` creates the exactly 9 ones:
-
-```
- 2^9 | 1 0 0 0 0 0 0 0 0 0
-- 1 | 0 0 0 0 0 0 0 0 0 1
----------------------------
- 0 1 1 1 1 1 1 1 1 1
-```
-
-It can help us to flip the bit of `x`. For example, `x = -1`
-```
-Position | 32 (Sign Bit) 10 1
- | v v v
- Carry | 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
- -1 | 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 (0xFFFFFFFF)
- + 511 | 0 0 0 0 0 ... 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 (0x000001FF)
- ----- |-----------------------------------------------
- 510 | 0 0 0 0 0 ... 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 (0x000001FE)
-```
-
-Hence, the compiler does `(-1 + 511) / 512 = 510 / 512 = 510 >> 9 = 0`, we get the correct result.
-
-In summary, the compiler use the `cmovns` and `test` instructions to detect whether `x` is positive.
-If `x` is a positive number, shift it. Otherwise, use `2^n - 1` to create an `n` one mask.
-Then we can use the shift operator to achieve the same result as we use the division operator.
-
-## x86 Unsigned Integer Division
-```
-unsigned div(unsigned x) {
- return x / 512;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -c div.c; llvm-objdump -d --x86-asm-syntax=att div.o
-```
-
-```
-div.o: file format elf64-x86-64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 89 f8 movl %edi, %eax
- 2: c1 e8 09 shrl $0x9, %eax
- 5: c3 retq
-```
-
-Instruction:
-```
-shrl
, ; shr := Shift Right Logical, that is = >>
-```
-
-This case is easier than previous one. It only requires knowing what `shr` is.
-
-You may also want to know the difference between `shr` and `sar`.
-
-Here, I show an example to you.
-
-| Original Dec | Original Binary | Operation | Result Binary |
-| :----------- | :-------------- | :-------- | :------------ |
-| 3 | 0b0011 | `shrl $2` | 0b0000 |
-| 3 | 0b0011 | `sarl $2` | 0b0000 |
-| -3 | 0b1101 | `shrl $2` | 0b0011 |
-| -3 | 0b1101 | `sarl $2` | 0b1111 |
-
-## Arm Signed Division (AArch64)
-```
-$ nvim div.c
-```
-
-```
-int div(int x) {
- return x / 512;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c div.c; llvm-objdump -d div.o
-```
-
-```
-div.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 1107fc08 add w8, w0, #0x1ff
- 4: 7100001f cmp w0, #0x0
- 8: 1a80b108 csel w8, w8, w0, lt
- c: 13097d00 asr w0, w8, #9
- 10: d65f03c0 ret
-```
-
-The reason is the same as in the previous x86 case, we need to know why we need to use `0x1FF`.
-
-Instructions:
-```
-- add
, , #imm ; w8 = w0 + 0x1ff
-- cmp , #imm ; Compares w0 with #0x0, and update the processor flags NZCV
-- csel , , , ; Conditional Select.
- ; If the condition lt (Less Than) is true, it selects w8;
- ; otherwise, it selects w0.
-- asr , , #imm : Arithmetic Shift Right, w0 = w8 >> 9
-```
-
-| Flag | Name | Bit | Description (when set to 1) |
-| :--- | :--- | :---| :--- |
-| **N** | Negative | 31 | The result of the operation was negative (MSB = 1). |
-| **Z** | Zero | 30 | The result of the operation was exactly zero. |
-| **C** | Carry | 29 | An unsigned overflow occurred (or a borrow in subtraction). |
-| **V** | oVerflow | 28 | A signed overflow occurred (result exceeded signed range). |
-
-## Arm Unsigned Division (AArch64)
-```
-$ nvim div.c
-```
-
-```
-unsigned div(unsigned x) {
- return x / 512;
-}
-```
-
-```
-$ rm -f (path filter *.o); clang -O2 -target aarch64-linux-gnu -c div.c; llvm-objdump -d div.o
-```
-
-```
-div.o: file format elf64-littleaarch64
-
-Disassembly of section .text:
-
-0000000000000000 :
- 0: 53097c00 lsr w0, w0, #9
- 4: d65f03c0 ret
-```
-
-Instruction:
-```
-lsr
, , #imm ; Logical Shift Right, that is w0 = w0 >> 9.
-```
-
-## References
-- https://developer.arm.com/documentation/ddi0601/latest/AArch64-Registers/NZCV--Condition-Flags
diff --git a/_sass/minimal-mistakes/main.scss b/_sass/minimal-mistakes/main.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/about.md b/about.md
deleted file mode 100644
index 8a0b612..0000000
--- a/about.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-layout: archive
-title: About Me
-permalink: /about/
----
diff --git a/assets/css/main.scss b/assets/css/main.scss
deleted file mode 100644
index e69de29..0000000
diff --git a/assets/js/main.js b/assets/js/main.js
deleted file mode 100644
index e69de29..0000000
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 0000000..1311b47
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,437 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "gapry.github.io",
+ "dependencies": {
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "vite": "^7.3.1",
+ },
+ },
+ },
+ "packages": {
+ "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
+
+ "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
+
+ "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="],
+
+ "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
+
+ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="],
+
+ "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
+
+ "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="],
+
+ "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="],
+
+ "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
+
+ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
+
+ "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="],
+
+ "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],
+
+ "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="],
+
+ "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="],
+
+ "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="],
+
+ "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="],
+
+ "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="],
+
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
+
+ "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
+
+ "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="],
+
+ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@3.3.4", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.3", "strip-json-comments": "^3.1.1" } }, "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ=="],
+
+ "@eslint/js": ["@eslint/js@9.39.3", "", {}, "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw=="],
+
+ "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
+
+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
+
+ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
+
+ "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.59.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.59.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="],
+
+ "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
+
+ "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
+
+ "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
+
+ "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
+
+ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
+
+ "@vitejs/plugin-react": ["@vitejs/plugin-react@5.1.4", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA=="],
+
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
+ "ajv": ["ajv@6.14.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="],
+
+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
+
+ "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
+
+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
+
+ "caniuse-lite": ["caniuse-lite@1.0.30001776", "", {}, "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw=="],
+
+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
+ "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
+ "electron-to-chromium": ["electron-to-chromium@1.5.307", "", {}, "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg=="],
+
+ "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],
+
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "eslint": ["eslint@9.39.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.3", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg=="],
+
+ "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="],
+
+ "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.26", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ=="],
+
+ "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
+
+ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
+
+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
+
+ "flatted": ["flatted@3.3.4", "", {}, "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
+
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="],
+
+ "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="],
+
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+
+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
+
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+
+ "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
+
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
+
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
+ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
+
+ "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
+ "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="],
+
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
+
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
+ "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
+
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
+
+ "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
+
+ "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="],
+
+ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
+
+ "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="],
+
+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
+
+ "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
+
+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
+ "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
+
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
+ "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
+ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
+
+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
+
+ "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="],
+
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
+ }
+}
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..4fa125d
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,29 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{js,jsx}'],
+ extends: [
+ js.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ parserOptions: {
+ ecmaVersion: 'latest',
+ ecmaFeatures: { jsx: true },
+ sourceType: 'module',
+ },
+ },
+ rules: {
+ 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
+ },
+ },
+])
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..ecb8693
--- /dev/null
+++ b/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Gapry's Blog
+
+
+
+
+
+
diff --git a/index.md b/index.md
deleted file mode 100644
index 12b469c..0000000
--- a/index.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-layout: home
----
-
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..50eab5a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "gapry.github.io",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "vite": "^7.3.1"
+ }
+}
diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..cf5ad37
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,8 @@
+{
+ "short_name": "Gapry",
+ "name": "Gapry Technical Writing",
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
\ No newline at end of file
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..c2a49f4
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Allow: /
diff --git a/scripts/install.sh b/scripts/install.sh
deleted file mode 100644
index 4a59a66..0000000
--- a/scripts/install.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-clear
-bundler install
diff --git a/scripts/test.sh b/scripts/test.sh
deleted file mode 100644
index 6c6e4ef..0000000
--- a/scripts/test.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-clear
-bundle exec jekyll clean
-bundle exec jekyll serve --trace
diff --git a/src/Analytics.jsx b/src/Analytics.jsx
new file mode 100644
index 0000000..e2bea14
--- /dev/null
+++ b/src/Analytics.jsx
@@ -0,0 +1,37 @@
+import { useEffect } from 'react';
+import siteConfig from './config.json';
+
+export default function Analytics() {
+ const trackingId = siteConfig.analytics.trackingId;
+
+ useEffect(() => {
+ if (!trackingId) {
+ return;
+ }
+
+ window.dataLayer = window.dataLayer || [];
+ if (typeof window.gtag !== 'function') {
+ window.gtag = function() {
+ window.dataLayer.push(arguments);
+ };
+ window.gtag('js', new Date());
+ }
+
+ window.gtag('config', trackingId, {
+ anonymize_ip: siteConfig.analytics.anonymizeIp,
+ });
+
+ if (document.getElementById('google-analytics')) {
+ return;
+ }
+
+ const script = document.createElement('script');
+ script.id = 'google-analytics';
+ script.src = `https://www.googletagmanager.com/gtag/js?id=${trackingId}`;
+ script.async = true;
+
+ document.head.appendChild(script);
+ }, [trackingId, siteConfig.analytics.anonymizeIp]);
+
+ return null;
+}
\ No newline at end of file
diff --git a/src/App.css b/src/App.css
new file mode 100644
index 0000000..e749d87
--- /dev/null
+++ b/src/App.css
@@ -0,0 +1,12 @@
+#root {
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+ line-height: 1.6;
+}
+
+.main-title {
+ text-align: center;
+ margin-top: 100px;
+}
\ No newline at end of file
diff --git a/src/App.jsx b/src/App.jsx
new file mode 100644
index 0000000..464e7f2
--- /dev/null
+++ b/src/App.jsx
@@ -0,0 +1,12 @@
+import Analytics from './Analytics';
+
+function App() {
+ return (
+ <>
+
+ Hello World
+ >
+ );
+}
+
+export default App;
\ No newline at end of file
diff --git a/src/config.json b/src/config.json
new file mode 100644
index 0000000..e6b9344
--- /dev/null
+++ b/src/config.json
@@ -0,0 +1,11 @@
+{
+ "siteName": "Gapry's Technical Writing",
+ "analytics": {
+ "provider": "google-gtag",
+ "trackingId": "G-4DG3HSBT1T",
+ "anonymizeIp": true
+ },
+ "social": {
+ "github": "gapry"
+ }
+}
\ No newline at end of file
diff --git a/src/index.css b/src/index.css
new file mode 100644
index 0000000..740bd67
--- /dev/null
+++ b/src/index.css
@@ -0,0 +1,17 @@
+body {
+ margin: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ font-family: system-ui, -apple-system, sans-serif;
+ background-color: #ffffff;
+ color: #333333;
+}
+
+@media (prefers-color-scheme: dark) {
+ body {
+ background-color: #1a1a1a;
+ color: #f0f0f0;
+ }
+}
\ No newline at end of file
diff --git a/src/main.jsx b/src/main.jsx
new file mode 100644
index 0000000..b9a1a6d
--- /dev/null
+++ b/src/main.jsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import './index.css'
+import App from './App.jsx'
+
+createRoot(document.getElementById('root')).render(
+
+
+ ,
+)
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..b56b6de
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,11 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+export default defineConfig({
+ plugins: [react()],
+ base: '/',
+ server: {
+ open: true,
+ port: 3000,
+ }
+})