diff --git a/README.md b/README.md
index ccfbd0b2a5f908e847f93f87ab48f53135b4a4b7..87f047e5ad4fd2cafbab369366baa6a7941f33cb 100644
--- a/README.md
+++ b/README.md
@@ -13,8 +13,6 @@ Il emploie l'API Web définie par [leximpact-socio-fiscal-api](https://git.lexim
 
 Ce projet fonctionne avec [NodeJS](https://nodejs.org/fr/) version 16 ou supérieure.
 
-Il utilise la bibliothèque [xxhash-addon](https://www.npmjs.com/package/xxhash-addon), écrite en C. Pour pouvoir installer et compiler cette bibliothèque, il est nécessaire d'installer au préalable la [chaîne de compilation Node.js](https://github.com/ktrongnhan/xxhash-addon#installation), qui dépend de votre système d'exploitation.
-
 Exécuter les commandes ci-dessous pour télécharger le projet, vous déplacer dans son répertoire, puis installer les librairies nécessaires à son fonctionnement :
 
 ```shell
diff --git a/package-lock.json b/package-lock.json
index 3bdb89e878f746b70fa7554b5a6a8a3da0cc2cf8..52c3a2b1a7cade9e4833bb361ea12b7565909eff 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,7 +8,7 @@
       "name": "leximpact-socio-fiscal-ui",
       "version": "0.0.396",
       "dependencies": {
-        "xxhash-addon": "^1.5.0"
+        "xxhash3lib": "^0.2.4"
       },
       "devDependencies": {
         "@auditors/core": "^0.3.0",
@@ -1431,6 +1431,25 @@
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
       "dev": true
     },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
     "node_modules/binary-extensions": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -1440,6 +1459,16 @@
         "node": ">=8"
       }
     },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1490,6 +1519,29 @@
         "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
       }
     },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
     "node_modules/buffer-crc32": {
       "version": "0.2.13",
       "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@@ -1644,6 +1696,11 @@
         "node": ">= 6"
       }
     },
+    "node_modules/chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+    },
     "node_modules/classnames": {
       "version": "2.3.2",
       "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
@@ -2000,6 +2057,14 @@
       "integrity": "sha512-jlBzY4tFcJaiUjzhRTCWAqRvTO/fWzjA3Bls0mykzGZ7zvcMP7h05W6UcgzfT9Ca1SW2xyKDOFRyI0pQeRNZGw==",
       "dev": true
     },
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
     "node_modules/es6-promise": {
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
@@ -2480,6 +2545,25 @@
         "svelte": "^3.55.1"
       }
     },
+    "node_modules/follow-redirects": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/formdata-polyfill": {
       "version": "4.0.10",
       "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
@@ -2520,6 +2604,11 @@
       "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==",
       "dev": true
     },
+    "node_modules/fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
     "node_modules/fs-extra": {
       "version": "11.1.1",
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
@@ -2704,6 +2793,25 @@
         "url": "https://github.com/sponsors/cyberalien"
       }
     },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
     "node_modules/ignore": {
       "version": "5.2.4",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@@ -2751,8 +2859,7 @@
     "node_modules/inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "node_modules/internmap": {
       "version": "2.0.3",
@@ -3182,6 +3289,11 @@
         "mkdirp": "bin/cmd.js"
       }
     },
+    "node_modules/mkdirp-classic": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+    },
     "node_modules/mri": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
@@ -3217,6 +3329,11 @@
         "thenify-all": "^1.0.0"
       }
     },
+    "node_modules/nan": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+      "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ=="
+    },
     "node_modules/nanoid": {
       "version": "3.3.6",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -3339,7 +3456,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dev": true,
       "dependencies": {
         "wrappy": "1"
       }
@@ -3783,6 +3899,15 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
     "node_modules/punycode": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
@@ -3833,6 +3958,19 @@
         "pify": "^2.3.0"
       }
     },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/readdirp": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -3983,7 +4121,6 @@
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true,
       "funding": [
         {
           "type": "github",
@@ -4198,6 +4335,14 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
     "node_modules/strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -4487,6 +4632,32 @@
         "node": ">=4"
       }
     },
+    "node_modules/tar-fs": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+      "dependencies": {
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
+      }
+    },
+    "node_modules/tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -4708,8 +4879,7 @@
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
-      "dev": true
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
     },
     "node_modules/uuid": {
       "version": "9.0.0",
@@ -4845,8 +5015,7 @@
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "node_modules/xlsx-js-style": {
       "version": "1.2.0",
@@ -4878,13 +5047,18 @@
       "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
       "dev": true
     },
-    "node_modules/xxhash-addon": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/xxhash-addon/-/xxhash-addon-1.5.0.tgz",
-      "integrity": "sha512-ZkfBZMrrpbyT8/uw7x+2voPBXO2oczajlGo11+OOO1YqGbk6DuF7erwirCUPvydN17lEjilu3VGDWWG4+fV45Q==",
+    "node_modules/xxhash3lib": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/xxhash3lib/-/xxhash3lib-0.2.4.tgz",
+      "integrity": "sha512-vkbU7L9xNfjyoGn7rCYevhOJP+AkrzhSc4PcLzL6CZZbNWTdwPXhgT3ZofqIf3AlurPiBr3nIhFZHWq3/wcIXg==",
       "hasInstallScript": true,
+      "dependencies": {
+        "follow-redirects": "^1.13.0",
+        "nan": "^2.14.1",
+        "tar-fs": "^2.1.0"
+      },
       "engines": {
-        "node": ">=8.6.0 <9.0.0 || >=10.0.0"
+        "node": ">=14"
       }
     },
     "node_modules/yallist": {
diff --git a/package.json b/package.json
index c93927d6b6c05a8f3cd7721a1ca8b71be6a625a3..f2215fcb55570368e0e4a547df03da14dc307dff 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
     "test": "playwright test"
   },
   "dependencies": {
-    "xxhash-addon": "^1.5.0"
+    "xxhash3lib": "^0.2.4"
   },
   "devDependencies": {
     "@auditors/core": "^0.3.0",
diff --git a/src/lib/components/NavBar.svelte b/src/lib/components/NavBar.svelte
index 01a863256e07a3c52dc417dce9207f374291d1f8..1b4521b36845dacb0e85d25681d2cd965b882e0b 100644
--- a/src/lib/components/NavBar.svelte
+++ b/src/lib/components/NavBar.svelte
@@ -19,7 +19,7 @@
   >
 
   // Save / share
-  const displayMode = getContext("displayMode") as Writable<
+  const displayModeWritable = getContext("displayMode") as Writable<
     DisplayMode | undefined
   >
 
@@ -97,11 +97,10 @@
   const testCases = getContext("testCases") as Writable<Situation[]>
 
   async function shareLink(): Promise<void> {
-    const displayModee = $displayMode
     const urlString = "/simulations"
     const res = await fetch(urlString, {
       body: JSON.stringify({
-        displayModee,
+        displayMode: $displayModeWritable,
         inputInstantsByVariableNameArray: $inputInstantsByVariableNameArray.map(
           (inputInstantsByVariableName) =>
             Object.fromEntries(
diff --git a/src/lib/decompositions.ts b/src/lib/decompositions.ts
index 6b8586071fcf82d2cb6b286aac1c0160bb5fe48e..75db26ea7012a442ece0184582bee3f2f9359c3f 100644
--- a/src/lib/decompositions.ts
+++ b/src/lib/decompositions.ts
@@ -115,23 +115,23 @@ export const decompositionCoreByNameByReformName: {
 export const waterfalls: Waterfall[] = waterfallsUnknown
 
 export const nonVirtualVariablesName = extractNonVirtualVariablesName(
-    decompositionCoreByName,
-    variableSummaryByName,
-    waterfalls,
+  decompositionCoreByName,
+  variableSummaryByName,
+  waterfalls,
 )
 export const nonVirtualVariablesNameByReformName: {
   [name: string]: string[]
 } = Object.fromEntries(
-    Object.entries(decompositionCoreByNameByReformName).map(
-        ([reformName, reformDecompositionCoreByName]) => [
-          reformName,
-          extractNonVirtualVariablesName(
-              reformDecompositionCoreByName,
-              variableSummaryByNameByReformName[reformName],
-              waterfalls,
-          ),
-        ],
-    ),
+  Object.entries(decompositionCoreByNameByReformName).map(
+    ([reformName, reformDecompositionCoreByName]) => [
+      reformName,
+      extractNonVirtualVariablesName(
+        reformDecompositionCoreByName,
+        variableSummaryByNameByReformName[reformName],
+        waterfalls,
+      ),
+    ],
+  ),
 )
 
 export const decompositionsOptionsVariablesName = new Set<string>()
@@ -942,59 +942,59 @@ function buildVisibleDecompositionsForComparison1(
 }
 
 function extractLinkedVariablesName(
-    linkedVariablesName: Set<string>,
-    name: string,
-    variableSummaryByName: VariableByName,
+  linkedVariablesName: Set<string>,
+  name: string,
+  variableSummaryByName: VariableByName,
 ): void {
   const variableSummary = variableSummaryByName[name]
   for (const linkedVariableName of variableSummary.linked_added_variables ??
-  []) {
+    []) {
     if (!linkedVariablesName.has(linkedVariableName)) {
       linkedVariablesName.add(linkedVariableName)
       extractLinkedVariablesName(
-          linkedVariablesName,
-          linkedVariableName,
-          variableSummaryByName,
+        linkedVariablesName,
+        linkedVariableName,
+        variableSummaryByName,
       )
     }
   }
   for (const linkedVariableName of variableSummary.linked_other_variables ??
-  []) {
+    []) {
     if (!linkedVariablesName.has(linkedVariableName)) {
       linkedVariablesName.add(linkedVariableName)
       extractLinkedVariablesName(
-          linkedVariablesName,
-          linkedVariableName,
-          variableSummaryByName,
+        linkedVariablesName,
+        linkedVariableName,
+        variableSummaryByName,
       )
     }
   }
   for (const linkedVariableName of variableSummary.linked_output_variables ??
-  []) {
+    []) {
     if (!linkedVariablesName.has(linkedVariableName)) {
       linkedVariablesName.add(linkedVariableName)
       extractLinkedVariablesName(
-          linkedVariablesName,
-          linkedVariableName,
-          variableSummaryByName,
+        linkedVariablesName,
+        linkedVariableName,
+        variableSummaryByName,
       )
     }
   }
 }
 
 function extractNonVirtualVariablesName(
-    decompositionCoreByName: DecompositionCoreByName,
-    variableSummaryByName: VariableByName,
-    waterfalls: Waterfall[],
+  decompositionCoreByName: DecompositionCoreByName,
+  variableSummaryByName: VariableByName,
+  waterfalls: Waterfall[],
 ): string[] {
   const linkedVariablesName = new Set<string>()
   const nonVirtualVariablesName: string[] = []
   for (const { name: waterfallName, root } of waterfalls) {
     for (const [name, decomposition] of walkDecompositionsCore(
-        decompositionCoreByName,
-        waterfallName,
-        root,
-        true,
+      decompositionCoreByName,
+      waterfallName,
+      root,
+      true,
     )) {
       // Note: Duplicates are removed from nonVirtualVariablesName, because a variable name
       // may appear more than once in decomposition.
@@ -1002,15 +1002,15 @@ function extractNonVirtualVariablesName(
         nonVirtualVariablesName.push(name)
         const variableSummary = variableSummaryByName[name]
         for (const linkedVariableName of variableSummary.linked_added_variables ??
-        []) {
+          []) {
           linkedVariablesName.add(linkedVariableName)
         }
         for (const linkedVariableName of variableSummary.linked_other_variables ??
-        []) {
+          []) {
           linkedVariablesName.add(linkedVariableName)
         }
         for (const linkedVariableName of variableSummary.linked_output_variables ??
-        []) {
+          []) {
           linkedVariablesName.add(linkedVariableName)
         }
       }
@@ -1020,9 +1020,9 @@ function extractNonVirtualVariablesName(
   // Add linked variables.
   for (const linkedVariableName of linkedVariablesName) {
     extractLinkedVariablesName(
-        linkedVariablesName,
-        linkedVariableName,
-        variableSummaryByName,
+      linkedVariablesName,
+      linkedVariableName,
+      variableSummaryByName,
     )
   }
   for (const linkedVariableName of linkedVariablesName) {
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index c9e505e96881955dfab34895c86dd75b499885f4..da3e09111727ce4a1a0089b4b0522e8a46513bf5 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -649,7 +649,8 @@
   function onKeyDown(e) {
     switch (e.keyCode) {
       case 13: // 'Enter' key
-        if (displayMode.edit !== undefined) setTimeout(() => changeTestCaseToEditIndex(undefined), 1)
+        if (displayMode.edit !== undefined)
+          setTimeout(() => changeTestCaseToEditIndex(undefined), 1)
     }
   }
 
diff --git a/src/routes/simulations/+server.ts b/src/routes/simulations/+server.ts
index cdf9fc0c38bb99b821084370e7b661b26ab09b6f..afdbf4ea3208faf5339ce79e74188bcfd61201ef 100644
--- a/src/routes/simulations/+server.ts
+++ b/src/routes/simulations/+server.ts
@@ -7,7 +7,7 @@ import {
 import { error, json } from "@sveltejs/kit"
 import fs from "fs-extra"
 import path from "path"
-import { XXHash3 } from "xxhash-addon"
+import { createXXH3_64 } from "xxhash3lib"
 
 import config from "$lib/server/config"
 
@@ -81,9 +81,9 @@ export const POST: RequestHandler = async ({ request, url }) => {
     throw error(400, `Invalid body: ${JSON.stringify(bodyError, null, 2)}`)
   }
   const bodyJson = JSON.stringify(body, null, 2)
-  const hasher = new XXHash3()
+  const hasher = createXXH3_64()
   hasher.update(Buffer.from(bodyJson))
-  const digest = hasher.digest().toString("hex")
+  const digest = hasher.digest("hex")
 
   const simulationDir = path.join(simulationsDir, digest.substring(0, 2))
   const simulationFilePath = path.join(simulationDir, `${digest}.json`)