From 94003989ef5ceab92ab47f7e295c8eef41332a10 Mon Sep 17 00:00:00 2001 From: Pascal Le Merrer Date: Mon, 19 Jan 2026 14:13:52 +0100 Subject: [PATCH] Integrate elm App with Tauri. Can navigate into source directory. --- .gitignore | 25 + README.md | 7 + src-elm/elm.json | 42 + src-elm/index.html | 11645 +++++++++++ src-elm/package-lock.json | 3068 +++ src-elm/package.json | 8 + src-elm/review/elm.json | 49 + src-elm/review/src/ReviewConfig.elm | 77 + src-elm/src/File.elm | 254 + src-elm/src/Main.elm | 2619 +++ src-elm/src/Pattern.elm | 48 + src-elm/src/StringComparison.elm | 53 + src-elm/tests/FileTest.elm | 250 + src-elm/tests/Fixtures.elm | 112 + src-elm/tests/MaintTest.elm | 291 + src-elm/tests/SearchReplaceTest.elm | 74 + src-elm/tests/StringComparisonTest.elm | 23 + src-tauri/.gitignore | 7 + src-tauri/Cargo.lock | 5169 +++++ src-tauri/Cargo.toml | 26 + src-tauri/build.rs | 3 + src-tauri/capabilities/default.json | 22 + src-tauri/icons/128x128.png | Bin 0 -> 3512 bytes src-tauri/icons/128x128@2x.png | Bin 0 -> 7012 bytes src-tauri/icons/32x32.png | Bin 0 -> 974 bytes src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2863 bytes src-tauri/icons/Square142x142Logo.png | Bin 0 -> 3858 bytes src-tauri/icons/Square150x150Logo.png | Bin 0 -> 3966 bytes src-tauri/icons/Square284x284Logo.png | Bin 0 -> 7737 bytes src-tauri/icons/Square30x30Logo.png | Bin 0 -> 903 bytes src-tauri/icons/Square310x310Logo.png | Bin 0 -> 8591 bytes src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1299 bytes src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2011 bytes src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2468 bytes src-tauri/icons/StoreLogo.png | Bin 0 -> 1523 bytes src-tauri/icons/icon.icns | Bin 0 -> 98451 bytes src-tauri/icons/icon.ico | Bin 0 -> 86642 bytes src-tauri/icons/icon.png | Bin 0 -> 14183 bytes src-tauri/src/lib.rs | 17 + src-tauri/src/main.rs | 6 + src-tauri/tauri.conf.json | 36 + src/assets/fonts/OFL.txt | 93 + .../fonts/nunito-v16-latin-regular.woff2 | Bin 0 -> 18972 bytes src/elm.js | 16758 ++++++++++++++++ src/example/index.html | 39 + src/example/main.js | 18 + src/index.html | 17 + src/main.css | 342 + src/slider.css | 196 + src/wrapper.js | 62 + 50 files changed, 41456 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 src-elm/elm.json create mode 100644 src-elm/index.html create mode 100644 src-elm/package-lock.json create mode 100644 src-elm/package.json create mode 100644 src-elm/review/elm.json create mode 100644 src-elm/review/src/ReviewConfig.elm create mode 100644 src-elm/src/File.elm create mode 100644 src-elm/src/Main.elm create mode 100644 src-elm/src/Pattern.elm create mode 100644 src-elm/src/StringComparison.elm create mode 100644 src-elm/tests/FileTest.elm create mode 100644 src-elm/tests/Fixtures.elm create mode 100644 src-elm/tests/MaintTest.elm create mode 100644 src-elm/tests/SearchReplaceTest.elm create mode 100644 src-elm/tests/StringComparisonTest.elm create mode 100644 src-tauri/.gitignore create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/capabilities/default.json create mode 100644 src-tauri/icons/128x128.png create mode 100644 src-tauri/icons/128x128@2x.png create mode 100644 src-tauri/icons/32x32.png create mode 100644 src-tauri/icons/Square107x107Logo.png create mode 100644 src-tauri/icons/Square142x142Logo.png create mode 100644 src-tauri/icons/Square150x150Logo.png create mode 100644 src-tauri/icons/Square284x284Logo.png create mode 100644 src-tauri/icons/Square30x30Logo.png create mode 100644 src-tauri/icons/Square310x310Logo.png create mode 100644 src-tauri/icons/Square44x44Logo.png create mode 100644 src-tauri/icons/Square71x71Logo.png create mode 100644 src-tauri/icons/Square89x89Logo.png create mode 100644 src-tauri/icons/StoreLogo.png create mode 100644 src-tauri/icons/icon.icns create mode 100644 src-tauri/icons/icon.ico create mode 100644 src-tauri/icons/icon.png create mode 100644 src-tauri/src/lib.rs create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 src/assets/fonts/OFL.txt create mode 100644 src/assets/fonts/nunito-v16-latin-regular.woff2 create mode 100644 src/elm.js create mode 100644 src/example/index.html create mode 100644 src/example/main.js create mode 100644 src/index.html create mode 100644 src/main.css create mode 100644 src/slider.css create mode 100644 src/wrapper.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc9f289 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +src-elm/elm-stuff diff --git a/README.md b/README.md new file mode 100644 index 0000000..441faf7 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Tauri + Vanilla + +This template should help get you started developing with Tauri in vanilla HTML, CSS and Javascript. + +## Recommended IDE Setup + +- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) diff --git a/src-elm/elm.json b/src-elm/elm.json new file mode 100644 index 0000000..f74fcc8 --- /dev/null +++ b/src-elm/elm.json @@ -0,0 +1,42 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "ChristophP/elm-mark": "2.0.4", + "Gizra/elm-keyboard-event": "1.0.1", + "NoRedInk/elm-json-decode-pipeline": "1.0.1", + "SwiftsNamesake/proper-keyboard": "4.0.0", + "basti1302/elm-human-readable-filesize": "1.2.0", + "carwow/elm-slider": "11.1.6", + "dasch/levenshtein": "1.0.3", + "elm/browser": "1.0.2", + "elm/core": "1.0.5", + "elm/html": "1.0.1", + "elm/json": "1.1.4", + "elm/regex": "1.0.0", + "elm/time": "1.0.0", + "elm-community/list-extra": "8.7.0", + "elm-community/string-extra": "4.0.1", + "elm-explorations/test": "2.2.0", + "rtfeldman/elm-iso8601-date-strings": "1.1.4", + "z5h/jaro-winkler": "1.0.2" + }, + "indirect": { + "debois/elm-dom": "1.3.0", + "elm/bytes": "1.0.8", + "elm/parser": "1.1.0", + "elm/random": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.5", + "myrho/elm-round": "1.0.5" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/src-elm/index.html b/src-elm/index.html new file mode 100644 index 0000000..c287221 --- /dev/null +++ b/src-elm/index.html @@ -0,0 +1,11645 @@ + + + + + Main + + + + + +

+
+
+
+
+
\ No newline at end of file
diff --git a/src-elm/package-lock.json b/src-elm/package-lock.json
new file mode 100644
index 0000000..c5c8cff
--- /dev/null
+++ b/src-elm/package-lock.json
@@ -0,0 +1,3068 @@
+{
+  "name": "src-elm",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "src-elm",
+      "devDependencies": {
+        "elm-json": "^0.2.13",
+        "elm-live": "^4.0.2",
+        "elm-review": "^2.13.5",
+        "elm-test": "^0.19.1-revision17"
+      }
+    },
+    "node_modules/@sindresorhus/is": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+      "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/is?sponsor=1"
+      }
+    },
+    "node_modules/@szmarczak/http-timer": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+      "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+      "dev": true,
+      "dependencies": {
+        "defer-to-connect": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@types/cacheable-request": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
+      "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
+      "dev": true,
+      "dependencies": {
+        "@types/http-cache-semantics": "*",
+        "@types/keyv": "*",
+        "@types/node": "*",
+        "@types/responselike": "*"
+      }
+    },
+    "node_modules/@types/http-cache-semantics": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+      "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
+      "dev": true
+    },
+    "node_modules/@types/json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==",
+      "dev": true
+    },
+    "node_modules/@types/keyv": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+      "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "18.7.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz",
+      "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==",
+      "dev": true
+    },
+    "node_modules/@types/responselike": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+      "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.21.3"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "dev": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/asn1": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "node_modules/assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/aws4": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+      "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "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==",
+      "dev": true,
+      "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/bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "node_modules/binary": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
+      "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "buffers": "~0.1.1",
+        "chainsaw": "~0.1.0"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/binwrap": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/binwrap/-/binwrap-0.2.3.tgz",
+      "integrity": "sha512-N4Pm7iyDEv0BrAMs+dny8WQa+e0nNTdzn2ODkf/MM6XBtKSCxCSUA1ZOQGoc1n7mUqdgOS5pwjsW91rmXVxy2Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "request": "^2.88.0",
+        "tar": "^6.1.0",
+        "unzip-stream": "^0.3.1"
+      },
+      "bin": {
+        "binwrap-install": "bin/binwrap-install",
+        "binwrap-prepare": "bin/binwrap-prepare",
+        "binwrap-test": "bin/binwrap-test"
+      }
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "dev": true,
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "dev": true,
+      "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/buffers": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
+      "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.2.0"
+      }
+    },
+    "node_modules/cacheable-lookup": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+      "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.6.0"
+      }
+    },
+    "node_modules/cacheable-request": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
+      "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
+      "dev": true,
+      "dependencies": {
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^4.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^6.0.1",
+        "responselike": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+      "dev": true,
+      "license": "Apache-2.0"
+    },
+    "node_modules/chainsaw": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
+      "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==",
+      "dev": true,
+      "license": "MIT/X11",
+      "dependencies": {
+        "traverse": ">=0.3.0 <0.4"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dev": true,
+      "dependencies": {
+        "restore-cursor": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cli-spinners": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz",
+      "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/clone-response": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+      "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
+      "dev": true,
+      "dependencies": {
+        "mimic-response": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+      "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.20.0 || >=14"
+      }
+    },
+    "node_modules/compress-brotli": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz",
+      "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/json-buffer": "~3.0.0",
+        "json-buffer": "~3.0.1"
+      },
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/crocks": {
+      "version": "0.12.1",
+      "resolved": "https://registry.npmjs.org/crocks/-/crocks-0.12.1.tgz",
+      "integrity": "sha512-2qCRJwBmPlRQXzd50k9gt9PaItultOP8lj/cKSH2Eai9aeBuNqAnDuyolAm9TGn6Pw/4BgbxtPJLU1S+tQ4WMQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "dev": true,
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/decompress-response/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/default-gateway": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+      "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "execa": "^1.0.0",
+        "ip-regex": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/defaults": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+      "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==",
+      "dev": true,
+      "dependencies": {
+        "clone": "^1.0.2"
+      }
+    },
+    "node_modules/defer-to-connect": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/elm-hot": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/elm-hot/-/elm-hot-1.1.4.tgz",
+      "integrity": "sha512-qPDP/o/Fkifriaxaf3E7hHFB5L6Ijihyg8is4A6xna6/h/zebUiNssbQrxywI2oxNUkr6W/leEu/WlIC1tmVnw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/elm-json": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/elm-json/-/elm-json-0.2.13.tgz",
+      "integrity": "sha512-KpmZIcWJbnGsUn4X1/OqGdPMWnV0kgtrK5thACwfnKHlOg3A2jMyMBWzBOJcycCpQVBC7XTVssClZGetsvaMBQ==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "dependencies": {
+        "binwrap": "^0.2.3"
+      },
+      "bin": {
+        "elm-json": "bin/elm-json"
+      }
+    },
+    "node_modules/elm-live": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/elm-live/-/elm-live-4.0.2.tgz",
+      "integrity": "sha512-4I3UvJxF6MubC14VsgtV11B0zBxaaKtdKKsWquoaa5a3UHBIGW83qgTnt/NxOj4omOLfupaftmDaE4yRMTgTcw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "chalk": "^1.1.1",
+        "chokidar": "3.0.2",
+        "commander": "2.17.1",
+        "crocks": "0.12.1",
+        "cross-spawn": "5.0.1",
+        "elm-hot": "1.1.4",
+        "finalhandler": "1.1.2",
+        "http-proxy": "1.17.0",
+        "internal-ip": "4.3.0",
+        "mime": "2.4.3",
+        "open": "6.4.0",
+        "pem": "1.14.2",
+        "serve-static": "1.14.1",
+        "ws": "7.1.1"
+      },
+      "bin": {
+        "elm-live": "bin/elm-live.js"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/chokidar": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz",
+      "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "^3.0.1",
+        "braces": "^3.0.2",
+        "glob-parent": "^5.0.0",
+        "is-binary-path": "^2.1.0",
+        "is-glob": "^4.0.1",
+        "normalize-path": "^3.0.0",
+        "readdirp": "^3.1.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      },
+      "optionalDependencies": {
+        "fsevents": "^2.0.6"
+      }
+    },
+    "node_modules/elm-live/node_modules/commander": {
+      "version": "2.17.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/elm-live/node_modules/cross-spawn": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.0.1.tgz",
+      "integrity": "sha512-77q+/Kkp43OBZUppmezGBqwB1qdjGk8y1Kb6zdPaYVz8qKFRdGpL6TRLqJhlhG5RhtGkNnKaeEYCt7b/vtYteg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "lru-cache": "^4.0.1",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "node_modules/elm-live/node_modules/shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/elm-live/node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "which": "bin/which"
+      }
+    },
+    "node_modules/elm-review": {
+      "version": "2.13.5",
+      "resolved": "https://registry.npmjs.org/elm-review/-/elm-review-2.13.5.tgz",
+      "integrity": "sha512-Iw3YztGjmuGyn4nIEVOxqx+dacJialprpB0ZVrBHA0sBBOQ9+QhBaQnQ0tp0G8U8UoIAush0M7XoBqzUN1F/+A==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "chokidar": "^3.5.2",
+        "cross-spawn": "^7.0.3",
+        "elm-solve-deps-wasm": "^1.0.2 || ^2.0.0",
+        "fastest-levenshtein": "^1.0.16",
+        "find-up": "^4.1.0 || ^5.0.0",
+        "folder-hash": "^3.3.0",
+        "got": "^11.8.5",
+        "graceful-fs": "^4.2.11",
+        "minimist": "^1.2.6",
+        "ora": "^5.4.0",
+        "path-key": "^3.1.1",
+        "prompts": "^2.2.1",
+        "strip-ansi": "^6.0.0",
+        "terminal-link": "^2.1.1",
+        "tinyglobby": "^0.2.10",
+        "which": "^2.0.2",
+        "wrap-ansi": "^7.0.0"
+      },
+      "bin": {
+        "elm-review": "bin/elm-review"
+      },
+      "engines": {
+        "node": "14 >=14.21 || 16 >=16.20 || 18 || 20 || >=22"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jfmengels"
+      }
+    },
+    "node_modules/elm-solve-deps-wasm": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/elm-solve-deps-wasm/-/elm-solve-deps-wasm-2.0.0.tgz",
+      "integrity": "sha512-11OV8FgB9qsth/F94q2SJjb1MoEgbworSyNM1L+YlxVoaxp7wtWPyA8cNcPEkSoIKG1B8Tqg68ED1P6dVamHSg==",
+      "dev": true,
+      "license": "MPL-2.0"
+    },
+    "node_modules/elm-test": {
+      "version": "0.19.1-revision17",
+      "resolved": "https://registry.npmjs.org/elm-test/-/elm-test-0.19.1-revision17.tgz",
+      "integrity": "sha512-P9J8tXdLXmqgIMlSozfcb/KCORq4GuxfwBbzqFLMss8KlGmUKonOJwseRX6xVkdU5xgGVA/mz9rfMTNomIbwng==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "chalk": "^4.1.2",
+        "chokidar": "^3.5.3",
+        "commander": "^9.4.1",
+        "cross-spawn": "^7.0.6",
+        "elm-solve-deps-wasm": "^1.0.2 || ^2.0.0",
+        "graceful-fs": "^4.2.10",
+        "split": "^1.0.1",
+        "tinyglobby": "^0.2.10",
+        "which": "^2.0.2",
+        "xmlbuilder": "^15.1.1"
+      },
+      "bin": {
+        "elm-test": "bin/elm-test"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "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==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
+    "node_modules/es6-promisify": {
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz",
+      "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/eventemitter3": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/execa/node_modules/cross-spawn": {
+      "version": "6.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
+      "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      },
+      "engines": {
+        "node": ">=4.8"
+      }
+    },
+    "node_modules/execa/node_modules/get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/execa/node_modules/path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/execa/node_modules/shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/execa/node_modules/shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/execa/node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "which": "bin/which"
+      }
+    },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "dev": true,
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "license": "MIT"
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/fastest-levenshtein": {
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+      "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4.9.1"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/folder-hash": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/folder-hash/-/folder-hash-3.3.3.tgz",
+      "integrity": "sha512-SDgHBgV+RCjrYs8aUwCb9rTgbTVuSdzvFmLaChsLre1yf+D64khCW++VYciaByZ8Rm0uKF8R/XEpXuTRSGUM1A==",
+      "dev": true,
+      "dependencies": {
+        "debug": "^4.1.1",
+        "graceful-fs": "~4.2.0",
+        "minimatch": "~3.0.4"
+      },
+      "bin": {
+        "folder-hash": "bin/folder-hash"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.11",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+      "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 0.12"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/fs-minipass/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "dev": true,
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/got": {
+      "version": "11.8.5",
+      "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz",
+      "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==",
+      "dev": true,
+      "dependencies": {
+        "@sindresorhus/is": "^4.0.0",
+        "@szmarczak/http-timer": "^4.0.5",
+        "@types/cacheable-request": "^6.0.1",
+        "@types/responselike": "^1.0.0",
+        "cacheable-lookup": "^5.0.3",
+        "cacheable-request": "^7.0.2",
+        "decompress-response": "^6.0.0",
+        "http2-wrapper": "^1.0.0-beta.5.2",
+        "lowercase-keys": "^2.0.0",
+        "p-cancelable": "^2.0.0",
+        "responselike": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.19.0"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/got?sponsor=1"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "deprecated": "this library is no longer supported",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-ansi/node_modules/ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/http-cache-semantics": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+      "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+      "dev": true,
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/http-errors": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
+      "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/http-proxy": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "eventemitter3": "^3.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      },
+      "engines": {
+        "node": ">=0.8",
+        "npm": ">=1.3.7"
+      }
+    },
+    "node_modules/http2-wrapper": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+      "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+      "dev": true,
+      "dependencies": {
+        "quick-lru": "^5.1.1",
+        "resolve-alpn": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=10.19.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "dev": true,
+      "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/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "node_modules/isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true
+    },
+    "node_modules/json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+      "dev": true,
+      "license": "(AFL-2.1 OR BSD-3-Clause)"
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/jsprim": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "4.3.3",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz",
+      "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==",
+      "dev": true,
+      "dependencies": {
+        "compress-brotli": "^1.3.8",
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/log-symbols": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+      "dev": true,
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lowercase-keys": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "node_modules/lru-cache/node_modules/yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/md5": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "charenc": "0.0.2",
+        "crypt": "0.0.2",
+        "is-buffer": "~1.1.6"
+      }
+    },
+    "node_modules/mime": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz",
+      "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+      "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/minipass": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minizlib/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-url": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+      "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/npm-run-path/node_modules/path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/oauth-sign": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "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"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/open": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
+      "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-wsl": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ora": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+      "dev": true,
+      "dependencies": {
+        "bl": "^4.1.0",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.5.0",
+        "is-interactive": "^1.0.0",
+        "is-unicode-supported": "^0.1.0",
+        "log-symbols": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/p-cancelable": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+      "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pem": {
+      "version": "1.14.2",
+      "resolved": "https://registry.npmjs.org/pem/-/pem-1.14.2.tgz",
+      "integrity": "sha512-TOnPtq3ZFnCniOZ+rka4pk8UIze9xG1qI+wNE7EmkiR/cg+53uVvk5QbkWZ7M6RsuOxzz62FW1hlAobJr/lTOA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "es6-promisify": "^6.0.0",
+        "md5": "^2.2.1",
+        "os-tmpdir": "^1.0.1",
+        "which": "^1.3.1"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/pem/node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "which": "bin/which"
+      }
+    },
+    "node_modules/performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/prompts": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+      "dev": true,
+      "dependencies": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/psl": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+      "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "punycode": "^2.3.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/lupomontero"
+      }
+    },
+    "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==",
+      "dev": true,
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+      "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/quick-lru": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "dev": true,
+      "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",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.3",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/resolve-alpn": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+      "dev": true
+    },
+    "node_modules/responselike": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+      "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+      "dev": true,
+      "dependencies": {
+        "lowercase-keys": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dev": true,
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "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",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/send/node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+      "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+      "dev": true
+    },
+    "node_modules/sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "dev": true
+    },
+    "node_modules/split": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "through": "2"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/sshpk": {
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+      "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      },
+      "bin": {
+        "sshpk-conv": "bin/sshpk-conv",
+        "sshpk-sign": "bin/sshpk-sign",
+        "sshpk-verify": "bin/sshpk-verify"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "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==",
+      "dev": true,
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-hyperlinks": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz",
+      "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/tar": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+      "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^5.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terminal-link": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+      "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-escapes": "^4.2.1",
+        "supports-hyperlinks": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.15",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+      "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/tinyglobby/node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tinyglobby/node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/traverse": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
+      "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==",
+      "dev": true,
+      "license": "MIT/X11",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "safe-buffer": "^5.0.1"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+      "dev": true,
+      "license": "Unlicense"
+    },
+    "node_modules/type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/unzip-stream": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.4.tgz",
+      "integrity": "sha512-PyofABPVv+d7fL7GOpusx7eRT9YETY2X04PhwbSipdj6bMxVCFJrr+nm0Mxqbf9hUiTin/UsnuFWBXlDZFy0Cw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "binary": "^0.3.0",
+        "mkdirp": "^0.5.1"
+      }
+    },
+    "node_modules/unzip-stream/node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "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
+    },
+    "node_modules/uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "uuid": "bin/uuid"
+      }
+    },
+    "node_modules/verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+      "dev": true,
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "node_modules/wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+      "dev": true,
+      "dependencies": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "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
+    },
+    "node_modules/ws": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.1.tgz",
+      "integrity": "sha512-o41D/WmDeca0BqYhsr3nJzQyg9NF5X8l/UdnFNux9cS3lwB+swm8qGWX5rn+aD6xfBU3rGmtHij7g7x6LxFU3A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "async-limiter": "^1.0.0"
+      }
+    },
+    "node_modules/xmlbuilder": {
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+      "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true,
+      "license": "ISC"
+    }
+  }
+}
diff --git a/src-elm/package.json b/src-elm/package.json
new file mode 100644
index 0000000..aa4757d
--- /dev/null
+++ b/src-elm/package.json
@@ -0,0 +1,8 @@
+{
+  "devDependencies": {
+    "elm-json": "^0.2.13",
+    "elm-live": "^4.0.2",
+    "elm-review": "^2.13.5",
+    "elm-test": "^0.19.1-revision17"
+  }
+}
diff --git a/src-elm/review/elm.json b/src-elm/review/elm.json
new file mode 100644
index 0000000..88bb822
--- /dev/null
+++ b/src-elm/review/elm.json
@@ -0,0 +1,49 @@
+{
+    "type": "application",
+    "source-directories": [
+        "src"
+    ],
+    "elm-version": "0.19.1",
+    "dependencies": {
+        "direct": {
+            "SiriusStarr/elm-review-no-unsorted": "1.1.2",
+            "elm/core": "1.0.5",
+            "elm/json": "1.1.3",
+            "elm/project-metadata-utils": "1.0.2",
+            "jfmengels/elm-review": "2.8.1",
+            "jfmengels/elm-review-code-style": "1.0.0",
+            "jfmengels/elm-review-common": "1.2.1",
+            "jfmengels/elm-review-debug": "1.0.6",
+            "jfmengels/elm-review-documentation": "2.0.1",
+            "jfmengels/elm-review-simplify": "2.0.16",
+            "jfmengels/elm-review-unused": "1.1.22",
+            "stil4m/elm-syntax": "7.2.9"
+        },
+        "indirect": {
+            "avh4/elm-fifo": "1.0.4",
+            "elm/html": "1.0.0",
+            "elm/parser": "1.1.0",
+            "elm/random": "1.0.0",
+            "elm/regex": "1.0.0",
+            "elm/time": "1.0.0",
+            "elm/virtual-dom": "1.0.3",
+            "elm-community/dict-extra": "2.4.0",
+            "elm-community/graph": "6.0.0",
+            "elm-community/intdict": "3.0.0",
+            "elm-community/list-extra": "8.6.0",
+            "elm-community/maybe-extra": "5.3.0",
+            "elm-community/result-extra": "2.4.0",
+            "elm-community/string-extra": "4.0.1",
+            "elm-explorations/test": "1.2.2",
+            "miniBill/elm-unicode": "1.0.2",
+            "rtfeldman/elm-hex": "1.0.0",
+            "stil4m/structured-writer": "1.0.3"
+        }
+    },
+    "test-dependencies": {
+        "direct": {
+            "elm-explorations/test": "1.2.2"
+        },
+        "indirect": {}
+    }
+}
diff --git a/src-elm/review/src/ReviewConfig.elm b/src-elm/review/src/ReviewConfig.elm
new file mode 100644
index 0000000..ec7c5c3
--- /dev/null
+++ b/src-elm/review/src/ReviewConfig.elm
@@ -0,0 +1,77 @@
+module ReviewConfig exposing (config)
+
+{-| Do not rename the ReviewConfig module or the config function, because
+`elm-review` will look for these.
+
+To add packages that contain rules, add them to this review project using
+
+    `elm install author/packagename`
+
+when inside the directory containing this file.
+
+-}
+
+import Docs.ReviewAtDocs
+import NoDebug.Log
+import NoDebug.TodoOrToString
+import NoExposingEverything
+import NoImportingEverything
+import NoMissingTypeAnnotation
+import NoMissingTypeAnnotationInLetIn
+import NoMissingTypeExpose
+import NoPrematureLetComputation
+import NoSimpleLetBody
+import NoUnsortedCases
+import NoUnsortedLetDeclarations
+import NoUnsortedRecords
+import NoUnsortedTopLevelDeclarations
+import NoUnused.CustomTypeConstructorArgs
+import NoUnused.CustomTypeConstructors
+import NoUnused.Dependencies
+import NoUnused.Exports
+import NoUnused.Modules
+import NoUnused.Parameters
+import NoUnused.Patterns
+import NoUnused.Variables
+import Review.Rule as Rule exposing (Rule)
+import Simplify
+
+
+config : List Rule
+config =
+    [ Docs.ReviewAtDocs.rule
+    , NoDebug.Log.rule
+    , NoDebug.TodoOrToString.rule
+        |> Rule.ignoreErrorsForDirectories [ "tests/" ]
+    , NoExposingEverything.rule
+    , NoImportingEverything.rule []
+    , NoMissingTypeAnnotation.rule
+    , NoMissingTypeAnnotationInLetIn.rule
+    , NoMissingTypeExpose.rule
+    , NoSimpleLetBody.rule
+    , NoPrematureLetComputation.rule
+    , NoUnused.CustomTypeConstructors.rule []
+    , NoUnused.CustomTypeConstructorArgs.rule
+    , NoUnused.Dependencies.rule
+    , NoUnused.Exports.rule
+    , NoUnused.Modules.rule
+    , NoUnused.Parameters.rule
+    , NoUnused.Patterns.rule
+    , NoUnused.Variables.rule
+    , NoUnsortedCases.rule NoUnsortedCases.defaults
+    , NoUnsortedLetDeclarations.rule
+        (NoUnsortedLetDeclarations.sortLetDeclarations
+            |> NoUnsortedLetDeclarations.alphabetically
+        )
+    , NoUnsortedRecords.rule
+        (NoUnsortedRecords.defaults
+            |> NoUnsortedRecords.reportAmbiguousRecordsWithoutFix
+        )
+    , NoUnsortedTopLevelDeclarations.rule
+        (NoUnsortedTopLevelDeclarations.sortTopLevelDeclarations
+            |> NoUnsortedTopLevelDeclarations.portsFirst
+            |> NoUnsortedTopLevelDeclarations.exposedOrderWithPrivateLast
+            |> NoUnsortedTopLevelDeclarations.alphabetically
+        )
+    , Simplify.rule Simplify.defaults
+    ]
diff --git a/src-elm/src/File.elm b/src-elm/src/File.elm
new file mode 100644
index 0000000..833dc9a
--- /dev/null
+++ b/src-elm/src/File.elm
@@ -0,0 +1,254 @@
+module File exposing (File, FileStatus(..), defaultDir, extendSelectionToNext, extendSelectionToPrevious, fileDecoder, selectNext, selectPrevious, selectSimilar, toggleSelectionStatus, withName, withParentPath, withStatus)
+
+import Iso8601
+import Json.Decode exposing (Decoder)
+import Json.Decode.Pipeline exposing (hardcoded, required)
+import List.Extra
+import StringComparison exposing (isSimilarityLevelGreaterThan)
+import Time exposing (Posix, millisToPosix)
+
+
+type alias File =
+    { isDir : Bool
+    , mode : Int
+    , modTime : Posix
+    , name : String
+    , parentPath : String
+    , satisfiesFilter : Bool
+    , size : Int
+    , status : FileStatus
+    }
+
+
+type FileStatus
+    = Unselected
+    | Edited
+    | Selected
+    | SelectedForDeletion
+
+
+defaultDir : File
+defaultDir =
+    { isDir = True
+    , mode = 777
+    , modTime = millisToPosix 0
+    , name = ""
+    , parentPath = ""
+    , satisfiesFilter = False
+    , size = 0
+    , status = Unselected
+    }
+
+
+extendSelectionToNext : List File -> List File
+extendSelectionToNext files =
+    let
+        ( isAtLeastOneFileSelected, updatedFiles ) =
+            extendSelection List.Extra.mapAccuml files
+    in
+    if isAtLeastOneFileSelected then
+        updatedFiles
+
+    else
+        updatedFiles
+            |> selectLast
+
+
+extendSelectionToPrevious : List File -> List File
+extendSelectionToPrevious files =
+    let
+        ( isAtLeastOneFileSelected, updatedFiles ) =
+            extendSelection List.Extra.mapAccumr files
+    in
+    if isAtLeastOneFileSelected then
+        updatedFiles
+
+    else
+        updatedFiles
+            |> selectLast
+
+
+fileDecoder : Decoder File
+fileDecoder =
+    Json.Decode.succeed File
+        |> required "IsDir" Json.Decode.bool
+        |> required "Mode" Json.Decode.int
+        |> required "ModTime" Iso8601.decoder
+        |> required "Name" Json.Decode.string
+        |> required "DirPath" Json.Decode.string
+        |> hardcoded False
+        |> required "Size" Json.Decode.int
+        |> hardcoded Unselected
+
+
+selectNext : List File -> List File
+selectNext files =
+    let
+        ( isAtLeastOneFileSelected, updatedFiles ) =
+            selectNextOrPrevious List.Extra.mapAccuml files
+    in
+    if isAtLeastOneFileSelected then
+        updatedFiles
+
+    else
+        updatedFiles
+            |> selectLast
+
+
+selectPrevious : List File -> List File
+selectPrevious files =
+    let
+        ( isAtLeastOneFileSelected, updatedFiles ) =
+            selectNextOrPrevious List.Extra.mapAccumr files
+    in
+    if isAtLeastOneFileSelected then
+        updatedFiles
+
+    else
+        updatedFiles
+            |> selectFirst
+
+
+
+{- selects files whose name have a high level of similarity -}
+
+
+selectSimilar : File -> Int -> List File -> List File
+selectSimilar referenceFile minSimilarity files =
+    List.map (selectIfSimilar referenceFile minSimilarity) files
+
+
+toggleSelectionStatus : File -> File
+toggleSelectionStatus file =
+    case file.status of
+        Unselected ->
+            { file | status = Selected }
+
+        Edited ->
+            { file | status = Selected }
+
+        Selected ->
+            { file | status = Unselected }
+
+        SelectedForDeletion ->
+            -- TODO  Remove from the list of files selected for deletion?
+            { file | status = Selected }
+
+
+withName : String -> File -> File
+withName name file =
+    { file | name = name }
+
+
+withParentPath : String -> File -> File
+withParentPath path file =
+    { file | parentPath = path }
+
+
+withStatus : FileStatus -> File -> File
+withStatus fileStatus file =
+    { file | status = fileStatus }
+
+
+extendSelection :
+    ((SelectionAccumulator -> File -> ( SelectionAccumulator, File )) -> SelectionAccumulator -> List File -> ( SelectionAccumulator, List File ))
+    -> List File
+    -> ( Bool, List File )
+extendSelection visit files =
+    let
+        ( finalAccumulator, updatedFiles ) =
+            visit
+                (\acc file ->
+                    let
+                        newAcc : SelectionAccumulator
+                        newAcc =
+                            { acc | isPreviousSelected = file.status == Selected }
+                    in
+                    if acc.isPreviousSelected then
+                        ( { newAcc | selectedCount = acc.selectedCount + 1 }
+                        , { file | status = Selected }
+                        )
+
+                    else
+                        ( newAcc, file )
+                )
+                initialAccumulator
+                files
+
+        initialAccumulator : SelectionAccumulator
+        initialAccumulator =
+            { isPreviousSelected = False
+            , selectedCount = 0
+            }
+
+        isAtLeastOneFileSelected : Bool
+        isAtLeastOneFileSelected =
+            finalAccumulator.selectedCount > 0
+    in
+    ( isAtLeastOneFileSelected, updatedFiles )
+
+
+selectFirst : List File -> List File
+selectFirst files =
+    List.Extra.updateAt 0 (\f -> { f | status = Selected }) files
+
+
+selectIfSimilar : File -> Int -> File -> File
+selectIfSimilar referenceFile minSimilarity file =
+    if
+        (file == referenceFile)
+            || isSimilarityLevelGreaterThan referenceFile.name file.name minSimilarity
+    then
+        { file | status = Selected }
+
+    else
+        { file | status = Unselected }
+
+
+selectLast : List File -> List File
+selectLast files =
+    List.Extra.updateAt (List.length files - 1) (\f -> { f | status = Selected }) files
+
+
+selectNextOrPrevious :
+    ((SelectionAccumulator -> File -> ( SelectionAccumulator, File )) -> SelectionAccumulator -> List File -> ( SelectionAccumulator, List File ))
+    -> List File
+    -> ( Bool, List File )
+selectNextOrPrevious visit files =
+    let
+        ( finalAccumulator, updatedFiles ) =
+            visit
+                (\acc file ->
+                    let
+                        newAcc : SelectionAccumulator
+                        newAcc =
+                            { acc | isPreviousSelected = file.status == Selected }
+                    in
+                    if acc.isPreviousSelected then
+                        ( { newAcc | selectedCount = acc.selectedCount + 1 }
+                        , { file | status = Selected }
+                        )
+
+                    else
+                        ( newAcc, { file | status = Unselected } )
+                )
+                initialAccumulator
+                files
+
+        initialAccumulator : SelectionAccumulator
+        initialAccumulator =
+            { isPreviousSelected = False
+            , selectedCount = 0
+            }
+
+        isAtLeastOneFileSelected : Bool
+        isAtLeastOneFileSelected =
+            finalAccumulator.selectedCount > 0
+    in
+    ( isAtLeastOneFileSelected, updatedFiles )
+
+
+type alias SelectionAccumulator =
+    { isPreviousSelected : Bool
+    , selectedCount : Int
+    }
diff --git a/src-elm/src/Main.elm b/src-elm/src/Main.elm
new file mode 100644
index 0000000..d33aa7e
--- /dev/null
+++ b/src-elm/src/Main.elm
@@ -0,0 +1,2619 @@
+port module Main exposing (Command, FocusedZone, Model, Msg, Operation, defaultModel, filterDestinationDirectories, main, pathElements, select, truncateConcatenatedNames, windowsPathSep)
+
+import Browser
+import Browser.Dom
+import File exposing (File, FileStatus(..), defaultDir, extendSelectionToNext, extendSelectionToPrevious, fileDecoder, selectNext, selectPrevious, selectSimilar, toggleSelectionStatus, withName, withParentPath, withStatus)
+import Filesize
+import Html exposing (Html, button, div, footer, form, h2, input, li, span, text, ul)
+import Html.Attributes exposing (class, disabled, id, placeholder, tabindex, type_, value)
+import Html.Events as Events exposing (onClick, onFocus, onInput, onSubmit)
+import Json.Decode exposing (list)
+import Json.Encode
+import Keyboard.Event exposing (KeyboardEvent, decodeKeyboardEvent)
+import Keyboard.Key as Key exposing (Key(..))
+import List.Extra
+import Pattern
+import Regex
+import SingleSlider
+import String.Mark as Mark exposing (defaultOptions, multiWord)
+import Task
+import Time exposing (Month(..))
+
+
+
+-- antislash is doubled for escaping
+
+
+port createDirectory : String -> Cmd msg
+
+
+port fileRemoved : (Json.Encode.Value -> msg) -> Sub msg
+
+
+port filesRenamed : (Json.Encode.Value -> msg) -> Sub msg
+
+
+port getCurrentDirectoryPath : () -> Cmd msg
+
+
+port getDestinationDirectoryFiles : String -> Cmd msg
+
+
+port getDestinationSubdirectories : String -> Cmd msg
+
+
+port getSourceDirectoryContent : String -> Cmd msg
+
+
+port moveFiles : ( List String, String ) -> Cmd msg
+
+
+port openFile : String -> Cmd msg
+
+
+port quit : () -> Cmd msg
+
+
+port receiveCreatedDirectory : (Json.Encode.Value -> msg) -> Sub msg
+
+
+port receiveCurrentDirectoryPath : (String -> msg) -> Sub msg
+
+
+port receiveDestinationDirectoryFiles : (Json.Encode.Value -> msg) -> Sub msg
+
+
+port receiveError : (String -> msg) -> Sub msg
+
+
+port receiveMovedFiles : (Json.Encode.Value -> msg) -> Sub msg
+
+
+port receiveSelectedDestinationDirectory : (String -> msg) -> Sub msg
+
+
+port receiveSelectedSourceDirectory : (String -> msg) -> Sub msg
+
+
+port receiveSourceDirectoryContent : (Json.Encode.Value -> msg) -> Sub msg
+
+
+port receiveSubDirectories : (Json.Encode.Value -> msg) -> Sub msg
+
+
+port removeFile : Json.Encode.Value -> Cmd msg
+
+
+port renameFiles : List Json.Encode.Value -> Cmd msg
+
+
+port selectDestinationDirectory : String -> Cmd msg
+
+
+port selectSourceDirectory : String -> Cmd msg
+
+
+type alias Command =
+    { operation : Operation
+    , files : List File -- the files / dirs affected by the operation
+    , destination : Maybe String -- destination dir if any FIXME this is a bad design; try to create specific commands instead
+    , source : Maybe String -- source dir if any FIXME this is a bad design; try to create specific commands instead
+    }
+
+
+type FocusedZone
+    = Confirmation
+    | ErrorMessage
+    | Filtering
+    | LeftSide
+    | FileNameEditor
+    | DirNameEditor
+    | RightSide
+    | SourceSearchReplace
+    | SimilarityLevel
+
+
+type alias Model =
+    { applySourceFilterToDestinationDirectories : Bool
+    , applySourceFilterToDestinationFiles : Bool
+    , debug : List String
+    , destinationDirectoryPath : String
+    , destinationDirectoryFilter : String
+    , destinationFiles : List File
+    , destinationFilesFilter : String
+    , destinationNavigationHistory : List String
+    , destinationSubdirectories : List File
+    , editedFile : Maybe File
+    , editedDirName : String
+    , editedFileName : String
+    , error : Maybe String
+    , filesToDelete : List File
+    , focusedZone : FocusedZone
+    , history : List (List Command)
+    , isCreatingDirectory : Bool
+    , isDebugVisible : Bool
+    , isDestinationLoadingInProgress : Bool
+    , isSourceLoadingInProgress : Bool
+    , isShiftPressed : Bool
+    , isControlPressed : Bool
+    , isUndoing : Bool
+    , previousFocusedZone : FocusedZone
+    , pathSeparator : String
+    , referenceFile : Maybe File -- for search by similarity of name
+    , minSimilarity : Int
+    , sourceDirectoryPath : String
+    , sourceFiles : List File
+    , sourceFilter : String
+    , sourceNavigationHistory : List String
+    , sourceReplace : String
+    , sourceSearch : String
+    , sourceSubDirectories : List File
+    , timezone : Time.Zone
+    }
+
+
+type Msg
+    = AdjustTimeZone Time.Zone
+    | BackendReturnedCreatedDirectory File
+    | BackendReturnedCurrentDirPath String
+    | BackendReturnedDestinationDirectories (List File)
+    | BackendReturnedDestinationDirectoryPath String
+    | BackendReturnedDestinationFiles (List File)
+    | BackendReturnedError String
+    | BackendReturnedMovedFiles (List File)
+    | BackendReturnedRemovedFile
+    | BackendReturnedRenamedFiles (List File) (List String)
+    | BackendReturnedSourceDirectoryContent (List File)
+    | BackendReturnedSourceDirectoryPath String
+    | NoOp
+    | UserChangedDestinationDirectoryFilter String
+    | UserChangedDestinationFilesFilter String
+    | UserChangedMaxDistance Float
+    | UserChangedSourceFilter String
+    | UserChangedSourceReplace String
+    | UserChangedSourceSearch String
+    | UserClickedCancel
+    | UserClickedCopyFilterButton
+    | UserClickedClearSourceFilter
+    | UserClickedClearDestinationDirectoryFilter
+    | UserClickedClearDestinationFilesFilter
+    | UserClickedCloseError
+    | UserClickedDelete
+    | UserClickedDestinationDirectory Bool File -- isAbsolute,  destination
+    | UserClickedDestinationDirectoryButton
+    | UserClickedDestinationFile File
+    | UserClickedReload Target
+    | UserClickedReplaceButton
+    | UserClickedSourceDirectory Bool File -- isAbsolute, source
+    | UserClickedSourceDirectoryButton
+    | UserClickedSourceFile File
+    | UserChangedFocusedZone FocusedZone
+    | UserModifiedFileName String
+    | UserModifiedDirName String
+    | UserPressedKey Target KeyboardEvent
+    | UserPressedOrReleasedKey KeyboardEvent
+    | UserSubmittedDirName
+    | UserSubmittedFilename
+
+
+type Operation
+    = Move
+    | Rename
+
+
+defaultModel : Model
+defaultModel =
+    { applySourceFilterToDestinationDirectories = False
+    , applySourceFilterToDestinationFiles = False
+    , debug = []
+    , destinationDirectoryPath = ""
+    , destinationDirectoryFilter = ""
+    , destinationFiles = []
+    , destinationFilesFilter = ""
+    , destinationNavigationHistory = []
+    , destinationSubdirectories = []
+    , editedFile = Nothing
+    , editedDirName = ""
+    , editedFileName = ""
+    , error = Nothing
+    , filesToDelete = []
+    , focusedZone = LeftSide
+    , history = []
+    , isCreatingDirectory = False
+    , isDebugVisible = False
+    , isShiftPressed = False
+    , isControlPressed = False
+    , isDestinationLoadingInProgress = True
+    , isSourceLoadingInProgress = True
+    , isUndoing = False
+    , previousFocusedZone = LeftSide
+    , pathSeparator = unixPathSep
+    , referenceFile = Nothing
+    , minSimilarity = 8
+    , sourceDirectoryPath = "."
+    , sourceFiles = []
+    , sourceFilter = ""
+    , sourceNavigationHistory = []
+    , sourceReplace = ""
+    , sourceSearch = ""
+    , sourceSubDirectories = []
+    , timezone = Time.utc
+    }
+
+
+filterDestinationDirectories : Model -> Model
+filterDestinationDirectories model =
+    let
+        words : List String
+        words =
+            String.words model.destinationDirectoryFilter
+    in
+    case words of
+        [] ->
+            { model
+                | destinationSubdirectories =
+                    List.map (\f -> { f | satisfiesFilter = True })
+                        model.destinationSubdirectories
+            }
+
+        _ ->
+            { model
+                | destinationSubdirectories =
+                    List.map (\f -> { f | satisfiesFilter = filterByName words f || filterByParentPath words f })
+                        model.destinationSubdirectories
+            }
+
+
+main : Program () Model Msg
+main =
+    Browser.element
+        { init = init
+        , subscriptions = subscriptions
+        , update = update
+        , view = view
+        }
+
+
+
+-- MODEL
+
+
+pathElements : Model -> List File -> String -> List File
+pathElements model acc path =
+    if path == "." then
+        []
+
+    else
+        pathElementsRecursive model acc path
+            |> List.reverse
+
+
+select : Model -> List File -> File -> List File
+select model files clickedFile =
+    if model.isShiftPressed then
+        let
+            indexOfClickedElement : Int
+            indexOfClickedElement =
+                List.Extra.elemIndex clickedFile files
+                    |> Maybe.withDefault 0
+
+            indexOfFirstSelectedElement : Int
+            indexOfFirstSelectedElement =
+                selectedItemsIndices
+                    |> List.minimum
+                    |> Maybe.withDefault 0
+
+            indexOfLastSelectedElement : Int
+            indexOfLastSelectedElement =
+                selectedItemsIndices
+                    |> List.maximum
+                    |> Maybe.withDefault 0
+
+            selectedItemsIndices : List Int
+            selectedItemsIndices =
+                List.Extra.findIndices (\f -> f.status == Selected) files
+        in
+        files
+            |> List.Extra.updateIfIndex
+                (\index ->
+                    let
+                        isInRangeBetweenClickedFileAndLastSelectedFile : Bool
+                        isInRangeBetweenClickedFileAndLastSelectedFile =
+                            indexOfClickedElement
+                                < indexOfLastSelectedElement
+                                && index
+                                >= indexOfClickedElement
+                                && index
+                                <= indexOfLastSelectedElement
+
+                        isInRangeBetweenFirstSelectedFileAndClickedFile : Bool
+                        isInRangeBetweenFirstSelectedFileAndClickedFile =
+                            indexOfClickedElement > indexOfFirstSelectedElement && index >= indexOfFirstSelectedElement && index <= indexOfClickedElement
+                    in
+                    isInRangeBetweenFirstSelectedFileAndClickedFile
+                        || (not isInRangeBetweenFirstSelectedFileAndClickedFile && isInRangeBetweenClickedFileAndLastSelectedFile)
+                )
+                (\f ->
+                    if f.satisfiesFilter then
+                        { f | status = Selected }
+
+                    else
+                        f
+                )
+
+    else
+        files
+            |> List.map
+                (\f ->
+                    if f == clickedFile then
+                        toggleSelectionStatus f
+
+                    else if model.isControlPressed then
+                        f
+
+                    else
+                        f |> withStatus Unselected
+                )
+
+
+truncateConcatenatedNames : Int -> List File -> List File
+truncateConcatenatedNames maxLength elements =
+    let
+        currentLength : List File -> Int
+        currentLength acc =
+            acc
+                |> List.map (.name >> String.length)
+                |> List.sum
+    in
+    elements
+        |> List.reverse
+        |> List.foldl
+            (\element acc ->
+                if currentLength acc + String.length element.name <= maxLength then
+                    element :: acc
+
+                else
+                    acc
+            )
+            []
+
+
+
+-- UPDATE
+
+
+windowsPathSep : String
+windowsPathSep =
+    "\\"
+
+
+additionalHeaderClass : Model -> FocusedZone -> String
+additionalHeaderClass model zone =
+    if model.focusedZone == zone then
+        " focused"
+
+    else
+        " unfocused"
+
+
+applyRenaming : Model -> List Renaming -> Cmd Msg
+applyRenaming model renamings =
+    let
+        encodedRenamings : List Json.Encode.Value
+        encodedRenamings =
+            renamings
+                |> List.map
+                    (\renaming ->
+                        Json.Encode.object
+                            [ ( "oldName"
+                              , renaming.file.parentPath
+                                    ++ model.pathSeparator
+                                    ++ renaming.originalPath
+                                    |> Json.Encode.string
+                              )
+                            , ( "newName"
+                              , renaming.file.parentPath
+                                    ++ model.pathSeparator
+                                    ++ renaming.file.name
+                                    |> Json.Encode.string
+                              )
+                            ]
+                    )
+    in
+    renameFiles encodedRenamings
+
+
+changeAllFileStatus : Model -> Target -> FileStatus -> ( Model, Cmd Msg )
+changeAllFileStatus model target status =
+    case target of
+        Source ->
+            let
+                updatedFiles : List File
+                updatedFiles =
+                    model.sourceFiles
+                        |> List.map
+                            (\f ->
+                                if f.satisfiesFilter then
+                                    { f | status = status }
+
+                                else
+                                    f
+                            )
+            in
+            ( { model
+                | sourceFiles = updatedFiles
+              }
+                |> filterSourceFiles
+            , Cmd.none
+            )
+
+        Destination ->
+            let
+                updatedFiles : List File
+                updatedFiles =
+                    model.destinationFiles
+                        |> List.map
+                            (\f -> { f | status = status })
+            in
+            ( { model
+                | destinationFiles = updatedFiles
+              }
+            , Cmd.none
+            )
+
+
+changeDestinationDirectory : String -> Model -> Model
+changeDestinationDirectory path model =
+    { model
+        | destinationDirectoryPath = path
+        , destinationNavigationHistory = model.destinationDirectoryPath :: model.destinationNavigationHistory
+        , isDestinationLoadingInProgress = True
+        , isSourceLoadingInProgress = True
+    }
+
+
+changeSourceDirectory : String -> Model -> Model
+changeSourceDirectory path model =
+    { model
+        | sourceDirectoryPath = path
+        , sourceNavigationHistory = model.sourceDirectoryPath :: model.sourceNavigationHistory
+        , isSourceLoadingInProgress = True
+    }
+
+
+changeStatusOfDestinationFiles : FileStatus -> FileStatus -> Model -> Model
+changeStatusOfDestinationFiles fromStatus toStatus model =
+    { model
+        | destinationFiles =
+            List.map
+                (\file ->
+                    if file.status == fromStatus then
+                        { file | status = toStatus }
+
+                    else
+                        file
+                )
+                model.destinationFiles
+    }
+
+
+changeStatusOfSourceFiles : FileStatus -> FileStatus -> Model -> Model
+changeStatusOfSourceFiles fromStatus toStatus model =
+    { model
+        | sourceFiles =
+            List.map
+                (\file ->
+                    if file.satisfiesFilter && file.status == fromStatus then
+                        { file | status = toStatus }
+
+                    else
+                        file
+                )
+                model.sourceFiles
+    }
+        |> filterSourceFiles
+
+
+createNewDirectory : Model -> ( Model, Cmd Msg )
+createNewDirectory model =
+    let
+        dirPath : String
+        dirPath =
+            model.destinationDirectoryPath
+                ++ model.pathSeparator
+                ++ model.editedDirName
+    in
+    ( model, createDirectory dirPath )
+
+
+decodeFile : (File -> Msg) -> Json.Encode.Value -> Msg
+decodeFile msg value =
+    let
+        decodedFile : Result Json.Decode.Error File
+        decodedFile =
+            Json.Decode.decodeValue fileDecoder value
+    in
+    case decodedFile of
+        Ok file ->
+            msg file
+
+        Err error ->
+            BackendReturnedError (Json.Decode.errorToString error)
+
+
+decodeFileList : (List File -> Msg) -> Json.Encode.Value -> Msg
+decodeFileList msg value =
+    let
+        decodedFiles : Result Json.Decode.Error (List File)
+        decodedFiles =
+            Json.Decode.decodeValue (list fileDecoder) value
+    in
+    case decodedFiles of
+        Ok fileList ->
+            msg fileList
+
+        Err error ->
+            BackendReturnedError (Json.Decode.errorToString error)
+
+
+decodeFileWithPreviousName : Msg -> Json.Encode.Value -> Msg
+decodeFileWithPreviousName msg value =
+    let
+        decodedFile : Result Json.Decode.Error File
+        decodedFile =
+            Json.Decode.decodeValue fileDecoder value
+    in
+    case decodedFile of
+        Ok _ ->
+            msg
+
+        Err error ->
+            BackendReturnedError (Json.Decode.errorToString error)
+
+
+decodeRenamingList : (List File -> List String -> Msg) -> Json.Encode.Value -> Msg
+decodeRenamingList msg value =
+    let
+        decodedFiles : Result Json.Decode.Error (List File)
+        decodedFiles =
+            Json.Decode.decodeValue (list fileDecoder) value
+
+        decodedOriginalPaths : Result Json.Decode.Error (List String)
+        decodedOriginalPaths =
+            Json.Decode.decodeValue (list <| Json.Decode.field "PreviousName" Json.Decode.string) value
+    in
+    case ( decodedFiles, decodedOriginalPaths ) of
+        ( Ok fileList, Ok originalPaths ) ->
+            msg fileList originalPaths
+
+        ( Err error, _ ) ->
+            BackendReturnedError (Json.Decode.errorToString error)
+
+        ( _, Err error ) ->
+            BackendReturnedError (Json.Decode.errorToString error)
+
+
+fileCount : Model -> Target -> String
+fileCount model target =
+    let
+        filteredCount : Int
+        filteredCount =
+            List.Extra.count .satisfiesFilter <|
+                case target of
+                    Source ->
+                        model.sourceFiles
+
+                    Destination ->
+                        model.destinationFiles
+
+        totalCount : Int
+        totalCount =
+            case target of
+                Source ->
+                    List.length model.sourceFiles
+
+                Destination ->
+                    List.length model.destinationFiles
+    in
+    if filteredCount == totalCount then
+        String.fromInt filteredCount
+            ++ inflect totalCount
+            ++ " in directory"
+
+    else
+        String.fromInt filteredCount
+            ++ " (on a total of "
+            ++ String.fromInt totalCount
+            ++ ")"
+            ++ inflect totalCount
+            ++ " in directory"
+
+
+filterByName : List String -> File -> Bool
+filterByName filters file =
+    if file.name == ".." then
+        True
+
+    else
+        let
+            lowerCaseFilename : String
+            lowerCaseFilename =
+                String.toLower file.name
+        in
+        List.all (\word -> String.contains (String.toLower word) lowerCaseFilename) filters
+
+
+
+{- navigate t o the previous dir in history -}
+
+
+filterByParentPath : List String -> File -> Bool
+filterByParentPath filters file =
+    if file.name == ".." then
+        True
+
+    else
+        let
+            lowerCaseParentPath : String
+            lowerCaseParentPath =
+                String.toLower file.parentPath
+        in
+        List.all (\word -> String.contains (String.toLower word) lowerCaseParentPath) filters
+
+
+filterDestinationFiles : Model -> Model
+filterDestinationFiles model =
+    let
+        words : List String
+        words =
+            String.words model.destinationFilesFilter
+    in
+    case words of
+        [] ->
+            { model
+                | destinationFiles = List.map (\f -> { f | satisfiesFilter = True }) model.destinationFiles
+            }
+
+        _ ->
+            { model
+                | destinationFiles =
+                    List.map (\f -> { f | satisfiesFilter = filterByName words f }) model.destinationFiles
+            }
+
+
+
+-- TODO allow renaming destination files
+
+
+filterSelectedFiles : List File -> List File
+filterSelectedFiles files =
+    List.filter (\f -> f.satisfiesFilter && f.status == Selected) files
+
+
+filterSourceFiles : Model -> Model
+filterSourceFiles model =
+    let
+        words : List String
+        words =
+            String.words model.sourceFilter
+    in
+    case words of
+        [] ->
+            { model
+                | sourceFiles = List.map (\f -> { f | satisfiesFilter = True }) model.sourceFiles
+            }
+
+        _ ->
+            { model
+                | sourceFiles =
+                    List.map (\f -> { f | satisfiesFilter = filterByName words f }) model.sourceFiles
+            }
+
+
+{-| Sets focus on an HTML element, then sends a msg when done (even if the element is not found)
+-}
+focusOn : String -> msg -> Cmd msg
+focusOn elementId msg =
+    Browser.Dom.focus elementId |> Task.attempt (\_ -> msg)
+
+
+goBack : Model -> Target -> ( Model, Cmd Msg )
+goBack model target =
+    case target of
+        Source ->
+            let
+                previousDir : String
+                previousDir =
+                    model.sourceNavigationHistory
+                        |> List.head
+                        |> Maybe.withDefault ""
+            in
+            if String.isEmpty previousDir then
+                ( model, Cmd.none )
+
+            else
+                let
+                    history : List String
+                    history =
+                        model.sourceNavigationHistory
+                            |> List.drop 1
+                in
+                ( { model | sourceDirectoryPath = previousDir, sourceNavigationHistory = history }
+                , getSourceDirectoryContent previousDir
+                )
+
+        Destination ->
+            let
+                previousDir : String
+                previousDir =
+                    model.destinationNavigationHistory
+                        |> List.head
+                        |> Maybe.withDefault ""
+            in
+            if String.isEmpty previousDir then
+                ( model, Cmd.none )
+
+            else
+                let
+                    history : List String
+                    history =
+                        model.destinationNavigationHistory
+                            |> List.drop 1
+                in
+                ( { model | destinationDirectoryPath = previousDir, destinationNavigationHistory = history }
+                , Cmd.batch
+                    [ getDestinationSubdirectories previousDir
+                    , getDestinationDirectoryFiles previousDir
+                    ]
+                )
+
+
+highlight : String -> String -> List (Html Msg)
+highlight =
+    Mark.markWith { defaultOptions | whitespace = multiWord, minTermLength = 1 }
+
+
+inflect : Int -> String
+inflect count =
+    if count > 1 then
+        " files"
+
+    else
+        " file"
+
+
+init : () -> ( Model, Cmd Msg )
+init _ =
+    ( defaultModel
+    , Cmd.batch
+        [ Task.perform AdjustTimeZone Time.here
+        , getCurrentDirectoryPath ()
+        ]
+    )
+
+
+isFileNotFoundError : Model -> Target -> String -> Bool
+isFileNotFoundError model target errorMsg =
+    let
+        dir : String
+        dir =
+            case target of
+                Source ->
+                    model.sourceDirectoryPath
+
+                Destination ->
+                    model.destinationDirectoryPath
+    in
+    errorMsg == "open " ++ dir ++ ": no such file or directory"
+
+
+keyDecoder : Json.Decode.Decoder Msg
+keyDecoder =
+    decodeKeyboardEvent
+        |> Json.Decode.map
+            (\key ->
+                UserPressedOrReleasedKey key
+            )
+
+
+keyDecoderPreventingDefault : Target -> Json.Decode.Decoder ( Msg, Bool )
+keyDecoderPreventingDefault target =
+    decodeKeyboardEvent
+        |> Json.Decode.map
+            (\key ->
+                ( UserPressedKey target key, True )
+            )
+
+
+matches : Model -> String -> String
+matches model string =
+    let
+        maybeRegex : Maybe Regex.Regex
+        maybeRegex =
+            Pattern.fromString model.sourceSearch
+                |> Pattern.toRegexp
+    in
+    case maybeRegex of
+        Just regex ->
+            Regex.find regex string
+                |> List.map .match
+                |> String.join " "
+
+        Nothing ->
+            ""
+
+
+maxVisibleCharactersInPaths : Int
+maxVisibleCharactersInPaths =
+    50
+
+
+moveSelectedFiles : Model -> ( Model, Cmd Msg )
+moveSelectedFiles model =
+    let
+        ( filesToMove, destination ) =
+            case model.focusedZone of
+                RightSide ->
+                    ( model.destinationFiles
+                        |> List.filter (\f -> f.status == Selected)
+                        |> List.map (\file -> file.parentPath ++ model.pathSeparator ++ file.name)
+                    , model.sourceDirectoryPath
+                    )
+
+                _ ->
+                    ( model.sourceFiles
+                        |> filterSelectedFiles
+                        |> List.map (\file -> file.parentPath ++ model.pathSeparator ++ file.name)
+                    , model.destinationDirectoryPath
+                    )
+    in
+    ( model
+    , moveFiles ( filesToMove, destination )
+    )
+
+
+nameReplacement : Model -> File -> Maybe Renaming
+nameReplacement model file =
+    let
+        newName : String
+        newName =
+            replace model file.name
+    in
+    if file.satisfiesFilter && (newName /= file.name) then
+        Just
+            { file = { file | name = newName }
+
+            -- TODO prepend with the source dir?
+            , originalPath = file.name
+            }
+
+    else
+        Nothing
+
+
+openSelectedFile : Model -> Target -> ( Model, Cmd Msg )
+openSelectedFile model target =
+    let
+        fileToOpen : Maybe File
+        fileToOpen =
+            case target of
+                Source ->
+                    model.sourceFiles
+                        |> List.Extra.find (\f -> f.satisfiesFilter && f.status == Selected)
+
+                Destination ->
+                    model.destinationFiles
+                        |> List.Extra.find (\f -> f.status == Selected)
+    in
+    case fileToOpen of
+        Just file ->
+            ( model, openFile <| file.parentPath ++ model.pathSeparator ++ file.name )
+
+        Nothing ->
+            ( model, Cmd.none )
+
+
+openSelectedFolder : Model -> Target -> ( Model, Cmd Msg )
+openSelectedFolder model target =
+    let
+        folderToOpen : String
+        folderToOpen =
+            case target of
+                Source ->
+                    model.sourceDirectoryPath
+
+                Destination ->
+                    model.destinationDirectoryPath
+    in
+    ( model, openFile folderToOpen )
+
+
+parentDir : Model -> String -> String
+parentDir model path =
+    let
+        index : Int
+        index =
+            String.indexes model.pathSeparator path
+                |> List.Extra.last
+                |> Maybe.withDefault (String.length path)
+    in
+    String.slice 0 index path
+
+
+pathElementsRecursive : Model -> List File -> String -> List File
+pathElementsRecursive model acc path =
+    let
+        endIndex : Int
+        endIndex =
+            String.length path
+
+        file : File
+        file =
+            defaultDir
+                |> withName leaf
+                |> withParentPath parentPath
+
+        lastPartIndex : Int
+        lastPartIndex =
+            1
+                + (String.indexes model.pathSeparator path
+                    |> List.maximum
+                    |> Maybe.withDefault endIndex
+                  )
+
+        leaf : String
+        leaf =
+            String.slice lastPartIndex endIndex path
+
+        parentIsRootDir : Bool
+        parentIsRootDir =
+            -- Windows path starts by a drive letter follower by column (like "C:")
+            (model.pathSeparator == unixPathSep)
+                && (String.length parentPath == 0)
+                || (model.pathSeparator == windowsPathSep)
+                && (String.length parentPath == 2)
+
+        parentPath : String
+        parentPath =
+            parentDir model path
+    in
+    if parentIsRootDir then
+        case parentPath of
+            "" ->
+                { file | parentPath = unixPathSep } :: acc
+
+            _ ->
+                file :: acc
+
+    else
+        file
+            :: pathElementsRecursive model acc parentPath
+
+
+prepareSelectedFilesForRemoval : Model -> ( Model, Cmd Msg )
+prepareSelectedFilesForRemoval model =
+    case model.focusedZone of
+        LeftSide ->
+            ( { model
+                | filesToDelete = filterSelectedFiles model.sourceFiles
+                , focusedZone = Confirmation
+                , previousFocusedZone = model.focusedZone
+              }
+                |> changeStatusOfSourceFiles Selected SelectedForDeletion
+            , focusOn "delete-button" NoOp
+            )
+
+        RightSide ->
+            ( { model
+                | filesToDelete =
+                    model.destinationFiles
+                        |> List.filter (\f -> f.status == Selected)
+                , focusedZone = Confirmation
+                , previousFocusedZone = model.focusedZone
+              }
+                |> changeStatusOfDestinationFiles Selected SelectedForDeletion
+            , focusOn "delete-button" NoOp
+            )
+
+        _ ->
+            ( model, Cmd.none )
+
+
+processConfirmationShortcuts : Model -> KeyboardEvent -> ( Model, Cmd Msg )
+processConfirmationShortcuts model event =
+    case ( event.keyCode, event.ctrlKey, event.metaKey ) of
+        ( Key.Escape, False, False ) ->
+            ( { model | filesToDelete = [], focusedZone = LeftSide }
+                |> unmarkFilesForDeletion
+            , focusOn "container-left" NoOp
+            )
+
+        ( Key.Enter, False, False ) ->
+            removeSelectedFiles model
+
+        _ ->
+            ( model, Cmd.none )
+
+
+processKeyboardShortcut : Model -> Target -> KeyboardEvent -> ( Model, Cmd Msg )
+processKeyboardShortcut model target event =
+    case model.focusedZone of
+        Confirmation ->
+            processConfirmationShortcuts model event
+
+        LeftSide ->
+            processMainShortcuts model target event
+
+        FileNameEditor ->
+            case event.keyCode of
+                Key.Escape ->
+                    let
+                        sourceDirectoryFiles : List File
+                        sourceDirectoryFiles =
+                            model.sourceFiles
+                                |> List.Extra.updateIf (\f -> f.status == Edited) (\f -> { f | status = Selected })
+                    in
+                    { model
+                        | editedFile = Nothing
+                        , editedFileName = ""
+                        , sourceFiles = sourceDirectoryFiles
+                    }
+                        |> restoreFocus
+
+                _ ->
+                    ( model, Cmd.none )
+
+        DirNameEditor ->
+            case event.keyCode of
+                Key.Escape ->
+                    { model | editedDirName = "", isCreatingDirectory = False }
+                        |> restoreFocus
+
+                _ ->
+                    ( model, Cmd.none )
+
+        RightSide ->
+            processMainShortcuts model target event
+
+        _ ->
+            ( model, Cmd.none )
+
+
+processMainShortcuts : Model -> Target -> KeyboardEvent -> ( Model, Cmd Msg )
+processMainShortcuts model target event =
+    if event.ctrlKey || event.metaKey then
+        case ( event.keyCode, event.shiftKey ) of
+            ( Key.A, True ) ->
+                changeAllFileStatus model target Unselected
+
+            ( Key.A, False ) ->
+                changeAllFileStatus model target Selected
+
+            ( Key.R, False ) ->
+                reload model target
+
+            ( Key.Z, False ) ->
+                undo model
+
+            ( Key.Backspace, False ) ->
+                prepareSelectedFilesForRemoval model
+
+            _ ->
+                ( model, Cmd.none )
+
+    else if event.altKey then
+        case event.keyCode of
+            Key.F4 ->
+                ( model, quit () )
+
+            _ ->
+                ( model, Cmd.none )
+
+    else
+        case ( event.keyCode, event.shiftKey ) of
+            ( Key.D, False ) ->
+                ( { model | isDebugVisible = not model.isDebugVisible }, Cmd.none )
+
+            ( Key.F, False ) ->
+                openSelectedFolder model target
+
+            ( Key.M, False ) ->
+                moveSelectedFiles model
+
+            ( Key.N, False ) ->
+                showDirNameEditor model target
+
+            ( Key.O, False ) ->
+                openSelectedFile model target
+
+            ( Key.R, False ) ->
+                renameSelectedSourceFile model
+
+            ( Key.U, False ) ->
+                undo model
+
+            ( Key.W, False ) ->
+                let
+                    files =
+                        case target of
+                            Source ->
+                                model.sourceFiles
+
+                            Destination ->
+                                model.destinationFiles
+
+                    firstSelectedFile : Maybe File
+                    firstSelectedFile =
+                        List.Extra.find (\f -> f.status == Selected) files
+                in
+                selectSimilarFiles { model | referenceFile = firstSelectedFile } target
+
+            ( Key.Left, _ ) ->
+                goBack model target
+
+            ( Key.Up, True ) ->
+                case target of
+                    Source ->
+                        ( { model | sourceFiles = extendSelectionToPrevious model.sourceFiles }, Cmd.none )
+
+                    Destination ->
+                        ( { model | destinationFiles = extendSelectionToPrevious model.destinationFiles }, Cmd.none )
+
+            ( Key.Up, False ) ->
+                case target of
+                    Source ->
+                        ( { model | sourceFiles = selectPrevious model.sourceFiles }, Cmd.none )
+
+                    Destination ->
+                        ( { model | destinationFiles = selectPrevious model.destinationFiles }, Cmd.none )
+
+            ( Key.Down, True ) ->
+                case target of
+                    Source ->
+                        ( { model | sourceFiles = extendSelectionToNext model.sourceFiles }, Cmd.none )
+
+                    Destination ->
+                        ( { model | destinationFiles = extendSelectionToNext model.destinationFiles }, Cmd.none )
+
+            ( Key.Down, False ) ->
+                case target of
+                    Source ->
+                        ( { model | sourceFiles = selectNext model.sourceFiles }, Cmd.none )
+
+                    Destination ->
+                        ( { model | destinationFiles = selectNext model.destinationFiles }, Cmd.none )
+
+            ( Key.Delete, False ) ->
+                prepareSelectedFilesForRemoval model
+
+            ( Key.Add, _ ) ->
+                ( { model | minSimilarity = min (model.minSimilarity + 1) maxSimilarity }, Cmd.none )
+
+            ( Key.Subtract, _ ) ->
+                ( { model | minSimilarity = max (model.minSimilarity + 1) 0 }, Cmd.none )
+
+            ( Key.F2, False ) ->
+                renameSelectedSourceFile model
+
+            ( Key.F5, False ) ->
+                reload model target
+
+            ( Key.Unknown _, _ ) ->
+                case event.key of
+                    Just "+" ->
+                        ( { model | minSimilarity = min (model.minSimilarity + 1) maxSimilarity }, Cmd.none )
+
+                    Just "-" ->
+                        ( { model | minSimilarity = max (model.minSimilarity - 1) 0 }, Cmd.none )
+
+                    _ ->
+                        ( model, Cmd.none )
+
+            _ ->
+                ( model, Cmd.none )
+
+
+reload : Model -> Target -> ( Model, Cmd Msg )
+reload model target =
+    case target of
+        Source ->
+            ( model
+            , getSourceDirectoryContent model.sourceDirectoryPath
+            )
+
+        Destination ->
+            ( model
+            , Cmd.batch
+                [ getDestinationSubdirectories model.destinationDirectoryPath
+                , getDestinationDirectoryFiles model.destinationDirectoryPath
+                ]
+            )
+
+
+removeSelectedFiles : Model -> ( Model, Cmd Msg )
+removeSelectedFiles model =
+    let
+        commands : List (Cmd msg)
+        commands =
+            model.filesToDelete
+                |> List.map
+                    (\file ->
+                        removeFile <|
+                            Json.Encode.string <|
+                                file.parentPath
+                                    ++ model.pathSeparator
+                                    ++ file.name
+                    )
+    in
+    ( { model
+        | filesToDelete = []
+        , focusedZone = LeftSide
+      }
+    , Cmd.batch
+        (focusOn "container-left" NoOp :: commands)
+    )
+
+
+
+-- SUBSCRIPTIONS
+
+
+renameSelectedSourceFile : Model -> ( Model, Cmd Msg )
+renameSelectedSourceFile model =
+    let
+        fileToEdit : Maybe File
+        fileToEdit =
+            model.sourceFiles
+                |> List.Extra.find (\f -> f.satisfiesFilter && f.status == Selected)
+    in
+    case fileToEdit of
+        Just file ->
+            let
+                sourceDirectoryFiles : List File
+                sourceDirectoryFiles =
+                    model.sourceFiles
+                        |> List.Extra.updateIf (\f -> f == file) (\f -> { f | status = Edited })
+            in
+            ( { model
+                | editedFile = Just file
+                , editedFileName = file.name
+                , sourceFiles = sourceDirectoryFiles
+              }
+            , focusOn "filename-input" NoOp
+            )
+
+        Nothing ->
+            ( model, Cmd.none )
+
+
+type alias Renaming =
+    { file : File
+    , originalPath : String
+    }
+
+
+replace : Model -> String -> String
+replace model originalString =
+    let
+        maybeRegex : Maybe Regex.Regex
+        maybeRegex =
+            Pattern.fromString model.sourceSearch
+                |> Pattern.toRegexp
+    in
+    case maybeRegex of
+        Just regex ->
+            Regex.replace regex (\_ -> model.sourceReplace) originalString
+
+        Nothing ->
+            originalString
+
+
+restoreFocus : Model -> ( Model, Cmd Msg )
+restoreFocus model =
+    ( { model | focusedZone = model.previousFocusedZone }
+    , focusOn
+        (case model.previousFocusedZone of
+            Confirmation ->
+                "delete-button"
+
+            ErrorMessage ->
+                "close-error"
+
+            Filtering ->
+                -- TODO handle filtering right
+                "filtering-left"
+
+            LeftSide ->
+                "container-left"
+
+            FileNameEditor ->
+                "filename-input"
+
+            DirNameEditor ->
+                "dirname-input"
+
+            RightSide ->
+                "container-right"
+
+            SimilarityLevel ->
+                "similarity-level"
+
+            SourceSearchReplace ->
+                "search-left"
+        )
+        NoOp
+    )
+
+
+selectSimilarFiles : Model -> Target -> ( Model, Cmd Msg )
+selectSimilarFiles model target =
+    case ( model.referenceFile, target ) of
+        ( Just file, Source ) ->
+            ( { model | sourceFiles = selectSimilar file model.minSimilarity model.sourceFiles }, Cmd.none )
+
+        ( Just file, Destination ) ->
+            ( { model | destinationFiles = selectSimilar file model.minSimilarity model.destinationFiles }, Cmd.none )
+
+        ( Nothing, _ ) ->
+            ( model, Cmd.none )
+
+
+
+-- VIEW
+
+
+showDirNameEditor : Model -> Target -> ( Model, Cmd Msg )
+showDirNameEditor model target =
+    case target of
+        Source ->
+            ( model, Cmd.none )
+
+        Destination ->
+            ( { model
+                | isCreatingDirectory = True
+              }
+            , focusOn "dirname-input" NoOp
+            )
+
+
+simpleKeyDecoder : Target -> Json.Decode.Decoder Msg
+simpleKeyDecoder target =
+    decodeKeyboardEvent
+        |> Json.Decode.map
+            (\key ->
+                UserPressedKey target key
+            )
+
+
+sortByName : List { a | name : String } -> List { a | name : String }
+sortByName =
+    List.sortBy (.name >> String.toLower)
+
+
+subscriptions : Model -> Sub Msg
+subscriptions _ =
+    Sub.batch
+        [ fileRemoved (decodeFileWithPreviousName BackendReturnedRemovedFile)
+        , filesRenamed (decodeRenamingList BackendReturnedRenamedFiles)
+        , receiveCreatedDirectory (decodeFile BackendReturnedCreatedDirectory)
+        , receiveCurrentDirectoryPath BackendReturnedCurrentDirPath
+        , receiveSourceDirectoryContent (decodeFileList BackendReturnedSourceDirectoryContent)
+        , receiveDestinationDirectoryFiles (decodeFileList BackendReturnedDestinationFiles)
+        , receiveError BackendReturnedError
+        , receiveMovedFiles (decodeFileList BackendReturnedMovedFiles)
+        , receiveSelectedDestinationDirectory BackendReturnedDestinationDirectoryPath
+        , receiveSelectedSourceDirectory BackendReturnedSourceDirectoryPath
+        , receiveSubDirectories (decodeFileList BackendReturnedDestinationDirectories)
+        ]
+
+
+type Target
+    = Source
+    | Destination
+
+
+undo : Model -> ( Model, Cmd Msg )
+undo model =
+    case List.head model.history of
+        Just commands ->
+            let
+                ( updatedModel, cmds ) =
+                    List.foldl
+                        (\command ( modelAcc, cmdAcc ) ->
+                            case command.operation of
+                                Move ->
+                                    undoMove modelAcc cmdAcc command
+
+                                Rename ->
+                                    undoRenaming modelAcc cmdAcc command
+                        )
+                        ( model, [] )
+                        commands
+            in
+            ( { updatedModel
+                | history = List.drop 1 model.history
+              }
+            , Cmd.batch cmds
+            )
+
+        Nothing ->
+            ( model, Cmd.none )
+
+
+undoMove : Model -> List (Cmd Msg) -> Command -> ( Model, List (Cmd Msg) )
+undoMove model cmds command =
+    let
+        destination : String
+        destination =
+            command.source
+                |> Maybe.withDefault ""
+
+        filesToMove : List String
+        filesToMove =
+            command.files
+                |> List.map (\f -> source ++ model.pathSeparator ++ f.name)
+
+        source : String
+        source =
+            command.destination
+                |> Maybe.withDefault ""
+    in
+    ( { model | isUndoing = True }
+    , moveFiles ( filesToMove, destination ) :: cmds
+    )
+
+
+undoRenaming : Model -> List (Cmd Msg) -> Command -> ( Model, List (Cmd Msg) )
+undoRenaming model cmds command =
+    let
+        encodedValue : Json.Encode.Value
+        encodedValue =
+            Json.Encode.object
+                [ ( "oldName", Json.Encode.string oldName )
+                , ( "newName", Json.Encode.string newName )
+                ]
+
+        newName : String
+        newName =
+            command.source |> Maybe.withDefault ""
+
+        oldName : String
+        oldName =
+            command.destination |> Maybe.withDefault ""
+    in
+    ( { model
+        | isUndoing = True
+      }
+    , renameFiles [ encodedValue ] :: cmds
+    )
+
+
+unixPathSep : String
+unixPathSep =
+    "/"
+
+
+unmarkFilesForDeletion : Model -> Model
+unmarkFilesForDeletion model =
+    model
+        |> changeStatusOfDestinationFiles SelectedForDeletion Selected
+        |> changeStatusOfSourceFiles SelectedForDeletion Selected
+
+
+update : Msg -> Model -> ( Model, Cmd Msg )
+update msg mymodel =
+    let
+        model =
+            { mymodel | debug = Debug.toString msg :: mymodel.debug |> List.take 9 }
+    in
+    case msg of
+        AdjustTimeZone newZone ->
+            ( { model | timezone = newZone }
+            , Cmd.none
+            )
+
+        BackendReturnedCreatedDirectory dir ->
+            let
+                newDirPath : String
+                newDirPath =
+                    model.destinationDirectoryPath ++ model.pathSeparator ++ dir.name
+            in
+            ( { model
+                | editedDirName = ""
+                , focusedZone = RightSide
+                , isCreatingDirectory = False
+                , previousFocusedZone = model.focusedZone
+              }
+                |> changeDestinationDirectory newDirPath
+            , Cmd.batch
+                [ getDestinationSubdirectories newDirPath
+                , getDestinationDirectoryFiles newDirPath
+                , focusOn "container-right" NoOp
+                ]
+            )
+
+        BackendReturnedCurrentDirPath path ->
+            let
+                pathSeparator : String
+                pathSeparator =
+                    if String.contains windowsPathSep path then
+                        windowsPathSep
+
+                    else
+                        unixPathSep
+            in
+            ( { model
+                | destinationDirectoryPath = path
+                , pathSeparator = pathSeparator
+                , sourceDirectoryPath = path
+              }
+            , Cmd.batch
+                [ getSourceDirectoryContent path
+                , getDestinationSubdirectories path
+                , getDestinationDirectoryFiles path
+                ]
+            )
+
+        BackendReturnedDestinationDirectories files ->
+            ( { model
+                | destinationSubdirectories = files |> sortByName
+                , isDestinationLoadingInProgress = False
+              }
+                |> filterDestinationDirectories
+            , Cmd.none
+            )
+
+        BackendReturnedDestinationDirectoryPath path ->
+            if path == "" then
+                -- user canceled the selection
+                ( model, Cmd.none )
+
+            else
+                ( model |> changeDestinationDirectory path
+                , Cmd.batch
+                    [ getDestinationSubdirectories path
+                    , getDestinationDirectoryFiles path
+                    ]
+                )
+
+        BackendReturnedDestinationFiles fileList ->
+            ( { model
+                | destinationFiles = fileList |> sortByName
+              }
+                |> filterDestinationFiles
+            , Cmd.none
+            )
+
+        BackendReturnedError errorMsg ->
+            let
+                ( updatedModel, cmd ) =
+                    if isFileNotFoundError model Source errorMsg then
+                        goBack model Source
+
+                    else if isFileNotFoundError model Destination errorMsg then
+                        goBack model Destination
+
+                    else
+                        ( model, Cmd.none )
+            in
+            ( { updatedModel
+                | error = Just errorMsg
+                , focusedZone = ErrorMessage
+                , previousFocusedZone = model.focusedZone
+              }
+            , Cmd.batch
+                [ focusOn "close-error" NoOp
+                , cmd
+                ]
+            )
+
+        BackendReturnedMovedFiles files ->
+            ( if model.isUndoing then
+                -- don't add anything to history
+                { model | isUndoing = False }
+
+              else
+                let
+                    destination : String
+                    destination =
+                        case firstMovedFile of
+                            Just file ->
+                                file.parentPath
+
+                            Nothing ->
+                                ""
+
+                    firstMovedFile : Maybe File
+                    firstMovedFile =
+                        List.head files
+
+                    source : String
+                    source =
+                        if destination == model.destinationDirectoryPath then
+                            model.sourceDirectoryPath
+
+                        else
+                            model.destinationDirectoryPath
+                in
+                { model
+                    | history =
+                        [ { operation = Move
+                          , files = files
+                          , destination = Just destination
+                          , source = Just source
+                          }
+                        ]
+                            :: model.history
+                }
+            , Cmd.batch
+                [ getSourceDirectoryContent model.sourceDirectoryPath
+                , getDestinationDirectoryFiles model.destinationDirectoryPath
+                ]
+            )
+
+        BackendReturnedRemovedFile ->
+            ( model
+              -- TODO reload only the modified content if possible
+            , Cmd.batch
+                [ getSourceDirectoryContent model.sourceDirectoryPath
+                , getDestinationDirectoryFiles model.destinationDirectoryPath
+                ]
+            )
+
+        BackendReturnedRenamedFiles files originalPaths ->
+            ( if model.isUndoing then
+                -- don't add anything to history
+                { model | isUndoing = False }
+
+              else
+                let
+                    commands : List Command
+                    commands =
+                        List.map2
+                            (\file originalPath ->
+                                let
+                                    newFile : File
+                                    newFile =
+                                        { file | status = Selected }
+                                in
+                                { operation = Rename
+                                , files = [ newFile ]
+                                , destination = Just (newFile.parentPath ++ model.pathSeparator ++ newFile.name)
+                                , source = Just originalPath
+                                }
+                            )
+                            files
+                            originalPaths
+                in
+                { model
+                    | editedFile = Nothing
+                    , editedFileName = ""
+                    , focusedZone = LeftSide
+                    , history = commands :: model.history
+                    , previousFocusedZone = model.focusedZone
+                    , sourceFiles =
+                        List.map
+                            (\f ->
+                                if f.status == Edited then
+                                    { f | status = Selected }
+
+                                else
+                                    f
+                            )
+                            model.sourceFiles
+                }
+            , Cmd.batch
+                [ getSourceDirectoryContent model.sourceDirectoryPath
+                , focusOn "container-left" NoOp
+                ]
+            )
+
+        BackendReturnedSourceDirectoryContent directoryContent ->
+            let
+                _ =
+                    Debug.log "directoryContent" directoryContent
+
+                ( dirList, fileList ) =
+                    List.partition .isDir directoryContent
+            in
+            ( { model
+                | sourceFiles = fileList |> sortByName
+                , sourceSubDirectories = dirList |> sortByName
+                , isSourceLoadingInProgress = False
+              }
+                |> filterSourceFiles
+            , Cmd.none
+            )
+
+        BackendReturnedSourceDirectoryPath path ->
+            if path == "" then
+                -- user canceled the selection
+                ( model, Cmd.none )
+
+            else
+                ( model |> changeSourceDirectory path
+                , getSourceDirectoryContent path
+                )
+
+        NoOp ->
+            ( model, Cmd.none )
+
+        UserChangedDestinationDirectoryFilter filteringString ->
+            ( { model | destinationDirectoryFilter = filteringString }
+                |> filterDestinationDirectories
+            , Cmd.none
+            )
+
+        UserChangedDestinationFilesFilter filteringString ->
+            ( { model | destinationFilesFilter = filteringString }
+                |> filterDestinationFiles
+            , Cmd.none
+            )
+
+        UserChangedSourceFilter filteringString ->
+            ( { model | sourceFilter = filteringString }
+                |> filterSourceFiles
+            , Cmd.none
+            )
+
+        UserChangedSourceReplace replaceString ->
+            ( { model | sourceReplace = replaceString }
+            , Cmd.none
+            )
+
+        UserChangedSourceSearch searchString ->
+            ( { model | sourceSearch = searchString }, Cmd.none )
+
+        UserClickedCancel ->
+            let
+                unselectForDeletion : File -> File
+                unselectForDeletion file =
+                    if file.status == SelectedForDeletion then
+                        { file | status = Selected }
+
+                    else
+                        file
+            in
+            ( { model
+                | destinationFiles = List.map unselectForDeletion model.destinationFiles
+                , filesToDelete = []
+                , focusedZone = LeftSide
+                , previousFocusedZone = model.focusedZone
+                , sourceFiles = List.map unselectForDeletion model.sourceFiles
+              }
+            , focusOn "container-left" NoOp
+            )
+
+        UserClickedCopyFilterButton ->
+            ( { model
+                | destinationDirectoryFilter = model.sourceFilter
+                , destinationFilesFilter = model.sourceFilter
+              }
+                |> filterDestinationFiles
+                |> filterDestinationDirectories
+            , Cmd.none
+            )
+
+        UserClickedClearSourceFilter ->
+            ( { model | sourceFilter = "" }
+                |> filterSourceFiles
+            , Cmd.none
+            )
+
+        UserClickedClearDestinationDirectoryFilter ->
+            ( { model | destinationDirectoryFilter = "" } |> filterDestinationDirectories
+            , Cmd.none
+            )
+
+        UserClickedClearDestinationFilesFilter ->
+            ( { model | destinationFilesFilter = "" } |> filterDestinationFiles
+            , Cmd.none
+            )
+
+        UserClickedCloseError ->
+            { model
+                | error = Nothing
+            }
+                |> restoreFocus
+
+        UserClickedDelete ->
+            removeSelectedFiles model
+
+        UserClickedDestinationDirectory isAbsolute file ->
+            let
+                newDestinationPath : String
+                newDestinationPath =
+                    case ( Debug.log "isAbsolute" isAbsolute, Debug.log "file.name" file.name ) of
+                        ( True, _ ) ->
+                            if file.parentPath == unixPathSep then
+                                -- parent is root dir on Mac, prevent bad path name like //Users
+                                model.pathSeparator ++ file.name
+
+                            else
+                                file.parentPath ++ model.pathSeparator ++ file.name
+
+                        ( False, ".." ) ->
+                            parentDir model model.destinationDirectoryPath
+
+                        ( False, _ ) ->
+                            model.destinationDirectoryPath ++ model.pathSeparator ++ file.name
+            in
+            ( model |> changeDestinationDirectory newDestinationPath
+            , Cmd.batch
+                [ getDestinationDirectoryFiles newDestinationPath
+                , getDestinationSubdirectories newDestinationPath
+                ]
+            )
+
+        UserClickedDestinationDirectoryButton ->
+            ( model
+            , selectDestinationDirectory model.destinationDirectoryPath
+            )
+
+        UserClickedDestinationFile file ->
+            let
+                updatedDestinationFiles : List File
+                updatedDestinationFiles =
+                    select model model.destinationFiles file
+            in
+            ( { model | destinationFiles = updatedDestinationFiles }
+            , Cmd.none
+            )
+
+        UserClickedReload target ->
+            reload model target
+
+        UserClickedReplaceButton ->
+            let
+                renamings : List Renaming
+                renamings =
+                    model.sourceFiles
+                        |> List.filterMap (nameReplacement model)
+            in
+            ( { model | sourceReplace = "" }
+            , applyRenaming model renamings
+            )
+
+        UserClickedSourceDirectory isAbsolute file ->
+            let
+                newSourcePath : String
+                newSourcePath =
+                    case ( isAbsolute, file.name ) of
+                        ( True, _ ) ->
+                            if file.parentPath == unixPathSep then
+                                -- parent is root dir on Mac, prevent bad path name like //Users
+                                model.pathSeparator ++ file.name
+
+                            else
+                                file.parentPath ++ model.pathSeparator ++ file.name
+
+                        ( False, ".." ) ->
+                            parentDir model model.sourceDirectoryPath
+
+                        ( False, _ ) ->
+                            model.sourceDirectoryPath ++ model.pathSeparator ++ file.name
+            in
+            ( model |> changeSourceDirectory newSourcePath
+            , getSourceDirectoryContent newSourcePath
+            )
+
+        UserClickedSourceDirectoryButton ->
+            ( model, selectSourceDirectory model.sourceDirectoryPath )
+
+        UserClickedSourceFile file ->
+            let
+                updatedSourceFiles : List File
+                updatedSourceFiles =
+                    select model model.sourceFiles file
+            in
+            ( { model
+                | focusedZone = LeftSide
+                , previousFocusedZone = model.focusedZone
+                , sourceFiles = updatedSourceFiles
+              }
+                |> filterSourceFiles
+            , focusOn "container-left" NoOp
+            )
+
+        UserChangedFocusedZone focus ->
+            ( { model
+                | focusedZone = focus
+                , previousFocusedZone = model.focusedZone
+              }
+            , Cmd.none
+            )
+
+        UserModifiedFileName newName ->
+            ( { model | editedFileName = newName }, Cmd.none )
+
+        UserModifiedDirName newName ->
+            ( { model | editedDirName = newName }, Cmd.none )
+
+        UserPressedKey target event ->
+            if model.isUndoing then
+                -- ignore key presses while an undoing is being performed
+                -- it could mess with the history
+                ( model, Cmd.none )
+
+            else
+                processKeyboardShortcut model target event
+
+        UserPressedOrReleasedKey keyboardEvent ->
+            ( { model
+                | isShiftPressed = keyboardEvent.shiftKey
+                , isControlPressed = keyboardEvent.ctrlKey || keyboardEvent.metaKey
+              }
+            , Cmd.none
+            )
+
+        UserSubmittedDirName ->
+            if model.isCreatingDirectory && model.editedDirName /= "" then
+                createNewDirectory model
+
+            else
+                ( model, Cmd.none )
+
+        UserSubmittedFilename ->
+            let
+                isConflicting : Bool
+                isConflicting =
+                    List.any (\f -> f.name == model.editedFileName) model.sourceFiles
+
+                isNameEmpty : Bool
+                isNameEmpty =
+                    String.isEmpty model.editedFileName
+            in
+            case ( model.editedFile, isConflicting, isNameEmpty ) of
+                ( Just _, True, False ) ->
+                    ( { model
+                        | error = Just ("A file with the name " ++ model.editedFileName ++ " already exists in the source directory")
+                        , focusedZone = ErrorMessage
+                      }
+                    , focusOn "close-error" NoOp
+                    )
+
+                ( Just file, False, False ) ->
+                    let
+                        renaming : Renaming
+                        renaming =
+                            { file = { file | name = model.editedFileName }
+                            , originalPath = file.name
+                            }
+                    in
+                    ( { model | error = Nothing }
+                    , applyRenaming model [ renaming ]
+                    )
+
+                _ ->
+                    ( model, Cmd.none )
+
+        UserChangedMaxDistance maxDistance ->
+            selectSimilarFiles { model | minSimilarity = round maxDistance } Source
+
+
+view : Model -> Html Msg
+view model =
+    div
+        [ class <|
+            if model.isDebugVisible then
+                "app debug"
+
+            else
+                "app"
+        , id "app"
+        , Events.on "keydown" keyDecoder
+        , Events.on "keyup" keyDecoder
+        ]
+        [ viewLeftSide model
+        , viewRightSide model
+        , viewFooter model
+        ]
+
+
+viewDate : Model -> Time.Posix -> Html Msg
+viewDate model time =
+    let
+        day : String
+        day =
+            String.fromInt (Time.toDay model.timezone time)
+                |> String.padLeft 2 '0'
+
+        month : String
+        month =
+            Time.toMonth model.timezone time
+                |> monthToString
+
+        monthToString : Month -> String
+        monthToString timeMonth =
+            case timeMonth of
+                Jan ->
+                    "01"
+
+                Feb ->
+                    "02"
+
+                Mar ->
+                    "03"
+
+                Apr ->
+                    "04"
+
+                May ->
+                    "05"
+
+                Jun ->
+                    "06"
+
+                Jul ->
+                    "07"
+
+                Aug ->
+                    "08"
+
+                Sep ->
+                    "09"
+
+                Oct ->
+                    "10"
+
+                Nov ->
+                    "11"
+
+                Dec ->
+                    "12"
+
+        year : String
+        year =
+            String.fromInt (Time.toYear model.timezone time)
+    in
+    text (day ++ "/" ++ month ++ "/" ++ year)
+
+
+viewDestination : Model -> List (Html Msg)
+viewDestination model =
+    if model.isDestinationLoadingInProgress then
+        [ viewLoadingAnimation ]
+
+    else
+        [ viewDestinationSubdirectories model
+        , viewDestinationFiles model
+        ]
+
+
+viewDestinationDirectoryFilter : Model -> Html Msg
+viewDestinationDirectoryFilter model =
+    div
+        [ class "input-box"
+        ]
+        [ input
+            [ class "input"
+            , type_ "text"
+            , id "filtering-dir-right"
+            , onInput UserChangedDestinationDirectoryFilter
+            , onFocus (UserChangedFocusedZone Filtering)
+            , value model.destinationDirectoryFilter
+            , placeholder "Enter one or more words to filter destination directories"
+            , disabled model.applySourceFilterToDestinationDirectories
+            ]
+            []
+        , button
+            [ class "btn"
+            , onClick UserClickedClearDestinationDirectoryFilter
+            , disabled model.applySourceFilterToDestinationDirectories
+            ]
+            [ text "Clear" ]
+        ]
+
+
+viewDestinationFiles : Model -> Html Msg
+viewDestinationFiles model =
+    div [ class "panel" ]
+        [ div [ class <| "panel-header" ++ additionalHeaderClass model RightSide ]
+            [ h2 [] [ text <| fileCount model Destination ]
+            ]
+        , viewDestinationFilesFilter model
+        , div
+            [ class "panel-content" ]
+            (model.destinationFiles
+                |> List.filter .satisfiesFilter
+                |> List.map (viewFile model UserClickedDestinationFile False)
+            )
+        ]
+
+
+viewDestinationFilesFilter : Model -> Html Msg
+viewDestinationFilesFilter model =
+    div
+        [ class "input-box"
+        ]
+        [ input
+            [ class "input"
+            , type_ "text"
+            , id "filtering-files-right"
+            , onInput UserChangedDestinationFilesFilter
+            , onFocus (UserChangedFocusedZone Filtering)
+            , value model.destinationFilesFilter
+            , placeholder "Enter one or more words to filter files in destination directory"
+            , disabled model.applySourceFilterToDestinationFiles
+            ]
+            []
+        , button
+            [ class "btn"
+            , onClick UserClickedClearDestinationFilesFilter
+            , disabled model.applySourceFilterToDestinationFiles
+            ]
+            [ text "Clear" ]
+        ]
+
+
+viewDestinationSubdirectories : Model -> Html Msg
+viewDestinationSubdirectories model =
+    let
+        newDirEditor : List (Html Msg)
+        newDirEditor =
+            if model.isCreatingDirectory then
+                [ viewEditedDirectoryName model ]
+
+            else
+                []
+    in
+    div [ class "panel" ]
+        [ div [ class <| "panel-header" ++ additionalHeaderClass model RightSide ]
+            [ h2 []
+                [ text <| "Destination: "
+                , viewPath model Destination
+                ]
+            , span []
+                [ button
+                    [ class "btn"
+                    , onClick (UserClickedReload Destination)
+                    ]
+                    [ text "Refresh" ]
+                , button
+                    [ class "btn"
+                    , onClick UserClickedDestinationDirectoryButton
+                    ]
+                    [ text "..." ]
+                ]
+            ]
+        , viewDestinationDirectoryFilter model
+        , div
+            [ class "panel-content" ]
+            (newDirEditor
+                ++ (model.destinationSubdirectories
+                        |> List.filter .satisfiesFilter
+                        |> List.map (viewDirectory model (UserClickedDestinationDirectory False))
+                   )
+            )
+        ]
+
+
+viewDirectory : Model -> (File -> Msg) -> File -> Html Msg
+viewDirectory _ onClickMsg file =
+    div
+        [ class "file dir"
+        , onClick (onClickMsg file)
+        ]
+        [ text <| file.name ]
+
+
+viewEditedDirectoryName : Model -> Html Msg
+viewEditedDirectoryName model =
+    form [ onSubmit UserSubmittedDirName ]
+        [ input
+            [ class "file-input"
+            , id "dirname-input"
+            , onInput UserModifiedDirName
+            , onFocus (UserChangedFocusedZone DirNameEditor)
+            , Events.on "keydown" (simpleKeyDecoder Destination)
+            , value model.editedDirName
+            ]
+            []
+        ]
+
+
+viewEditedFilename : Model -> Html Msg
+viewEditedFilename model =
+    form [ onSubmit UserSubmittedFilename ]
+        [ input
+            [ class "file-input"
+            , id "filename-input"
+            , onInput UserModifiedFileName
+            , onFocus (UserChangedFocusedZone FileNameEditor)
+            , Events.on "keydown" (simpleKeyDecoder Source)
+            , value model.editedFileName
+            ]
+            []
+        ]
+
+
+viewFile : Model -> (File -> Msg) -> Bool -> File -> Html Msg
+viewFile model onClickMsg canBeSearchedAndReplaced file =
+    if file.status == Edited then
+        viewEditedFilename model
+
+    else
+        viewReadOnlyFile model onClickMsg canBeSearchedAndReplaced file
+
+
+viewFooter : Model -> Html Msg
+viewFooter model =
+    let
+        className : String
+        className =
+            if model.error /= Nothing || isWaitingForConfirmation then
+                "danger"
+
+            else
+                ""
+
+        conditionalAttributes : List (Html.Attribute Msg)
+        conditionalAttributes =
+            if isWaitingForConfirmation then
+                [ Events.preventDefaultOn "keydown" (keyDecoderPreventingDefault Source)
+                , onFocus (UserChangedFocusedZone Confirmation)
+                ]
+
+            else
+                []
+
+        isWaitingForConfirmation : Bool
+        isWaitingForConfirmation =
+            List.length model.filesToDelete > 0
+    in
+    footer
+        (class className :: conditionalAttributes)
+        [ case model.error of
+            Just errorMsg ->
+                div []
+                    [ text errorMsg
+                    , button [ id "close-error", class "btn", onClick UserClickedCloseError ] [ text "Ok" ]
+                    ]
+
+            Nothing ->
+                viewPressedKeys model
+
+        --        viewFocusedZone model
+        , case model.filesToDelete of
+            [] ->
+                text ""
+
+            _ ->
+                span
+                    []
+                    [ text "This will permanently delete the selected files. This cannot be undone."
+                    , button [ class "btn", onClick UserClickedCancel ] [ text "Cancel" ]
+                    , button [ class "btn", onClick UserClickedDelete, id "delete-button" ] [ text "DELETE" ]
+                    ]
+        , viewDebug model
+        ]
+
+
+viewDebug : Model -> Html Msg
+viewDebug model =
+    if model.isDebugVisible then
+        ul [ class "debug" ]
+            ([ li [] [ text <| "destinationDirectoryPath: " ++ model.destinationDirectoryPath ]
+             ]
+                ++ List.map (\msg -> li [] [ text <| "Msg: " ++ String.left 220 msg ]) model.debug
+            )
+
+    else
+        text ""
+
+
+viewLeftSide : Model -> Html Msg
+viewLeftSide model =
+    let
+        conditionalAttributes : List (Html.Attribute Msg)
+        conditionalAttributes =
+            case ( model.editedFile, model.focusedZone ) of
+                ( Nothing, LeftSide ) ->
+                    [ Events.preventDefaultOn "keydown" (keyDecoderPreventingDefault Source)
+                    ]
+
+                ( Nothing, _ ) ->
+                    [ onFocus (UserChangedFocusedZone LeftSide)
+                    ]
+
+                _ ->
+                    []
+    in
+    div
+        ([ id "container-left"
+         , tabindex 1
+         ]
+            ++ conditionalAttributes
+        )
+    <|
+        viewSource model
+
+
+viewPath : Model -> Target -> Html Msg
+viewPath model target =
+    let
+        clickablePath : List (Html Msg)
+        clickablePath =
+            List.indexedMap
+                (\index element ->
+                    if index < displayableElementsCount - 1 then
+                        span []
+                            [ span
+                                [ class "link"
+                                , onClick <| msgToEmit element
+                                ]
+                                [ text element.name ]
+                            , span [] [ text model.pathSeparator ]
+                            ]
+
+                    else
+                        -- the name of the current directory is not clickable
+                        span [] [ text element.name ]
+                )
+                displayableElements
+
+        displayableElements : List File
+        displayableElements =
+            truncateConcatenatedNames maxVisibleCharactersInPaths elements
+
+        displayableElementsCount : Int
+        displayableElementsCount =
+            List.length displayableElements
+
+        elements : List File
+        elements =
+            pathElements model [] path
+
+        ellipsis : Html Msg
+        ellipsis =
+            if displayableElementsCount < List.length elements then
+                text <| "..." ++ model.pathSeparator
+
+            else
+                text model.pathSeparator
+
+        msgToEmit : File -> Msg
+        msgToEmit =
+            case target of
+                Source ->
+                    UserClickedSourceDirectory True
+
+                Destination ->
+                    UserClickedDestinationDirectory True
+
+        path : String
+        path =
+            case target of
+                Source ->
+                    model.sourceDirectoryPath
+
+                Destination ->
+                    model.destinationDirectoryPath
+    in
+    span [] <|
+        ellipsis
+            :: clickablePath
+
+
+viewPressedKeys : Model -> Html Msg
+viewPressedKeys model =
+    text
+        (if model.isControlPressed then
+            " CTRL "
+
+         else
+            ""
+                ++ (if model.isShiftPressed then
+                        " SHIFT "
+
+                    else
+                        ""
+                   )
+        )
+
+
+viewReadOnlyFile : Model -> (File -> Msg) -> Bool -> File -> Html Msg
+viewReadOnlyFile model onClickMsg canBeSearchedAndReplaced file =
+    let
+        className : String
+        className =
+            case file.status of
+                Unselected ->
+                    "file"
+
+                Edited ->
+                    "file"
+
+                Selected ->
+                    "file selected"
+
+                SelectedForDeletion ->
+                    "file marked-for-deletion"
+
+        fileName : List (Html Msg)
+        fileName =
+            if canBeSearchedAndReplaced then
+                case ( model.sourceSearch, model.sourceReplace ) of
+                    ( "", _ ) ->
+                        [ text file.name ]
+
+                    ( _, "" ) ->
+                        highlight (matches model file.name) file.name
+
+                    ( _, replacementString ) ->
+                        file.name
+                            |> replace model
+                            |> highlight replacementString
+
+            else
+                [ text file.name ]
+    in
+    div
+        [ class className
+        , onClick (onClickMsg file)
+        ]
+        [ div [ class "filename" ] fileName
+        , div [] [ text <| Filesize.format file.size ]
+        , div [ class "filemodificationdate" ] [ viewDate model file.modTime ]
+        ]
+
+
+viewRightSide : Model -> Html Msg
+viewRightSide model =
+    let
+        conditionalAttributes : List (Html.Attribute Msg)
+        conditionalAttributes =
+            case model.focusedZone of
+                RightSide ->
+                    [ Events.preventDefaultOn "keydown" (keyDecoderPreventingDefault Destination) ]
+
+                _ ->
+                    []
+    in
+    div
+        ([ id "container-right"
+         , tabindex 2
+         , onFocus (UserChangedFocusedZone RightSide)
+         ]
+            ++ conditionalAttributes
+        )
+    <|
+        viewDestination model
+
+
+viewSource : Model -> List (Html Msg)
+viewSource model =
+    [ viewSourceSubdirectories model
+    , viewSourceFiles model
+    ]
+
+
+viewSourceFiles : Model -> Html Msg
+viewSourceFiles model =
+    div [ class "panel" ]
+        [ div [ class <| "panel-header" ++ additionalHeaderClass model LeftSide ]
+            [ h2 [] [ text <| fileCount model Source ]
+            , viewSimilarityLevelForm model
+            , viewSearchReplaceForm model
+            ]
+        , div
+            [ class "input-box"
+            ]
+            [ input
+                [ class "input"
+                , type_ "text"
+                , id "filtering-left"
+                , onInput UserChangedSourceFilter
+                , onFocus (UserChangedFocusedZone Filtering)
+                , value model.sourceFilter
+                , placeholder "Enter one or more words to filter source files"
+                ]
+                []
+            , button [ class "btn", onClick UserClickedClearSourceFilter ] [ text "Clear" ]
+            , button [ class "btn", onClick UserClickedCopyFilterButton ] [ text "Copy" ]
+            ]
+        , div
+            [ class "panel-content" ]
+            (model.sourceFiles
+                |> List.filter .satisfiesFilter
+                |> List.map (viewFile model UserClickedSourceFile True)
+            )
+        ]
+
+
+maxSimilarity : Int
+maxSimilarity =
+    30
+
+
+viewSimilarityLevelForm : Model -> Html Msg
+viewSimilarityLevelForm model =
+    --div []
+    --    [
+    --input
+    --    [ class "input"
+    --    , id "similarity-level"
+    --    , onFocus (UserChangedFocusedZone SimilarityLevel)
+    --    , onInput UserChangedSimilarityLevel
+    --    , placeholder "Search"
+    --    , type_ "text"
+    --    , value <| String.fromFloat model.similarityLevel
+    --    ]
+    --    []
+    --,
+    SingleSlider.view <|
+        SingleSlider.init
+            { min = 0
+            , max = toFloat maxSimilarity
+            , value = toFloat model.minSimilarity
+            , step = 1
+            , onChange = UserChangedMaxDistance
+            }
+
+
+
+--]
+
+
+viewSearchReplaceForm : Model -> Html Msg
+viewSearchReplaceForm model =
+    div [ class "search-form" ]
+        [ input
+            [ class "input"
+            , id "search-left"
+            , onFocus (UserChangedFocusedZone SourceSearchReplace)
+            , onInput UserChangedSourceSearch
+            , placeholder "Search"
+            , type_ "text"
+            , value model.sourceSearch
+            ]
+            []
+        , input
+            [ class "input"
+            , onFocus (UserChangedFocusedZone SourceSearchReplace)
+            , onInput UserChangedSourceReplace
+            , placeholder "Replace with"
+            , type_ "text"
+            , value model.sourceReplace
+            ]
+            []
+        , button
+            [ class "btn"
+            , onClick UserClickedReplaceButton
+            ]
+            [ text "Replace" ]
+        ]
+
+
+viewSourceSubdirectories : Model -> Html Msg
+viewSourceSubdirectories model =
+    div [ class "panel" ]
+        [ div [ class <| "panel-header" ++ additionalHeaderClass model LeftSide ]
+            [ h2 []
+                [ text <| "Source: "
+                , viewPath model Source
+                ]
+            , span []
+                [ button
+                    [ class "btn"
+                    , onClick (UserClickedReload Source)
+                    ]
+                    [ text "Refresh" ]
+                , button
+                    [ class "btn"
+                    , onClick UserClickedSourceDirectoryButton
+                    ]
+                    [ text "..." ]
+                ]
+            ]
+        , div
+            [ class "panel-content" ]
+            (model.sourceSubDirectories
+                |> List.map (viewDirectory model (UserClickedSourceDirectory False))
+            )
+        ]
+
+
+viewLoadingAnimation : Html Msg
+viewLoadingAnimation =
+    div [ class "spin" ] []
diff --git a/src-elm/src/Pattern.elm b/src-elm/src/Pattern.elm
new file mode 100644
index 0000000..cc7cb54
--- /dev/null
+++ b/src-elm/src/Pattern.elm
@@ -0,0 +1,48 @@
+module Pattern exposing (Pattern, Token(..), fromString, toRegexp)
+
+import Regex exposing (Regex)
+
+
+type alias Pattern =
+    List Token
+
+
+type Token
+    = RawString String
+    | Joker
+
+
+fromString : String -> List Token
+fromString string =
+    string
+        |> String.split "*"
+        |> List.map escapeSpecialChars
+        |> List.map RawString
+        |> List.intersperse Joker
+        |> List.filter (\t -> t /= RawString "")
+
+
+toRegexp : Pattern -> Maybe Regex
+toRegexp pattern =
+    pattern
+        |> List.map
+            (\token ->
+                case token of
+                    RawString string ->
+                        "(" ++ string ++ ")"
+
+                    Joker ->
+                        "(.*?)"
+            )
+        |> String.concat
+        |> Regex.fromString
+
+
+escapeSpecialChars : String -> String
+escapeSpecialChars string =
+    string
+        |> String.replace "." "\\."
+        |> String.replace "[" "\\["
+        |> String.replace "]" "\\]"
+        |> String.replace "(" "\\("
+        |> String.replace ")" "\\)"
diff --git a/src-elm/src/StringComparison.elm b/src-elm/src/StringComparison.elm
new file mode 100644
index 0000000..9805893
--- /dev/null
+++ b/src-elm/src/StringComparison.elm
@@ -0,0 +1,53 @@
+module StringComparison exposing (..)
+
+import List.Extra
+
+
+isSimilarityLevelGreaterThan : String -> String -> Int -> Bool
+isSimilarityLevelGreaterThan string1 string2 threshold =
+    let
+        len1 =
+            String.length string1
+
+        len2 =
+            String.length string2
+
+        chars1 =
+            string1
+                |> String.padRight (len2 - len1) ' '
+                |> String.toList
+
+        chars2 =
+            string2
+                |> String.padRight (len1 - len2) ' '
+                |> String.toList
+
+        charList =
+            List.Extra.zip chars1 chars2
+
+        similarCharCount =
+            List.foldl compareChars 0 charList
+    in
+    similarCharCount >= threshold
+
+
+compareChars : ( Char, Char ) -> Int -> Int
+compareChars ( char1, char2 ) currentLevel =
+    if char1 == char2 then
+        currentLevel + 1
+
+    else
+        currentLevel
+
+
+
+--compareChars : List Char -> List Char -> Int -> Int
+--compareChars chars1 chars2 currentLevel =
+--    if List.isEmpty chars1 || List.isEmpty chars2 then
+--        currentLevel
+--
+--    else if List.head chars1 == List.head chars2 then
+--        compareChars (List.drop 1 chars1) (List.drop 1 chars2) (currentLevel + 1)
+--
+--    else
+--        compareChars (List.drop 1 chars1) (List.drop 1 chars2) currentLevel
diff --git a/src-elm/tests/FileTest.elm b/src-elm/tests/FileTest.elm
new file mode 100644
index 0000000..321e2a6
--- /dev/null
+++ b/src-elm/tests/FileTest.elm
@@ -0,0 +1,250 @@
+module FileTest exposing (suite)
+
+import Expect
+import File exposing (File, FileStatus(..), extendSelectionToNext, extendSelectionToPrevious, selectNext, selectPrevious, selectSimilar, withStatus)
+import Fixtures exposing (filteredDir1, filteredDir2, filteredDir3, filteredDir4, filteredDir5, filteredDir6, filteredDir7, filteredDir8)
+import Iso8601
+import Json.Decode exposing (Decoder, decodeString)
+import Test exposing (Test, describe, test)
+import Time exposing (millisToPosix)
+
+
+suite : Test
+suite =
+    describe "File module"
+        [ test "selectNext selects the next file" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        selectNext
+                            [ filteredDir1
+                            , filteredDir2 |> withStatus Selected
+                            , filteredDir3
+                            , filteredDir4
+                            , filteredDir5
+                            ]
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1
+                        , filteredDir2
+                        , filteredDir3 |> withStatus Selected
+                        , filteredDir4
+                        , filteredDir5
+                        ]
+                in
+                Expect.equal expected actual
+        , test "selectNext does nothing when the currently selected file is the last" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        selectNext expected
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1
+                        , filteredDir2
+                        , filteredDir3
+                        , filteredDir4
+                        , filteredDir5 |> withStatus Selected
+                        ]
+                in
+                Expect.equal expected actual
+        , test "selectNext selects the last file in a list when none is selected" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        selectNext
+                            [ filteredDir1
+                            , filteredDir2
+                            , filteredDir3
+                            , filteredDir4
+                            , filteredDir5
+                            ]
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1
+                        , filteredDir2
+                        , filteredDir3
+                        , filteredDir4
+                        , filteredDir5 |> withStatus Selected
+                        ]
+                in
+                Expect.equal expected actual
+        , test "selectPrevious selects the previous file in a list when there is one" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        selectPrevious
+                            [ filteredDir1
+                            , filteredDir2
+                            , filteredDir3
+                            , filteredDir4 |> withStatus Selected
+                            , filteredDir5
+                            ]
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1
+                        , filteredDir2
+                        , filteredDir3 |> withStatus Selected
+                        , filteredDir4
+                        , filteredDir5
+                        ]
+                in
+                Expect.equal expected actual
+        , test "selectPrevious does nothing when the currently selected file is the first" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        selectPrevious expected
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1 |> withStatus Selected
+                        , filteredDir2
+                        , filteredDir3
+                        , filteredDir4
+                        , filteredDir5
+                        ]
+                in
+                Expect.equal expected actual
+        , test "selectPrevious selects the first file in a list when none is selected" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        selectPrevious
+                            [ filteredDir1
+                            , filteredDir2
+                            , filteredDir3
+                            , filteredDir4
+                            , filteredDir5
+                            ]
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1 |> withStatus Selected
+                        , filteredDir2
+                        , filteredDir3
+                        , filteredDir4
+                        , filteredDir5
+                        ]
+                in
+                Expect.equal expected actual
+        , test "extendSelectionToNext selects the next file after the first selected" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        extendSelectionToNext
+                            [ filteredDir1
+                            , filteredDir2 |> withStatus Selected
+                            , filteredDir3
+                            , filteredDir4
+                            , filteredDir5
+                            ]
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1
+                        , filteredDir2 |> withStatus Selected
+                        , filteredDir3 |> withStatus Selected
+                        , filteredDir4
+                        , filteredDir5
+                        ]
+                in
+                Expect.equal expected actual
+        , test "extendSelectionToPrevious selects the file before the first selected" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        extendSelectionToPrevious
+                            [ filteredDir1
+                            , filteredDir2
+                            , filteredDir3 |> withStatus Selected
+                            , filteredDir4
+                            , filteredDir5
+                            ]
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1
+                        , filteredDir2 |> withStatus Selected
+                        , filteredDir3 |> withStatus Selected
+                        , filteredDir4
+                        , filteredDir5
+                        ]
+                in
+                Expect.equal expected actual
+        , test "selectSimilar selects the files with a name looking like the given one" <|
+            \_ ->
+                let
+                    actual : List File
+                    actual =
+                        selectSimilar
+                            filteredDir6
+                            10
+                            [ filteredDir1
+                            , filteredDir6 |> withStatus Selected
+                            , filteredDir2
+                            , filteredDir7
+                            , filteredDir3
+                            , filteredDir8
+                            , filteredDir4 |> withStatus Selected
+                            , filteredDir5
+                            ]
+
+                    expected : List File
+                    expected =
+                        [ filteredDir1
+                        , filteredDir6 |> withStatus Selected
+                        , filteredDir2
+                        , filteredDir7 |> withStatus Selected
+                        , filteredDir3
+                        , filteredDir8 |> withStatus Selected
+                        , filteredDir4
+                        , filteredDir5
+                        ]
+                in
+                Expect.equal expected actual
+        , test "filerDecoder is able to decode a file descriptor" <|
+            \_ ->
+                let
+                    actual : File
+                    actual =
+                        """
+                        {
+                            "DirPath": "/Users/pascal",
+                            "IsDir": true,
+                            "ModTime": "2025-12-16T19:43:08.307Z",
+                            "Mode": 16832,
+                            "Name": "Music",
+                            "Size": 256
+                        }
+                        """
+                            |> decodeString File.fileDecoder
+                            |> Result.toMaybe
+                            |> Maybe.withDefault Fixtures.dir1
+
+                    expected : File
+                    expected =
+                        { parentPath = "/Users/pascal"
+                        , isDir = True
+                        , modTime = millisToPosix 1765914188307
+                        , mode = 16832
+                        , name = "Music"
+                        , satisfiesFilter = False
+                        , status = Unselected
+                        , size = 256
+                        }
+                in
+                Expect.equal expected actual
+        ]
diff --git a/src-elm/tests/Fixtures.elm b/src-elm/tests/Fixtures.elm
new file mode 100644
index 0000000..535cf32
--- /dev/null
+++ b/src-elm/tests/Fixtures.elm
@@ -0,0 +1,112 @@
+module Fixtures exposing (allDirs, dir1, dir2, dir3, dir4, dir5, filteredDir1, filteredDir2, filteredDir3, filteredDir4, filteredDir5, filteredDir6, filteredDir7, filteredDir8, model, windowsDir)
+
+import File exposing (File, FileStatus(..), withName)
+import Main exposing (Model, defaultModel)
+import Time exposing (millisToPosix)
+
+
+allDirs : List File
+allDirs =
+    [ dir1
+    , dir2
+    , dir3
+    , dir4
+    , dir5
+    ]
+
+
+dir1 : File
+dir1 =
+    { isDir = True
+    , mode = 777
+    , modTime = millisToPosix 0
+    , name = "dirname"
+    , parentPath = "/some/path/"
+    , satisfiesFilter = False
+    , size = 0
+    , status = Unselected
+    }
+
+
+dir2 : File
+dir2 =
+    { dir1 | name = "dir2" }
+
+
+dir3 : File
+dir3 =
+    { dir1 | name = "different" }
+
+
+dir4 : File
+dir4 =
+    { dir1
+        | name = "dirname4"
+        , parentPath = "/some/path/extended"
+    }
+
+
+dir5 : File
+dir5 =
+    { dir1
+        | name = "dir5"
+        , parentPath = "/some/path/extended"
+    }
+
+
+filteredDir1 : File
+filteredDir1 =
+    dir1 |> withSatisfiedFilter
+
+
+filteredDir2 : File
+filteredDir2 =
+    dir2 |> withSatisfiedFilter
+
+
+filteredDir3 : File
+filteredDir3 =
+    dir3 |> withSatisfiedFilter
+
+
+filteredDir4 : File
+filteredDir4 =
+    dir4 |> withSatisfiedFilter
+
+
+filteredDir5 : File
+filteredDir5 =
+    dir5 |> withSatisfiedFilter
+
+
+filteredDir6 : File
+filteredDir6 =
+    filteredDir1 |> withName "a name with random chars 1 [123]"
+
+
+filteredDir7 : File
+filteredDir7 =
+    filteredDir1 |> withName "a name with random chars 2 [456]"
+
+
+filteredDir8 : File
+filteredDir8 =
+    filteredDir1 |> withName "a name with random chars 3 [678] - Foo"
+
+
+model : Model
+model =
+    { defaultModel | destinationSubdirectories = [] }
+
+
+windowsDir : File
+windowsDir =
+    { dir1
+        | name = "windows dir"
+        , parentPath = "C:\\some\\path\\extended"
+    }
+
+
+withSatisfiedFilter : File -> File
+withSatisfiedFilter file =
+    { file | satisfiesFilter = True }
diff --git a/src-elm/tests/MaintTest.elm b/src-elm/tests/MaintTest.elm
new file mode 100644
index 0000000..05df73a
--- /dev/null
+++ b/src-elm/tests/MaintTest.elm
@@ -0,0 +1,291 @@
+module MaintTest exposing (suite)
+
+import Expect
+import File exposing (File, FileStatus(..), defaultDir, withName, withParentPath, withStatus)
+import Fixtures exposing (allDirs, dir1, dir2, dir3, dir4, dir5, filteredDir1, filteredDir2, filteredDir3, filteredDir4, filteredDir5, model, windowsDir)
+import Main exposing (Model, defaultModel, filterDestinationDirectories, pathElements, select, truncateConcatenatedNames, windowsPathSep)
+import Test exposing (Test, describe, test)
+
+
+suite : Test
+suite =
+    describe "Main module"
+        [ describe "filterDestinationDirectories"
+            [ test "identifies filenames containing a given string" <|
+                \_ ->
+                    let
+                        expected : List File
+                        expected =
+                            [ { dir1 | satisfiesFilter = True }
+                            , dir2
+                            , dir3
+                            , { dir4 | satisfiesFilter = True }
+                            , dir5
+                            ]
+
+                        filteredModel : Model
+                        filteredModel =
+                            { model
+                                | destinationDirectoryFilter = "dirn"
+                                , destinationSubdirectories = allDirs
+                            }
+                                |> filterDestinationDirectories
+                    in
+                    Expect.equal expected filteredModel.destinationSubdirectories
+            , test "identifies parent path containing a given string" <|
+                \_ ->
+                    let
+                        expected : List File
+                        expected =
+                            [ dir1
+                            , dir2
+                            , dir3
+                            , { dir4 | satisfiesFilter = True }
+                            , { dir5 | satisfiesFilter = True }
+                            ]
+
+                        filteredModel : Model
+                        filteredModel =
+                            { model
+                                | destinationDirectoryFilter = "ext"
+                                , destinationSubdirectories = allDirs
+                            }
+                                |> filterDestinationDirectories
+                    in
+                    Expect.equal expected filteredModel.destinationSubdirectories
+            , describe "pathElements"
+                [ test "pathElements returns the list of nested path and their names" <|
+                    \_ ->
+                        let
+                            elements : List File
+                            elements =
+                                pathElements defaultModel [] <| dir5.parentPath ++ defaultModel.pathSeparator ++ dir5.name
+
+                            expected : List File
+                            expected =
+                                [ defaultDir
+                                    |> withName "some"
+                                    |> withParentPath "/"
+                                , defaultDir
+                                    |> withName "path"
+                                    |> withParentPath "/some"
+                                , defaultDir
+                                    |> withName "extended"
+                                    |> withParentPath "/some/path"
+                                , defaultDir
+                                    |> withName "dir5"
+                                    |> withParentPath "/some/path/extended"
+                                ]
+                        in
+                        Expect.equal expected elements
+                , test "pathElements returns the list of nested path and their names under Windows" <|
+                    \_ ->
+                        let
+                            elements : List File
+                            elements =
+                                pathElements windowsModel [] <|
+                                    windowsDir.parentPath
+                                        ++ windowsModel.pathSeparator
+                                        ++ windowsDir.name
+
+                            expected : List File
+                            expected =
+                                [ defaultDir
+                                    |> withName "some"
+                                    |> withParentPath "C:"
+                                , defaultDir
+                                    |> withName "path"
+                                    |> withParentPath "C:\\some"
+                                , defaultDir
+                                    |> withName "extended"
+                                    |> withParentPath "C:\\some\\path"
+                                , defaultDir
+                                    |> withName "windows dir"
+                                    |> withParentPath "C:\\some\\path\\extended"
+                                ]
+
+                            windowsModel : Model
+                            windowsModel =
+                                { defaultModel | pathSeparator = windowsPathSep }
+                        in
+                        Expect.equal expected elements
+                , test "pathElements ignores ." <|
+                    \_ ->
+                        let
+                            elements : List File
+                            elements =
+                                pathElements defaultModel [] "."
+
+                            expected : List File
+                            expected =
+                                []
+                        in
+                        Expect.equal expected elements
+                ]
+            , test "truncate returns a list of files whose cumulated name length does not exceed given size" <|
+                \_ ->
+                    let
+                        actual : List File
+                        actual =
+                            truncateConcatenatedNames 22 allDirs
+
+                        expected : List File
+                        expected =
+                            [ dir3
+                            , dir4
+                            , dir5
+                            ]
+                    in
+                    Expect.equal expected actual
+            ]
+        , describe "select"
+            [ test "select selects only the clicked file when neither CTRL or SHIFT are pressed" <|
+                \_ ->
+                    let
+                        actual : List File
+                        actual =
+                            select model allDirs dir3
+
+                        expected : List File
+                        expected =
+                            [ dir1
+                            , dir2
+                            , dir3 |> withStatus Selected
+                            , dir4
+                            , dir5
+                            ]
+                    in
+                    Expect.equal expected actual
+            , test "select unselects the clicked file when neither CTRL or SHIFT are pressed" <|
+                \_ ->
+                    let
+                        actual : List File
+                        actual =
+                            select model
+                                [ dir1
+                                , dir2
+                                , clickedFile
+                                , dir4
+                                , dir5
+                                ]
+                                dir3
+
+                        clickedFile : File
+                        clickedFile =
+                            dir3 |> withStatus Selected
+
+                        expected : List File
+                        expected =
+                            allDirs
+                    in
+                    Expect.equal expected actual
+            , test "select adds the clicked file to the current selection if it is unselected and CTRL is pressed" <|
+                \_ ->
+                    let
+                        actual : List File
+                        actual =
+                            select
+                                { model | isControlPressed = True }
+                                [ dir1
+                                , dir2
+                                , clickedFile
+                                , dir4
+                                , dir5
+                                ]
+                                dir4
+
+                        clickedFile : File
+                        clickedFile =
+                            dir3 |> withStatus Selected
+
+                        expected : List File
+                        expected =
+                            [ dir1
+                            , dir2
+                            , dir3 |> withStatus Selected
+                            , dir4 |> withStatus Selected
+                            , dir5
+                            ]
+                    in
+                    Expect.equal expected actual
+            , test "select removes the clicked file from the current selection if it is selected and CTRL is pressed" <|
+                \_ ->
+                    let
+                        actual : List File
+                        actual =
+                            select
+                                { model | isControlPressed = True }
+                                [ dir1
+                                , dir2
+                                , dir3 |> withStatus Selected
+                                , clickedFile
+                                , dir5
+                                ]
+                                clickedFile
+
+                        clickedFile : File
+                        clickedFile =
+                            dir4 |> withStatus Selected
+
+                        expected : List File
+                        expected =
+                            [ dir1
+                            , dir2
+                            , dir3 |> withStatus Selected
+                            , dir4
+                            , dir5
+                            ]
+                    in
+                    Expect.equal expected actual
+            , test "select selects the file range from the first selected to the clicked file when it is after and SHIFT is pressed" <|
+                \_ ->
+                    let
+                        actual : List File
+                        actual =
+                            select
+                                { model | isShiftPressed = True }
+                                [ filteredDir1
+                                , filteredDir2 |> withStatus Selected
+                                , filteredDir3
+                                , filteredDir4
+                                , filteredDir5
+                                ]
+                                filteredDir4
+
+                        expected : List File
+                        expected =
+                            [ filteredDir1
+                            , filteredDir2 |> withStatus Selected
+                            , filteredDir3 |> withStatus Selected
+                            , filteredDir4 |> withStatus Selected
+                            , filteredDir5
+                            ]
+                    in
+                    Expect.equal expected actual
+            , test "select selects the file range from the clicked file to the last selected when it is before and SHIFT is pressed" <|
+                \_ ->
+                    let
+                        actual : List File
+                        actual =
+                            select
+                                { model | isShiftPressed = True }
+                                [ filteredDir1
+                                , filteredDir2
+                                , filteredDir3
+                                , filteredDir4 |> withStatus Selected
+                                , filteredDir5
+                                ]
+                                filteredDir2
+
+                        expected : List File
+                        expected =
+                            [ filteredDir1
+                            , filteredDir2 |> withStatus Selected
+                            , filteredDir3 |> withStatus Selected
+                            , filteredDir4 |> withStatus Selected
+                            , filteredDir5
+                            ]
+                    in
+                    Expect.equal expected actual
+            ]
+        ]
diff --git a/src-elm/tests/SearchReplaceTest.elm b/src-elm/tests/SearchReplaceTest.elm
new file mode 100644
index 0000000..7873081
--- /dev/null
+++ b/src-elm/tests/SearchReplaceTest.elm
@@ -0,0 +1,74 @@
+module SearchReplaceTest exposing (suite)
+
+import Expect
+import Pattern exposing (Token(..), fromString)
+import Test exposing (Test, describe, test)
+
+
+suite : Test
+suite =
+    describe "SearchReplace"
+        [ describe "fromString"
+            [ test "parses a string with a joker" <|
+                \_ ->
+                    let
+                        actual : List Token
+                        actual =
+                            fromString "a*b"
+
+                        expected : List Token
+                        expected =
+                            [ RawString "a", Joker, RawString "b" ]
+                    in
+                    Expect.equal expected actual
+            , test "parses a string without any joker" <|
+                \_ ->
+                    let
+                        actual : List Token
+                        actual =
+                            fromString "ab"
+
+                        expected : List Token
+                        expected =
+                            [ RawString "ab" ]
+                    in
+                    Expect.equal expected actual
+            , test "parses a string with several jokers" <|
+                \_ ->
+                    let
+                        actual : List Token
+                        actual =
+                            fromString "ab*cd*"
+
+                        expected : List Token
+                        expected =
+                            [ RawString "ab", Joker, RawString "cd", Joker ]
+                    in
+                    Expect.equal expected actual
+            , test "parses a string with a leading joker" <|
+                \_ ->
+                    let
+                        actual : List Token
+                        actual =
+                            fromString "*abcd"
+
+                        expected : List Token
+                        expected =
+                            [ Joker, RawString "abcd" ]
+                    in
+                    Expect.equal expected actual
+            , test "escapes special chars" <|
+                \_ ->
+                    let
+                        actual : List Token
+                        actual =
+                            fromString ".[]()"
+
+                        expected : List Token
+                        expected =
+                            --[  RawString "\\.\\[\\]\\(\\)" ]
+                            [ RawString "\\.\\[\\]\\(\\)" ]
+                    in
+                    Expect.equal expected actual
+            ]
+        ]
diff --git a/src-elm/tests/StringComparisonTest.elm b/src-elm/tests/StringComparisonTest.elm
new file mode 100644
index 0000000..895e558
--- /dev/null
+++ b/src-elm/tests/StringComparisonTest.elm
@@ -0,0 +1,23 @@
+module StringComparisonTest exposing (..)
+
+import Expect exposing (Expectation)
+import StringComparison exposing (isSimilarityLevelGreaterThan)
+import Test exposing (Test, describe, test)
+
+
+suite : Test
+suite =
+    describe "isSimilarityLevelGreaterThan"
+        [ test "returns true when comparing string with more than level common chars" <|
+            \_ ->
+                isSimilarityLevelGreaterThan "abcdeijk" "abcdefgh" 5
+                    |> Expect.equal True
+        , test "detects similarity even if the first string is shorter than the second" <|
+            \_ ->
+                isSimilarityLevelGreaterThan "zbcde" "abcdefgh" 4
+                    |> Expect.equal True
+        , test "detects similarity even if the first string is longer than the second" <|
+            \_ ->
+                isSimilarityLevelGreaterThan "zBCDExkHamsld" "aBCDEfgH" 5
+                    |> Expect.equal True
+        ]
diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore
new file mode 100644
index 0000000..b21bd68
--- /dev/null
+++ b/src-tauri/.gitignore
@@ -0,0 +1,7 @@
+# Generated by Cargo
+# will have compiled files and executables
+/target/
+
+# Generated by Tauri
+# will have schema files for capabilities auto-completion
+/gen/schemas
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
new file mode 100644
index 0000000..b3a8aff
--- /dev/null
+++ b/src-tauri/Cargo.lock
@@ -0,0 +1,5169 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "adler2"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "alloc-no-stdlib"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
+
+[[package]]
+name = "async-broadcast"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"
+dependencies = [
+ "event-listener",
+ "event-listener-strategy",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-channel"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
+dependencies = [
+ "concurrent-queue",
+ "event-listener-strategy",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8"
+dependencies = [
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "pin-project-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-io"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "concurrent-queue",
+ "futures-io",
+ "futures-lite",
+ "parking",
+ "polling",
+ "rustix",
+ "slab",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "async-lock"
+version = "3.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"
+dependencies = [
+ "event-listener",
+ "event-listener-strategy",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-process"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"
+dependencies = [
+ "async-channel",
+ "async-io",
+ "async-lock",
+ "async-signal",
+ "async-task",
+ "blocking",
+ "cfg-if",
+ "event-listener",
+ "futures-lite",
+ "rustix",
+]
+
+[[package]]
+name = "async-recursion"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "async-signal"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c"
+dependencies = [
+ "async-io",
+ "async-lock",
+ "atomic-waker",
+ "cfg-if",
+ "futures-core",
+ "futures-io",
+ "rustix",
+ "signal-hook-registry",
+ "slab",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "async-task"
+version = "4.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
+
+[[package]]
+name = "async-trait"
+version = "0.1.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "atk"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b"
+dependencies = [
+ "atk-sys",
+ "glib",
+ "libc",
+]
+
+[[package]]
+name = "atk-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
+[[package]]
+name = "autocfg"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+
+[[package]]
+name = "base64"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+
+[[package]]
+name = "base64"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block2"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "blocking"
+version = "1.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
+dependencies = [
+ "async-channel",
+ "async-task",
+ "futures-io",
+ "futures-lite",
+ "piper",
+]
+
+[[package]]
+name = "brotli"
+version = "8.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
+
+[[package]]
+name = "bytemuck"
+version = "1.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cairo-rs"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
+dependencies = [
+ "bitflags 2.10.0",
+ "cairo-sys-rs",
+ "glib",
+ "libc",
+ "once_cell",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "cairo-sys-rs"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "camino"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "cargo-platform"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cargo_metadata"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba"
+dependencies = [
+ "camino",
+ "cargo-platform",
+ "semver",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.17",
+]
+
+[[package]]
+name = "cargo_toml"
+version = "0.22.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77"
+dependencies = [
+ "serde",
+ "toml 0.9.11+spec-1.1.0",
+]
+
+[[package]]
+name = "cc"
+version = "1.2.53"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932"
+dependencies = [
+ "find-msvc-tools",
+ "shlex",
+]
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cfb"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f"
+dependencies = [
+ "byteorder",
+ "fnv",
+ "uuid",
+]
+
+[[package]]
+name = "cfg-expr"
+version = "0.15.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
+dependencies = [
+ "smallvec",
+ "target-lexicon",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+
+[[package]]
+name = "chrono"
+version = "0.4.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
+dependencies = [
+ "iana-time-zone",
+ "num-traits",
+ "serde",
+ "windows-link 0.2.1",
+]
+
+[[package]]
+name = "combine"
+version = "4.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
+dependencies = [
+ "bytes",
+ "memchr",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+
+[[package]]
+name = "cookie"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
+dependencies = [
+ "time",
+ "version_check",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
+[[package]]
+name = "core-graphics"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
+dependencies = [
+ "bitflags 2.10.0",
+ "core-foundation",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
+dependencies = [
+ "bitflags 2.10.0",
+ "core-foundation",
+ "libc",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "cssparser"
+version = "0.29.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa"
+dependencies = [
+ "cssparser-macros",
+ "dtoa-short",
+ "itoa",
+ "matches",
+ "phf 0.10.1",
+ "proc-macro2",
+ "quote",
+ "smallvec",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "cssparser-macros"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
+dependencies = [
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "ctor"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
+dependencies = [
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "darling"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "deranged"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
+dependencies = [
+ "powerfmt",
+ "serde_core",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "dirs"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
+dependencies = [
+ "libc",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "dispatch"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+
+[[package]]
+name = "dispatch2"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "dlopen2"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4"
+dependencies = [
+ "dlopen2_derive",
+ "libc",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "dlopen2_derive"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "dpi"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "dtoa"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590"
+
+[[package]]
+name = "dtoa-short"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
+dependencies = [
+ "dtoa",
+]
+
+[[package]]
+name = "dunce"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
+
+[[package]]
+name = "dyn-clone"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
+
+[[package]]
+name = "embed-resource"
+version = "3.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e"
+dependencies = [
+ "cc",
+ "memchr",
+ "rustc_version",
+ "toml 0.9.11+spec-1.1.0",
+ "vswhom",
+ "winreg",
+]
+
+[[package]]
+name = "embed_plist"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
+
+[[package]]
+name = "endi"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"
+
+[[package]]
+name = "enumflags2"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"
+dependencies = [
+ "enumflags2_derive",
+ "serde",
+]
+
+[[package]]
+name = "enumflags2_derive"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "erased-serde"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3"
+dependencies = [
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "event-listener"
+version = "5.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
+dependencies = [
+ "concurrent-queue",
+ "parking",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "event-listener-strategy"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
+dependencies = [
+ "event-listener",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+
+[[package]]
+name = "fdeflate"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "field-offset"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
+dependencies = [
+ "memoffset",
+ "rustc_version",
+]
+
+[[package]]
+name = "file-organizer"
+version = "0.1.0"
+dependencies = [
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-build",
+ "tauri-plugin-fs",
+ "tauri-plugin-opener",
+]
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
+
+[[package]]
+name = "flate2"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
+dependencies = [
+ "foreign-types-macros",
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-macros"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
+
+[[package]]
+name = "futures-lite"
+version = "2.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "parking",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "futures-macro"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
+
+[[package]]
+name = "futures-task"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
+
+[[package]]
+name = "futures-util"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
+dependencies = [
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "gdk"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691"
+dependencies = [
+ "cairo-rs",
+ "gdk-pixbuf",
+ "gdk-sys",
+ "gio",
+ "glib",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gdk-pixbuf"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
+dependencies = [
+ "gdk-pixbuf-sys",
+ "gio",
+ "glib",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "gdk-pixbuf-sys"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
+dependencies = [
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "gdk-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango-sys",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "gdkwayland-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69"
+dependencies = [
+ "gdk-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "gdkx11"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe"
+dependencies = [
+ "gdk",
+ "gdkx11-sys",
+ "gio",
+ "glib",
+ "libc",
+ "x11",
+]
+
+[[package]]
+name = "gdkx11-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d"
+dependencies = [
+ "gdk-sys",
+ "glib-sys",
+ "libc",
+ "system-deps",
+ "x11",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi",
+ "wasip2",
+]
+
+[[package]]
+name = "gio"
+version = "0.18.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "gio-sys",
+ "glib",
+ "libc",
+ "once_cell",
+ "pin-project-lite",
+ "smallvec",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "gio-sys"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+ "winapi",
+]
+
+[[package]]
+name = "glib"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
+dependencies = [
+ "bitflags 2.10.0",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-task",
+ "futures-util",
+ "gio-sys",
+ "glib-macros",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "memchr",
+ "once_cell",
+ "smallvec",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "glib-macros"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
+dependencies = [
+ "heck 0.4.1",
+ "proc-macro-crate 2.0.2",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "glib-sys"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
+dependencies = [
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
+
+[[package]]
+name = "gobject-sys"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "gtk"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a"
+dependencies = [
+ "atk",
+ "cairo-rs",
+ "field-offset",
+ "futures-channel",
+ "gdk",
+ "gdk-pixbuf",
+ "gio",
+ "glib",
+ "gtk-sys",
+ "gtk3-macros",
+ "libc",
+ "pango",
+ "pkg-config",
+]
+
+[[package]]
+name = "gtk-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414"
+dependencies = [
+ "atk-sys",
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gdk-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango-sys",
+ "system-deps",
+]
+
+[[package]]
+name = "gtk3-macros"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d"
+dependencies = [
+ "proc-macro-crate 1.3.1",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hermit-abi"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "html5ever"
+version = "0.29.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "match_token",
+]
+
+[[package]]
+name = "http"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
+dependencies = [
+ "bytes",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+dependencies = [
+ "bytes",
+ "http",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+
+[[package]]
+name = "hyper"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "http",
+ "http-body",
+ "httparse",
+ "itoa",
+ "pin-project-lite",
+ "pin-utils",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "ipnet",
+ "libc",
+ "percent-encoding",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "log",
+ "wasm-bindgen",
+ "windows-core 0.62.2",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ico"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98"
+dependencies = [
+ "byteorder",
+ "png",
+]
+
+[[package]]
+name = "icu_collections"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_core"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
+dependencies = [
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
+
+[[package]]
+name = "icu_properties"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
+dependencies = [
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
+
+[[package]]
+name = "icu_provider"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+ "serde",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.16.1",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "infer"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7"
+dependencies = [
+ "cfb",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
+
+[[package]]
+name = "iri-string"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "is-docker"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "is-wsl"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
+dependencies = [
+ "is-docker",
+ "once_cell",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
+
+[[package]]
+name = "javascriptcore-rs"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc"
+dependencies = [
+ "bitflags 1.3.2",
+ "glib",
+ "javascriptcore-rs-sys",
+]
+
+[[package]]
+name = "javascriptcore-rs-sys"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "jni"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
+dependencies = [
+ "cesu8",
+ "cfg-if",
+ "combine",
+ "jni-sys",
+ "log",
+ "thiserror 1.0.69",
+ "walkdir",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "js-sys"
+version = "0.3.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "json-patch"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08"
+dependencies = [
+ "jsonptr",
+ "serde",
+ "serde_json",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "jsonptr"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "keyboard-types"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
+dependencies = [
+ "bitflags 2.10.0",
+ "serde",
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "kuchikiki"
+version = "0.8.8-speedreader"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2"
+dependencies = [
+ "cssparser",
+ "html5ever",
+ "indexmap 2.13.0",
+ "selectors",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libappindicator"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a"
+dependencies = [
+ "glib",
+ "gtk",
+ "gtk-sys",
+ "libappindicator-sys",
+ "log",
+]
+
+[[package]]
+name = "libappindicator-sys"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
+dependencies = [
+ "gtk-sys",
+ "libloading",
+ "once_cell",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.180"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "libredox"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616"
+dependencies = [
+ "bitflags 2.10.0",
+ "libc",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
+
+[[package]]
+name = "litemap"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
+
+[[package]]
+name = "lock_api"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "markup5ever"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18"
+dependencies = [
+ "log",
+ "phf 0.11.3",
+ "phf_codegen 0.11.3",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
+[[package]]
+name = "match_token"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+
+[[package]]
+name = "memchr"
+version = "2.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
+
+[[package]]
+name = "memoffset"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
+dependencies = [
+ "adler2",
+ "simd-adler32",
+]
+
+[[package]]
+name = "mio"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
+dependencies = [
+ "libc",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "muda"
+version = "0.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a"
+dependencies = [
+ "crossbeam-channel",
+ "dpi",
+ "gtk",
+ "keyboard-types",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "once_cell",
+ "png",
+ "serde",
+ "thiserror 2.0.17",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "ndk"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
+dependencies = [
+ "bitflags 2.10.0",
+ "jni-sys",
+ "log",
+ "ndk-sys",
+ "num_enum",
+ "raw-window-handle",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "ndk-context"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+
+[[package]]
+name = "ndk-sys"
+version = "0.6.0+11769913"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
+dependencies = [
+ "jni-sys",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
+[[package]]
+name = "nodrop"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+
+[[package]]
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c"
+dependencies = [
+ "num_enum_derive",
+ "rustversion",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7"
+dependencies = [
+ "proc-macro-crate 3.4.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "objc2"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"
+dependencies = [
+ "objc2-encode",
+ "objc2-exception-helper",
+]
+
+[[package]]
+name = "objc2-app-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
+dependencies = [
+ "bitflags 2.10.0",
+ "block2",
+ "libc",
+ "objc2",
+ "objc2-cloud-kit",
+ "objc2-core-data",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-core-image",
+ "objc2-core-text",
+ "objc2-core-video",
+ "objc2-foundation",
+ "objc2-quartz-core",
+]
+
+[[package]]
+name = "objc2-cloud-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-data"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-foundation"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
+dependencies = [
+ "bitflags 2.10.0",
+ "dispatch2",
+ "objc2",
+]
+
+[[package]]
+name = "objc2-core-graphics"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
+dependencies = [
+ "bitflags 2.10.0",
+ "dispatch2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-io-surface",
+]
+
+[[package]]
+name = "objc2-core-image"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-text"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+]
+
+[[package]]
+name = "objc2-core-video"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-io-surface",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
+
+[[package]]
+name = "objc2-exception-helper"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "objc2-foundation"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
+dependencies = [
+ "bitflags 2.10.0",
+ "block2",
+ "libc",
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-io-surface"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-javascript-core"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586"
+dependencies = [
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-quartz-core"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-security"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-ui-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
+dependencies = [
+ "bitflags 2.10.0",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-web-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
+dependencies = [
+ "bitflags 2.10.0",
+ "block2",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "objc2-javascript-core",
+ "objc2-security",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
+[[package]]
+name = "open"
+version = "5.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc"
+dependencies = [
+ "dunce",
+ "is-wsl",
+ "libc",
+ "pathdiff",
+]
+
+[[package]]
+name = "option-ext"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+
+[[package]]
+name = "ordered-stream"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "pango"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
+dependencies = [
+ "gio",
+ "glib",
+ "libc",
+ "once_cell",
+ "pango-sys",
+]
+
+[[package]]
+name = "pango-sys"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "parking"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-link 0.2.1",
+]
+
+[[package]]
+name = "pathdiff"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+
+[[package]]
+name = "phf"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+dependencies = [
+ "phf_shared 0.8.0",
+]
+
+[[package]]
+name = "phf"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
+dependencies = [
+ "phf_macros 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "phf"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
+dependencies = [
+ "phf_macros 0.11.3",
+ "phf_shared 0.11.3",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
+dependencies = [
+ "phf_generator 0.8.0",
+ "phf_shared 0.8.0",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
+dependencies = [
+ "phf_generator 0.11.3",
+ "phf_shared 0.11.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+dependencies = [
+ "phf_shared 0.8.0",
+ "rand 0.7.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
+dependencies = [
+ "phf_shared 0.11.3",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216"
+dependencies = [
+ "phf_generator 0.11.3",
+ "phf_shared 0.11.3",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+dependencies = [
+ "siphasher 0.3.11",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+dependencies = [
+ "siphasher 0.3.11",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
+dependencies = [
+ "siphasher 1.0.1",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "piper"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
+dependencies = [
+ "atomic-waker",
+ "fastrand",
+ "futures-io",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+
+[[package]]
+name = "plist"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07"
+dependencies = [
+ "base64 0.22.1",
+ "indexmap 2.13.0",
+ "quick-xml",
+ "serde",
+ "time",
+]
+
+[[package]]
+name = "png"
+version = "0.17.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "polling"
+version = "3.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
+dependencies = [
+ "cfg-if",
+ "concurrent-queue",
+ "hermit-abi",
+ "pin-project-lite",
+ "rustix",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "potential_utf"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
+dependencies = [
+ "zerovec",
+]
+
+[[package]]
+name = "powerfmt"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+dependencies = [
+ "zerocopy",
+]
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit 0.19.15",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
+dependencies = [
+ "toml_datetime 0.6.3",
+ "toml_edit 0.20.2",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"
+dependencies = [
+ "toml_edit 0.23.10+spec-1.0.0",
+]
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.20+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.105"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.38.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+ "rand_pcg",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.17",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "raw-window-handle"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+dependencies = [
+ "bitflags 2.10.0",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
+dependencies = [
+ "getrandom 0.2.17",
+ "libredox",
+ "thiserror 2.0.17",
+]
+
+[[package]]
+name = "ref-cast"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
+dependencies = [
+ "ref-cast-impl",
+]
+
+[[package]]
+name = "ref-cast-impl"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "regex"
+version = "1.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
+
+[[package]]
+name = "reqwest"
+version = "0.12.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"
+dependencies = [
+ "base64 0.22.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "js-sys",
+ "log",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tokio-util",
+ "tower",
+ "tower-http",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustix"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
+dependencies = [
+ "bitflags 2.10.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+
+[[package]]
+name = "ryu"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "schemars"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
+dependencies = [
+ "dyn-clone",
+ "indexmap 1.9.3",
+ "schemars_derive",
+ "serde",
+ "serde_json",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "schemars"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "schemars"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "schemars_derive"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde_derive_internals",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "selectors"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416"
+dependencies = [
+ "bitflags 1.3.2",
+ "cssparser",
+ "derive_more",
+ "fxhash",
+ "log",
+ "phf 0.8.0",
+ "phf_codegen 0.8.0",
+ "precomputed-hash",
+ "servo_arc",
+ "smallvec",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
+dependencies = [
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde-untagged"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058"
+dependencies = [
+ "erased-serde",
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "serde_derive_internals"
+version = "0.29.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.149"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+dependencies = [
+ "itoa",
+ "memchr",
+ "serde",
+ "serde_core",
+ "zmij",
+]
+
+[[package]]
+name = "serde_repr"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_with"
+version = "3.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7"
+dependencies = [
+ "base64 0.22.1",
+ "chrono",
+ "hex",
+ "indexmap 1.9.3",
+ "indexmap 2.13.0",
+ "schemars 0.9.0",
+ "schemars 1.2.0",
+ "serde_core",
+ "serde_json",
+ "serde_with_macros",
+ "time",
+]
+
+[[package]]
+name = "serde_with_macros"
+version = "3.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "serialize-to-javascript"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5"
+dependencies = [
+ "serde",
+ "serde_json",
+ "serialize-to-javascript-impl",
+]
+
+[[package]]
+name = "serialize-to-javascript-impl"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "servo_arc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741"
+dependencies = [
+ "nodrop",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+dependencies = [
+ "errno",
+ "libc",
+]
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
+
+[[package]]
+name = "siphasher"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+
+[[package]]
+name = "siphasher"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
+
+[[package]]
+name = "slab"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
+
+[[package]]
+name = "smallvec"
+version = "1.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+
+[[package]]
+name = "socket2"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
+dependencies = [
+ "libc",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "softbuffer"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3"
+dependencies = [
+ "bytemuck",
+ "js-sys",
+ "ndk",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation",
+ "objc2-quartz-core",
+ "raw-window-handle",
+ "redox_syscall",
+ "tracing",
+ "wasm-bindgen",
+ "web-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "soup3"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f"
+dependencies = [
+ "futures-channel",
+ "gio",
+ "glib",
+ "libc",
+ "soup3-sys",
+]
+
+[[package]]
+name = "soup3-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27"
+dependencies = [
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+
+[[package]]
+name = "string_cache"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f"
+dependencies = [
+ "new_debug_unreachable",
+ "parking_lot",
+ "phf_shared 0.11.3",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0"
+dependencies = [
+ "phf_generator 0.11.3",
+ "phf_shared 0.11.3",
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "swift-rs"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7"
+dependencies = [
+ "base64 0.21.7",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.114"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "system-deps"
+version = "6.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
+dependencies = [
+ "cfg-expr",
+ "heck 0.5.0",
+ "pkg-config",
+ "toml 0.8.2",
+ "version-compare",
+]
+
+[[package]]
+name = "tao"
+version = "0.34.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7"
+dependencies = [
+ "bitflags 2.10.0",
+ "block2",
+ "core-foundation",
+ "core-graphics",
+ "crossbeam-channel",
+ "dispatch",
+ "dlopen2",
+ "dpi",
+ "gdkwayland-sys",
+ "gdkx11-sys",
+ "gtk",
+ "jni",
+ "lazy_static",
+ "libc",
+ "log",
+ "ndk",
+ "ndk-context",
+ "ndk-sys",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "once_cell",
+ "parking_lot",
+ "raw-window-handle",
+ "scopeguard",
+ "tao-macros",
+ "unicode-segmentation",
+ "url",
+ "windows",
+ "windows-core 0.61.2",
+ "windows-version",
+ "x11-dl",
+]
+
+[[package]]
+name = "tao-macros"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
+
+[[package]]
+name = "tauri"
+version = "2.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a3868da5508446a7cd08956d523ac3edf0a8bc20bf7e4038f9a95c2800d2033"
+dependencies = [
+ "anyhow",
+ "bytes",
+ "cookie",
+ "dirs",
+ "dunce",
+ "embed_plist",
+ "getrandom 0.3.4",
+ "glob",
+ "gtk",
+ "heck 0.5.0",
+ "http",
+ "jni",
+ "libc",
+ "log",
+ "mime",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "objc2-web-kit",
+ "percent-encoding",
+ "plist",
+ "raw-window-handle",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "serialize-to-javascript",
+ "swift-rs",
+ "tauri-build",
+ "tauri-macros",
+ "tauri-runtime",
+ "tauri-runtime-wry",
+ "tauri-utils",
+ "thiserror 2.0.17",
+ "tokio",
+ "tray-icon",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "window-vibrancy",
+ "windows",
+]
+
+[[package]]
+name = "tauri-build"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17fcb8819fd16463512a12f531d44826ce566f486d7ccd211c9c8cebdaec4e08"
+dependencies = [
+ "anyhow",
+ "cargo_toml",
+ "dirs",
+ "glob",
+ "heck 0.5.0",
+ "json-patch",
+ "schemars 0.8.22",
+ "semver",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "tauri-winres",
+ "toml 0.9.11+spec-1.1.0",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-codegen"
+version = "2.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fa9844cefcf99554a16e0a278156ae73b0d8680bbc0e2ad1e4287aadd8489cf"
+dependencies = [
+ "base64 0.22.1",
+ "brotli",
+ "ico",
+ "json-patch",
+ "plist",
+ "png",
+ "proc-macro2",
+ "quote",
+ "semver",
+ "serde",
+ "serde_json",
+ "sha2",
+ "syn 2.0.114",
+ "tauri-utils",
+ "thiserror 2.0.17",
+ "time",
+ "url",
+ "uuid",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-macros"
+version = "2.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3764a12f886d8245e66b7ee9b43ccc47883399be2019a61d80cf0f4117446fde"
+dependencies = [
+ "heck 0.5.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "tauri-codegen",
+ "tauri-utils",
+]
+
+[[package]]
+name = "tauri-plugin"
+version = "2.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e1d0a4860b7ff570c891e1d2a586bf1ede205ff858fbc305e0b5ae5d14c1377"
+dependencies = [
+ "anyhow",
+ "glob",
+ "plist",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "toml 0.9.11+spec-1.1.0",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-plugin-fs"
+version = "2.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed390cc669f937afeb8b28032ce837bac8ea023d975a2e207375ec05afaf1804"
+dependencies = [
+ "anyhow",
+ "dunce",
+ "glob",
+ "percent-encoding",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "tauri",
+ "tauri-plugin",
+ "tauri-utils",
+ "thiserror 2.0.17",
+ "toml 0.9.11+spec-1.1.0",
+ "url",
+]
+
+[[package]]
+name = "tauri-plugin-opener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f"
+dependencies = [
+ "dunce",
+ "glob",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "open",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-plugin",
+ "thiserror 2.0.17",
+ "url",
+ "windows",
+ "zbus",
+]
+
+[[package]]
+name = "tauri-runtime"
+version = "2.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87f766fe9f3d1efc4b59b17e7a891ad5ed195fa8d23582abb02e6c9a01137892"
+dependencies = [
+ "cookie",
+ "dpi",
+ "gtk",
+ "http",
+ "jni",
+ "objc2",
+ "objc2-ui-kit",
+ "objc2-web-kit",
+ "raw-window-handle",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "thiserror 2.0.17",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "windows",
+]
+
+[[package]]
+name = "tauri-runtime-wry"
+version = "2.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "187a3f26f681bdf028f796ccf57cf478c1ee422c50128e5a0a6ebeb3f5910065"
+dependencies = [
+ "gtk",
+ "http",
+ "jni",
+ "log",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "once_cell",
+ "percent-encoding",
+ "raw-window-handle",
+ "softbuffer",
+ "tao",
+ "tauri-runtime",
+ "tauri-utils",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "windows",
+ "wry",
+]
+
+[[package]]
+name = "tauri-utils"
+version = "2.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76a423c51176eb3616ee9b516a9fa67fed5f0e78baaba680e44eb5dd2cc37490"
+dependencies = [
+ "anyhow",
+ "brotli",
+ "cargo_metadata",
+ "ctor",
+ "dunce",
+ "glob",
+ "html5ever",
+ "http",
+ "infer",
+ "json-patch",
+ "kuchikiki",
+ "log",
+ "memchr",
+ "phf 0.11.3",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "schemars 0.8.22",
+ "semver",
+ "serde",
+ "serde-untagged",
+ "serde_json",
+ "serde_with",
+ "swift-rs",
+ "thiserror 2.0.17",
+ "toml 0.9.11+spec-1.1.0",
+ "url",
+ "urlpattern",
+ "uuid",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-winres"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0"
+dependencies = [
+ "dunce",
+ "embed-resource",
+ "toml 0.9.11+spec-1.1.0",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
+dependencies = [
+ "fastrand",
+ "getrandom 0.3.4",
+ "once_cell",
+ "rustix",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+dependencies = [
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
+dependencies = [
+ "thiserror-impl 2.0.17",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "time"
+version = "0.3.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd"
+dependencies = [
+ "deranged",
+ "itoa",
+ "num-conv",
+ "powerfmt",
+ "serde_core",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca"
+
+[[package]]
+name = "time-macros"
+version = "0.2.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd"
+dependencies = [
+ "num-conv",
+ "time-core",
+]
+
+[[package]]
+name = "tinystr"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
+[[package]]
+name = "tokio"
+version = "1.49.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86"
+dependencies = [
+ "bytes",
+ "libc",
+ "mio",
+ "pin-project-lite",
+ "socket2",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "toml"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
+dependencies = [
+ "serde",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "toml_edit 0.20.2",
+]
+
+[[package]]
+name = "toml"
+version = "0.9.11+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46"
+dependencies = [
+ "indexmap 2.13.0",
+ "serde_core",
+ "serde_spanned 1.0.4",
+ "toml_datetime 0.7.5+spec-1.1.0",
+ "toml_parser",
+ "toml_writer",
+ "winnow 0.7.14",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.7.5+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap 2.13.0",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
+dependencies = [
+ "indexmap 2.13.0",
+ "serde",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.23.10+spec-1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"
+dependencies = [
+ "indexmap 2.13.0",
+ "toml_datetime 0.7.5+spec-1.1.0",
+ "toml_parser",
+ "winnow 0.7.14",
+]
+
+[[package]]
+name = "toml_parser"
+version = "1.0.6+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
+dependencies = [
+ "winnow 0.7.14",
+]
+
+[[package]]
+name = "toml_writer"
+version = "1.0.6+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607"
+
+[[package]]
+name = "tower"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
+dependencies = [
+ "bitflags 2.10.0",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "iri-string",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
+[[package]]
+name = "tower-service"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+
+[[package]]
+name = "tracing"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+dependencies = [
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "tray-icon"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c"
+dependencies = [
+ "crossbeam-channel",
+ "dirs",
+ "libappindicator",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation",
+ "once_cell",
+ "png",
+ "serde",
+ "thiserror 2.0.17",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+[[package]]
+name = "typeid"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+
+[[package]]
+name = "typenum"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb"
+
+[[package]]
+name = "uds_windows"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"
+dependencies = [
+ "memoffset",
+ "tempfile",
+ "winapi",
+]
+
+[[package]]
+name = "unic-char-property"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
+dependencies = [
+ "unic-char-range",
+]
+
+[[package]]
+name = "unic-char-range"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
+
+[[package]]
+name = "unic-common"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
+
+[[package]]
+name = "unic-ucd-ident"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987"
+dependencies = [
+ "unic-char-property",
+ "unic-char-range",
+ "unic-ucd-version",
+]
+
+[[package]]
+name = "unic-ucd-version"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
+dependencies = [
+ "unic-common",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+
+[[package]]
+name = "url"
+version = "2.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "urlpattern"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d"
+dependencies = [
+ "regex",
+ "serde",
+ "unic-ucd-ident",
+ "url",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
+[[package]]
+name = "uuid"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
+dependencies = [
+ "getrandom 0.3.4",
+ "js-sys",
+ "serde_core",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "version-compare"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "vswhom"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b"
+dependencies = [
+ "libc",
+ "vswhom-sys",
+]
+
+[[package]]
+name = "vswhom-sys"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "wasip2"
+version = "1.0.2+wasi-0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
+dependencies = [
+ "wit-bindgen",
+]
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.108"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"
+dependencies = [
+ "cfg-if",
+ "futures-util",
+ "js-sys",
+ "once_cell",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.108"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.108"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
+dependencies = [
+ "bumpalo",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.108"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "wasm-streams"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.85"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webkit2gtk"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a"
+dependencies = [
+ "bitflags 1.3.2",
+ "cairo-rs",
+ "gdk",
+ "gdk-sys",
+ "gio",
+ "gio-sys",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "gtk",
+ "gtk-sys",
+ "javascriptcore-rs",
+ "libc",
+ "once_cell",
+ "soup3",
+ "webkit2gtk-sys",
+]
+
+[[package]]
+name = "webkit2gtk-sys"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c"
+dependencies = [
+ "bitflags 1.3.2",
+ "cairo-sys-rs",
+ "gdk-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "gtk-sys",
+ "javascriptcore-rs-sys",
+ "libc",
+ "pkg-config",
+ "soup3-sys",
+ "system-deps",
+]
+
+[[package]]
+name = "webview2-com"
+version = "0.38.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a"
+dependencies = [
+ "webview2-com-macros",
+ "webview2-com-sys",
+ "windows",
+ "windows-core 0.61.2",
+ "windows-implement",
+ "windows-interface",
+]
+
+[[package]]
+name = "webview2-com-macros"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "webview2-com-sys"
+version = "0.38.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c"
+dependencies = [
+ "thiserror 2.0.17",
+ "windows",
+ "windows-core 0.61.2",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "window-vibrancy"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c"
+dependencies = [
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "raw-window-handle",
+ "windows-sys 0.59.0",
+ "windows-version",
+]
+
+[[package]]
+name = "windows"
+version = "0.61.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
+dependencies = [
+ "windows-collections",
+ "windows-core 0.61.2",
+ "windows-future",
+ "windows-link 0.1.3",
+ "windows-numerics",
+]
+
+[[package]]
+name = "windows-collections"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
+dependencies = [
+ "windows-core 0.61.2",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link 0.1.3",
+ "windows-result 0.3.4",
+ "windows-strings 0.4.2",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.62.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link 0.2.1",
+ "windows-result 0.4.1",
+ "windows-strings 0.5.1",
+]
+
+[[package]]
+name = "windows-future"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
+dependencies = [
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
+ "windows-threading",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.59.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "windows-link"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
+
+[[package]]
+name = "windows-link"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+
+[[package]]
+name = "windows-numerics"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
+dependencies = [
+ "windows-core 0.61.2",
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
+dependencies = [
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
+dependencies = [
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm 0.52.6",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.53.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+dependencies = [
+ "windows-link 0.2.1",
+ "windows_aarch64_gnullvm 0.53.1",
+ "windows_aarch64_msvc 0.53.1",
+ "windows_i686_gnu 0.53.1",
+ "windows_i686_gnullvm 0.53.1",
+ "windows_i686_msvc 0.53.1",
+ "windows_x86_64_gnu 0.53.1",
+ "windows_x86_64_gnullvm 0.53.1",
+ "windows_x86_64_msvc 0.53.1",
+]
+
+[[package]]
+name = "windows-threading"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
+dependencies = [
+ "windows-link 0.1.3",
+]
+
+[[package]]
+name = "windows-version"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631"
+dependencies = [
+ "windows-link 0.2.1",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+
+[[package]]
+name = "winnow"
+version = "0.5.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winnow"
+version = "0.7.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.55.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "wit-bindgen"
+version = "0.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+
+[[package]]
+name = "writeable"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
+
+[[package]]
+name = "wry"
+version = "0.53.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2"
+dependencies = [
+ "base64 0.22.1",
+ "block2",
+ "cookie",
+ "crossbeam-channel",
+ "dirs",
+ "dpi",
+ "dunce",
+ "gdkx11",
+ "gtk",
+ "html5ever",
+ "http",
+ "javascriptcore-rs",
+ "jni",
+ "kuchikiki",
+ "libc",
+ "ndk",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "objc2-web-kit",
+ "once_cell",
+ "percent-encoding",
+ "raw-window-handle",
+ "sha2",
+ "soup3",
+ "tao-macros",
+ "thiserror 2.0.17",
+ "url",
+ "webkit2gtk",
+ "webkit2gtk-sys",
+ "webview2-com",
+ "windows",
+ "windows-core 0.61.2",
+ "windows-version",
+ "x11-dl",
+]
+
+[[package]]
+name = "x11"
+version = "2.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
+dependencies = [
+ "libc",
+ "once_cell",
+ "pkg-config",
+]
+
+[[package]]
+name = "yoke"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
+dependencies = [
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "synstructure",
+]
+
+[[package]]
+name = "zbus"
+version = "5.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17f79257df967b6779afa536788657777a0001f5b42524fcaf5038d4344df40b"
+dependencies = [
+ "async-broadcast",
+ "async-executor",
+ "async-io",
+ "async-lock",
+ "async-process",
+ "async-recursion",
+ "async-task",
+ "async-trait",
+ "blocking",
+ "enumflags2",
+ "event-listener",
+ "futures-core",
+ "futures-lite",
+ "hex",
+ "libc",
+ "ordered-stream",
+ "rustix",
+ "serde",
+ "serde_repr",
+ "tracing",
+ "uds_windows",
+ "uuid",
+ "windows-sys 0.61.2",
+ "winnow 0.7.14",
+ "zbus_macros",
+ "zbus_names",
+ "zvariant",
+]
+
+[[package]]
+name = "zbus_macros"
+version = "5.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aad23e2d2f91cae771c7af7a630a49e755f1eb74f8a46e9f6d5f7a146edf5a37"
+dependencies = [
+ "proc-macro-crate 3.4.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "zbus_names",
+ "zvariant",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zbus_names"
+version = "4.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f"
+dependencies = [
+ "serde",
+ "winnow 0.7.14",
+ "zvariant",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "synstructure",
+]
+
+[[package]]
+name = "zerotrie"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+]
+
+[[package]]
+name = "zmij"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea"
+
+[[package]]
+name = "zvariant"
+version = "5.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "326aaed414f04fe839777b4c443d4e94c74e7b3621093bd9c5e649ac8aa96543"
+dependencies = [
+ "endi",
+ "enumflags2",
+ "serde",
+ "winnow 0.7.14",
+ "zvariant_derive",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zvariant_derive"
+version = "5.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba44e1f8f4da9e6e2d25d2a60b116ef8b9d0be174a7685e55bb12a99866279a7"
+dependencies = [
+ "proc-macro-crate 3.4.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.114",
+ "zvariant_utils",
+]
+
+[[package]]
+name = "zvariant_utils"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn 2.0.114",
+ "winnow 0.7.14",
+]
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
new file mode 100644
index 0000000..77e7f92
--- /dev/null
+++ b/src-tauri/Cargo.toml
@@ -0,0 +1,26 @@
+[package]
+name = "file-organizer"
+version = "0.1.0"
+description = "A Tauri App"
+authors = ["you"]
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[lib]
+# The `_lib` suffix may seem redundant but it is necessary
+# to make the lib name unique and wouldn't conflict with the bin name.
+# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
+name = "file_organizer_lib"
+crate-type = ["staticlib", "cdylib", "rlib"]
+
+[build-dependencies]
+tauri-build = { version = "2", features = [] }
+
+[dependencies]
+tauri = { version = "2", features = [] }
+tauri-plugin-opener = "2"
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+tauri-plugin-fs = "2.4.5"
+
diff --git a/src-tauri/build.rs b/src-tauri/build.rs
new file mode 100644
index 0000000..d860e1e
--- /dev/null
+++ b/src-tauri/build.rs
@@ -0,0 +1,3 @@
+fn main() {
+    tauri_build::build()
+}
diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json
new file mode 100644
index 0000000..d7ef20b
--- /dev/null
+++ b/src-tauri/capabilities/default.json
@@ -0,0 +1,22 @@
+{
+  "$schema": "../gen/schemas/desktop-schema.json",
+  "identifier": "default",
+  "description": "Capability for the main window",
+  "windows": ["main"],
+  "permissions": [
+    "core:default",
+    "opener:default",
+    "fs:default",
+    "fs:read-all",
+    "fs:write-all",
+    "fs:allow-rename",
+    "fs:allow-mkdir",
+    "fs:allow-exists",
+    "fs:allow-watch",
+    "fs:read-dirs",
+    {
+      "identifier": "fs:scope",
+      "allow": [{ "path": "**/*" }]
+    }
+  ]
+}
diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png
new file mode 100644
index 0000000000000000000000000000000000000000..6be5e50e9b9ae84d9e2ee433f32ef446495eaf3b
GIT binary patch
literal 3512
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

literal 0
HcmV?d00001

diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..e81becee571e96f76aa5667f9324c05e5e7a4479
GIT binary patch
literal 7012
zcmbVRhd10$wEyl}tP&+^)YVI(cM?|boe*`EAflJ(td=N=)q)^ML`czsM6^|+Bsw9{
zRxcr}zQo#ne((JUZ_b&yGjs0DnR90D=ibkqR5KIZYm{u1003Om*VD290MJzz1VG8I
zghNo3$CaQ6(7P8508|YBRS-~E%=({7u!XJ$P&2~u=V}1)R5w-!fO-@a-h~tZ*v|E}
z)UConyDt}l7;UoqkF36Q(znu2&;PA10!d*~p4ENpMbz?r+@PQ{MTUb1|7*T6z)FB~
zil2(zBtyMbF>;>;YG>)$qf`!S?sVx|uX~h;#^2)qS-lr5`eB=xj`VYjS8X{eYvqSCp!MVQ+Zp)ah!BOx=<<)3_%H{42A-g}l-uWe_bd
zKmuE<1$6Cm4{Ur*DPRCoVkX)`R-k#@gC0(4##3?N&+rs2dc29|tL>p|VuZrAb9JK&
zu{fyJ_ck5GVdO`1s(8Q(hzs^@I>vkbt=CxD`%fZW@OrB7f}n7S
zw;MjWo)({rDJ~hK-aI$VGS)_z6L!~E>Sw6VryiT=rA^<5<)LCh@l9Q9guNI_1-`wRLpA_?^qeI@{^Zz{+lxCXjoOEdxXE6j-
z-}9&QGt)!@Lv$n&M0F*?Hb^el0wLG3ZEh`FC7fc?dC$UOXV;wR?D<@Fx%}@lCaE@K
zIe00?Dp@Oh{qg!N38;Yn{)LzJuvpv1zn$1R(Led#p|BoLjY%v((9Ybm
z*H%8*p0=q|^Sip^4d*N28NWotn@mYF!A9x=%ax4iXabcaAT^36kx<~Xx_9Z
zmX)Zbg@R;9>VW8w!AtFGN20whdPb6jV6zmUw`CA5Y~Jtt{stZLXe@PlM@=iR@?l%lMcTv-0ZzU_U#FCgjGl9SWhR#KYD8+^q?uLyD
zO|^I%UB9q-$qloS&)ueZ-L=kPvH{M2=gZgt5NnQWGVW{GIcM9AZ-3@9r3p02?cOQ!
z6<-Ax;vK=O(lb6SU&z$FE|NJ7tIQ2V>$uunOUI1U9{mf5g#oJ*fnO^A5o2jQ|85>b
zxiFGScj!nQE6RN5JEjpG8HtPtYK%QTar{@da0B~8Gioh}Bu(t?6YSVbRMB;ezkU$dH2D9WD2x=-fhMo+Xrmz_NhjTC>f*Kw4P
zCFIf?MYz_(N*>U}tV$}LObr)ZQ6gOh3yM*;Xowm7?{w(iu=5vV?>{(BC8}Eqv&Hmve6M6KY
z(yc~_FL9R9AiV<_N~x_e=q`H=P6=SraZcXHy__lEyWKbCwW+zLmR*g;T+5bQuWmnW
z>&^mpczmZLymWbQ(`LBo>Awvj&S+_>^0BGOi>j^1<;88Z|(NUz;t&t6tm)8}ZfC3K(_uHgh_ih($^E!prj$VF1Wn
zVsVh@d4g6UzEwgH7f?&fm`a=c0VoElycf8Xs>}BwC!_lmvR~NSTP+M8Va5J&-uUw3
zkm&#$BSn~0`#mE<-F`2qy9>v0Hp*8zS_0kb6QKOb&}l7}5u>I^R!nbGvUgg0doF4|
zCTlnSV5i=KID}qvz{fliGV6L=u1UX@B@pzlP-D4R9|WhA6reJVbGX0RIQK#A`yvA>
zpbj^aklJmQE21PMBO2@`BNvY}Ru`m-*8`2jKR#bzdB^x;KL77ov_G?_n{5&!etI4E
zzRj|hqdqqMW7&fn7t0b29wlhUe*?3>72W_0LF*E&57{;b+1JHi{yJkKIgg`H2yUA5
z?ft#B19b`5)ZA1_;&lst06-8%vi;8CpT9_`)n8cNAn-6#A`h60+e*JJNT^)lNbGnpq7O4IT;4OqFpvVOBgHJrdIiISpB_%g}P3%LTXGy{Gxy
zU|>bk;iKN2+Vq2m!Fr`0sf>WGq2UyBhw`4Gbn>%gw)JuMf?tn$fF^j)<=6a~jL{=a
zvp`UtgTIFmR@_!L=oauo^I!8r3>;?4soM7*aeWL-Do7lWKxD5!%U{UrMaY&Q8LQ&&oMA
z(IdMY8o%{Pz4&ljBVA{Q6iyYBk<%}uG|SE)sPNibY9{Z!R|B=RsW50OOUkYYeCF4Y
z|AGS>h<7dU18Shbm$?4#ZCMC?Z+^QQAg_+anCE^ruJ{DQSq4`VYI3oT3|$Nt$lDQ8
z)>rz~XD)z?8ZK+c1iBU7imvM8K1-oBO8n5K`ugqxPgByg7T}F9c4s>+Qb|jto;_wMBmB28Ycg=bmpXr_eU%4kv44A0ILV-n;&gI0GBDD1y&W}Uzxl2vlg<_T(41u
zfKt8}C6r37nkv?w?odQ*#;_F_Q|rI_MrzNX)93XO;9x`dCUC3RR0C`7GD9X_={|HD
zC-3TrtFml2f!SaFV`t=t3|OqAbF(hfio(fnLlT|6beHB=#W{2}0`tXy>>*?4;+7lV
zYQC-0agzK56iVxN%#*KT`o
zzx!1g@-DB>be(RfI8;iPl%A^g-Yl&xGoVRlsyh`#c6|!`OyLHl3Blgj`*zn0ap0h~!NXz?Zt*&Kj%LpRR
zOa6H?3%(Ca8I})0W4*Vq<1w<5&*`d`{d1j&B^7c@*fD)SOGTggpxg1Vo>5K9
zy`8yA+mwS!me^MFCk>Zo`wHm_BDlFEW`W{6?G{dqt!b@fN-@5(Tc}RcyyMHC<*@z7
z(6aB5=3*DXkNYpp_g&%!pE-+2Y`1;=$j5WU8#+HXevdQty3>I~sMJ~c0Pd3kPfuLy
z5zDp^(DDVv%S6De;l&gPIdz4DrRf>1oFSGLI;I1{O&>stES{Ay?3A%f!>@m;CMQH7
zltkY@2e#^+8@o$aYY}*{GKMq$@8g0u-rfawjwFBl+0i>5$uN4}g%xR2tF_PzYF$QK
zu!B+xF8rPFwj+l%*tNmF)TV~4RqC6n1
ziCF|kZuIFU5e`v%M<@I5!R{Ui<^%wfa~uFo{_G
z!vE%i*D)va{)^vY*@l}HioB-jMC@_uB#ZR(ss~s&0ns_)d!I$w8I>pA6qKp|0N=7J
zJlz~_zcVb@`3Bf3Dsg%nLz%<|y-}$bzg0t2;xO?G@l4Xv{?WKnVACRD>6p{;B5>2G
zh&Pe)Y3X*zUK~e`9B>fM)2?=(g)sV8soE*J<tI3{xUUc
z>QMEw1i&RTcGrkghC&&M)k-;DWkR6|F9%2Cs=QOZCBL01@ZP;Z#cs@UUU2rm0ThGo
zP-^9&<-_!Qo@^CjpY)Blt*#xcZ$<^`d?3}Ci#ji=*j2o|#G1`@FPaZgz-NeyS2i?e
zccNB!z^$H^R7AB%U~L?^&L%}*qBswG9eT!D`TLb^)RpQ07{)#~zL#I5BTvw@JzQ6w
zhJ4%Kj2Un)KIk9DEygl6(O%L@2?6433vv0>15oQ*3YVPOG$DL`wuPkkU-_e7XQJ`E
z;SCh8h&&q*`0Ytu#uWY-7Z1&c$Lnu}CTlhCz)`p#4$f3DOc61odffv$!x@slp>NWK
zdX52XEP-3l0zl8_PFQ~eCR^}+ha7XIJ7M#VrJGM27UaaUaS8&*YTqy-z>^l>o5vxM
zRnw$j+fw|Yc_%xncJrS#(>W&oSD^Q!UupJz9^K>x*3Ubb6qA;V04fG)Q;}%nOh@a@ce8QZlcy
zc3|xfJb^L1Twfc#`r8ncFbveugS6)S6?qnH9!zm2oX$3cHvKxR8!vioMA6xAO2m}I
z_3Wg0skWXwC9dUKU4$yVtDAEb_Aj*m8Q|T-87^9I6DLU(x8O{zwC<&RsA`>F0Y%u}
z#j~rKzLEnkWp6JciYs)Usr|i7uOIlpvXwo}igq;sEVfUpx|+Ay<1mK)p8X%;+OMtq
zY8!<}0ne4Q9@=-+lK!8E&z`s3A}58xf`0z;f7C>jHPQwg4Rj%*
z(SosTOk|YLYta%go>U}>4?2;e-~5j#df00hKObENO4&lFLmu=SK;TYm^55xhcv?G$
zy$p?fwDc>qYo|1|oe}mkFtQZ^4`+epWEBebld7J0)6fqMXa6()kKT
zKnkxSiT@+j!gV`SU5{t~$K-Pf+TKbTo$NW=M9CXY{vtwSI}VO94ilNBYzt
zoa8keqkQ02N$w71ibs_aE_F7P=ZtD}UuD)UW^PI#_Dc6Fy^o7JRHRn1i2Y?r5kPzs
zyY{hIqtoc-A)ierVHVhx|h
zri`g_ZIJ!Esm!Sux)4K2I(cn(fUkTDCo$gXm`Zl{0b64w@2h9W-LQM6=C<7y-doKFLUA%~4>`rc(HkX`vk@3T%C4^qVP3`SEB
z{mJ_@#WNSWL~F%YgAWaxS^w^8(zf*^-9UX(YV@L&;jd1%!n5lu%R67cs;dZHAde8X
zK%N>tivdF56Zo@^D=&7eJ+;DB)El)beYC=r1^DANlF09cPcNW9V;^#g}@|W
z!3eiwiUr1U=P52IQH`VY)P@Yw*X_gIX)gPPk1{%6ZM0+dVieVL!ih{Bn;j}1^p{@0
zX;JN1{N|?Y`f+xux{zEM7r3lHG~=@fzY)1eX#W2?*p!j(FKXfzl?@+XW>BnOiuh^M
zoT@s)jXjOL>)FkYj*>mqGP<3fSDcH#g0Zrl{C&AL<=VY~inebUWDzlqRL!rPkK!-s
zmbh2c?DNu23oyuh_(>?<3bC;@6J7WQrD^JZ*o!u;b>fwjZ@NeGzPA%m-kq_c95&7_
zX)m3>@Ju>mSYQVt`1&eXvQK27!M+e++G_S;_kGi#zOAs+w+ETE6k}5F(%sh5UYgm9Ii_HAh$ZwG7|fXXto|C`Yu=Z+)AWE;^_rB<@G#cW
zyx}6GuPp`8EKF8_@Ro*6$3EH-RTx8<1H(x@{OoMmlCC?WC*I(K+VNShFvA_
z#44N8Y+P!qKw&QTx>wlZ{GiVhQR&zuLPNzB%LqC@$E2~k<&HGucty&Z4J{7t^>6K{
zG4=Pf@7Ux+ho0(OAr31hj}>wMS2%5X{NU&*m;A2$@^kdxnowu=3u`v?#^r;O1zt%@
zHUrJRqvp1#C`kyHbpmo*QaV+q5mhOHJ{%
zzs}7>*N=v3gfyfj(9G408bY8x?)F6nS8y
z>t+|<->ZS)K*nn>{o9k(RTpHlNvqHP
zuJ{{D#@b&cKXmS~G~W!3w+365J1q)aKO{yhQ-FfufQh<4!}iN?Mrb9xt;6aZ`z$Xn
zVAhop+8K3~yjNX1*&%@-r~@1n1ud5I-%pT<;!i+eNst~DhNSz_4h&Kxr%U*v*Nhg?
zjl!8N)C$odMZBu%a$m(3R-zDRCuCqrk}F`g>3>+AdjF$Yj*=|?imJn_7O7!?j8=N`
zgNbtsav%9yqO2*)wdL;@Z^MB2v8vAX*c=n|Th}G>ypE1DG-_$LhzbG&t7;>RX&n~3
zr(ZLOi2v~kb&wAaT`qO**_s1EVA6$xZF`T@vbM^c-@&|8vBlvL3QPRlylwtMbN~tC
zAB|4~;ydT{3mF@p0@RUT^>1H*8rTKb9!CgqufH4#AkK2f364d=fX9D!{|=2_9yv$e
z-c)s`Pd2G>L$@9&6E4pB1#?lyQijJk6&w2
Sh@|Ye~|0>}wMPLT8jm@Y!H33Sz}5aFI6
zM9Lzqz|;A*0sGs=2A1uU!1nk2dGF7knQwr99SAFen)x(eCO;F8y2C~0FD1YxRTPcy
zPWVxkUYmeuz}Tv?7&Fe-!UE{)ZW)Mb;H)^#eHDv$`dkZGguJz@^MA!ZNGAUqt{|0H
zpZ7Ch9S`q5!>R%}>}62!+(T^evyO+ImSo2wpu)su4^3nw5(%)KD%gbSev^*HZZ&3(
z#&c@Z0gH|}Ck)w6fh0&NBJ62ib%R}(3@$VFl*_#l2W$wQ-~4RmZZAt5O*^2Q5}Xr8Hy@c`#pM?kc?hFWxRXr*mUfUCXf4ka5DD~
zat6d85COB05l#(P9*cQZ3EC8fVdS~?&vN#rce(aF9@xp80O2{{FBvU+{X>Hoh;xI`
z{$e^Nw1y*VbO8wv`8|-m?NwNaKGTGaF{P^JLB^DbOYWIbn%eT`*!^C1H36=O8Z-M>
zkD~88ry`eSo`tEBN4>w7OWZwUzlh{WM1m8R6zepqGcGMaV7vWY9b?K4b6~|HVG)ec
wi>I@ws#sZo7or4_*4M>7;p5{nr2pZ?Uu4>Krr0kU)&Kwi07*qoM6N<$f)&@lf&c&j

literal 0
HcmV?d00001

diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ca4f27198838968bd60ed7d371bfa23496b7fe5
GIT binary patch
literal 2863
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
Y2S8W#vM)6=T>t<807*qoM6N<$f*y@n<^TWy

literal 0
HcmV?d00001

diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..c021d2ba76619c08969ab688db3b27f29257aa6f
GIT binary patch
literal 7737
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

literal 0
HcmV?d00001

diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..621970023096ed9f494ba18ace15421a45cd65fa
GIT binary patch
literal 903
zcmV;219<$2P)2
z+CUKPMqaqGiH;zb!R4$B-WXS^YzQr=@UH>k4?*L)&R=zYjBrZenKdc9|JlS$SO*RJ
zKt8FSTDAdk1g_WPAO!p^V!AuL;Lm;uQyV;zKq)J3i(;q*;k+pD%f3eltU`PYdy9(k0&%`
zuWAPcV6|-y?|?7O1W!KSK}pbk8#~!|FA@(VJkt^V@0lio{afoAeo*f&$W2s6${5!1eKvAGD2$GZwSB98L2ZVS-
zKn8ENRkZ*sb!@QugOrQNK3(sy1v%J#m|rpB+h|Nkqa3FRT>74xSs{#&saU2Lf!_Iq
zKmuKAESh`gs!fneGWn+nf}l?7jE$HW!Af&vE5=G!QU)U2v&HLIBGXKk4nQx{hsHjL
zLPMAo5=*uInFbq7(aa`Y2VX5wCmaeqvECOFv)a>0t>ZaEb*cJccER=BB?KFZhV$c^
znL*l8x*UYZv4WK|j?~Jt6~~F%{pk~z5A*>^M`?r5m9@RJ_x|uEtX(6Vk@Y()MVto*
z93wr)%3m%|#OZ~srm>zF(JvDuTq*@;d&^>_BJm5hOU`3FjG70L#Vzv9I?`<7$T@

jU?lMi@tgxr7CqX_r3uw^y4tVU3Pm0sw;|1WSUO%?=bG`*Kmz6u4{#ti;T7AWIBAEh!(Y zz>O01&#X?Ds@L)Sb{CkG#Yz4$3o d@96)?#cz^xWoA}>B$xmI002ovPDHLkV1l3&k#zt7 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc04839491e66c07b16ab03743c0c53b4109cc GIT binary patch literal 8591 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 JPDHLkV1lm|RXG3v literal 0 HcmV?d00001 diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..63440d7984936a9caa89275928d8dce97e4d033b GIT binary patch literal 2011 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∓t$dRJGIadE?vc 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 Kx8Vjl{{H|h@<;Lj literal 0 HcmV?d00001 diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cd2619e0b5ec089cbba5ec7b03ddf2b1dfceb6 GIT binary patch literal 14183 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

5l#v3A#xI3*z~1~fvo9Q(N^(==!|_FZ z*duZ=+M1~)8E|otX8KNZlr?qels#x_1Xq@9IIw~@9uAREJVH)Xw^}UclF6327}E42 zT)E&?U%TK?(+K7%R!`H5oX0i)4Qn5??Iw3p5J~6_u+aWehY{DSn}3V2p$bgjnAu?o)v@iC254fXeMv50$9YrpU`N?u@QIWs)T?SP|fa}(|9 zqAX+!7`cx=4)cCBg5h~pu(?@9`)aCr#oyz$ld=#RFxYCNZCZls@4v2~*e-t6PEVvV z&bbK3b3wt(Coc!ufAbXXC<**#HQ%J9k`New6iG<5RjtO4XVO?dCvwxD{kJ#tfQr(X zg^NTwF-FwAeS_{V4bfel8l`~NbfrTR2s!G>WduFWxH(t~aK4q=6rEE^$+Uox>gJO2 z{L<;6Q6nHa5#ZEM>H58not!)z(6*_=^~8}jWf*IG$AUKVWOZ4?)GfF z+BM#*wKKmLFD7E~W3U!$IVm$k_k1f&Kz6WV8@55P?r~bcg-Za-!rvW?ns&)KOGT2~ zlkAyqhQj=P$Eg3w#K~}zH@J5bo-BfHjInKSz$@?+Z)NPD4pHj^_Qxmi`UqoTy=`sV zLVxrXGuBr=QRm|}wg75yetQQK4fY3#P_~J}zEfPnb2C4Wo!E(d*(cA;b?7$g2in<( zPn)ghX}nzJPmb6(3Dpeg_GW~Hc}Lt=lgsSZz z!5QXyz7KaR;D`3Ee}d`af{H>WWZ|Io1QI3~4Ll_`g1(cRnhLK73Ro)7zPCd={1W2x zRp%Xlvv4>!<2@}$hz|!V{T}_eHx2xkLl^hQoZTCnsjCl|W_@5Fx2(+j0ogy&Y+;L- z<)G$*CiN7hOm^s!{U>1F7U=iNk{+u~dAC!eDz%=|glFW0jEZU1&o(G_c#wTxUjnG} z#cg3>jEpUi#Mlq@t?Msg_#geK^Lx@DyHWf7=AS5vVyM7YOjvUVCfcpVR<(+5!H?9- zySI6s>o3m&*zr||=wcPGyBkQV`EWJl@bH8qobjOp+sXL*)=&yX)8aAbf~tGv?a2SN zu^Ddo-z?DWk9h9Yz#5p^NU#x~wYSd?H@w@!2Gb4G)6-utEMV~~M85Br5ff(v5O1|T z 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 100) + { + stack.push(_Utils_Tuple2(x,y)); + return true; + } + + /**/ + if (x.$ === 'Set_elm_builtin') + { + x = $elm$core$Set$toList(x); + y = $elm$core$Set$toList(y); + } + if (x.$ === 'RBNode_elm_builtin' || x.$ === 'RBEmpty_elm_builtin') + { + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); + } + //*/ + + /**_UNUSED/ + if (x.$ < 0) + { + x = $elm$core$Dict$toList(x); + y = $elm$core$Dict$toList(y); + } + //*/ + + for (var key in x) + { + if (!_Utils_eqHelp(x[key], y[key], depth + 1, stack)) + { + return false; + } + } + return true; +} + +var _Utils_equal = F2(_Utils_eq); +var _Utils_notEqual = F2(function(a, b) { return !_Utils_eq(a,b); }); + + + +// COMPARISONS + +// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on +// the particular integer values assigned to LT, EQ, and GT. + +function _Utils_cmp(x, y, ord) +{ + if (typeof x !== 'object') + { + return x === y ? /*EQ*/ 0 : x < y ? /*LT*/ -1 : /*GT*/ 1; + } + + /**/ + if (x instanceof String) + { + var a = x.valueOf(); + var b = y.valueOf(); + return a === b ? 0 : a < b ? -1 : 1; + } + //*/ + + /**_UNUSED/ + if (typeof x.$ === 'undefined') + //*/ + /**/ + if (x.$[0] === '#') + //*/ + { + return (ord = _Utils_cmp(x.a, y.a)) + ? ord + : (ord = _Utils_cmp(x.b, y.b)) + ? ord + : _Utils_cmp(x.c, y.c); + } + + // traverse conses until end of a list or a mismatch + for (; x.b && y.b && !(ord = _Utils_cmp(x.a, y.a)); x = x.b, y = y.b) {} // WHILE_CONSES + return ord || (x.b ? /*GT*/ 1 : y.b ? /*LT*/ -1 : /*EQ*/ 0); +} + +var _Utils_lt = F2(function(a, b) { return _Utils_cmp(a, b) < 0; }); +var _Utils_le = F2(function(a, b) { return _Utils_cmp(a, b) < 1; }); +var _Utils_gt = F2(function(a, b) { return _Utils_cmp(a, b) > 0; }); +var _Utils_ge = F2(function(a, b) { return _Utils_cmp(a, b) >= 0; }); + +var _Utils_compare = F2(function(x, y) +{ + var n = _Utils_cmp(x, y); + return n < 0 ? $elm$core$Basics$LT : n ? $elm$core$Basics$GT : $elm$core$Basics$EQ; +}); + + +// COMMON VALUES + +var _Utils_Tuple0_UNUSED = 0; +var _Utils_Tuple0 = { $: '#0' }; + +function _Utils_Tuple2_UNUSED(a, b) { return { a: a, b: b }; } +function _Utils_Tuple2(a, b) { return { $: '#2', a: a, b: b }; } + +function _Utils_Tuple3_UNUSED(a, b, c) { return { a: a, b: b, c: c }; } +function _Utils_Tuple3(a, b, c) { return { $: '#3', a: a, b: b, c: c }; } + +function _Utils_chr_UNUSED(c) { return c; } +function _Utils_chr(c) { return new String(c); } + + +// RECORDS + +function _Utils_update(oldRecord, updatedFields) +{ + var newRecord = {}; + + for (var key in oldRecord) + { + newRecord[key] = oldRecord[key]; + } + + for (var key in updatedFields) + { + newRecord[key] = updatedFields[key]; + } + + return newRecord; +} + + +// APPEND + +var _Utils_append = F2(_Utils_ap); + +function _Utils_ap(xs, ys) +{ + // append Strings + if (typeof xs === 'string') + { + return xs + ys; + } + + // append Lists + if (!xs.b) + { + return ys; + } + var root = _List_Cons(xs.a, ys); + xs = xs.b + for (var curr = root; xs.b; xs = xs.b) // WHILE_CONS + { + curr = curr.b = _List_Cons(xs.a, ys); + } + return root; +} + + + +var _List_Nil_UNUSED = { $: 0 }; +var _List_Nil = { $: '[]' }; + +function _List_Cons_UNUSED(hd, tl) { return { $: 1, a: hd, b: tl }; } +function _List_Cons(hd, tl) { return { $: '::', a: hd, b: tl }; } + + +var _List_cons = F2(_List_Cons); + +function _List_fromArray(arr) +{ + var out = _List_Nil; + for (var i = arr.length; i--; ) + { + out = _List_Cons(arr[i], out); + } + return out; +} + +function _List_toArray(xs) +{ + for (var out = []; xs.b; xs = xs.b) // WHILE_CONS + { + out.push(xs.a); + } + return out; +} + +var _List_map2 = F3(function(f, xs, ys) +{ + for (var arr = []; xs.b && ys.b; xs = xs.b, ys = ys.b) // WHILE_CONSES + { + arr.push(A2(f, xs.a, ys.a)); + } + return _List_fromArray(arr); +}); + +var _List_map3 = F4(function(f, xs, ys, zs) +{ + for (var arr = []; xs.b && ys.b && zs.b; xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES + { + arr.push(A3(f, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_map4 = F5(function(f, ws, xs, ys, zs) +{ + for (var arr = []; ws.b && xs.b && ys.b && zs.b; ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES + { + arr.push(A4(f, ws.a, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_map5 = F6(function(f, vs, ws, xs, ys, zs) +{ + for (var arr = []; vs.b && ws.b && xs.b && ys.b && zs.b; vs = vs.b, ws = ws.b, xs = xs.b, ys = ys.b, zs = zs.b) // WHILE_CONSES + { + arr.push(A5(f, vs.a, ws.a, xs.a, ys.a, zs.a)); + } + return _List_fromArray(arr); +}); + +var _List_sortBy = F2(function(f, xs) +{ + return _List_fromArray(_List_toArray(xs).sort(function(a, b) { + return _Utils_cmp(f(a), f(b)); + })); +}); + +var _List_sortWith = F2(function(f, xs) +{ + return _List_fromArray(_List_toArray(xs).sort(function(a, b) { + var ord = A2(f, a, b); + return ord === $elm$core$Basics$EQ ? 0 : ord === $elm$core$Basics$LT ? -1 : 1; + })); +}); + + + +var _JsArray_empty = []; + +function _JsArray_singleton(value) +{ + return [value]; +} + +function _JsArray_length(array) +{ + return array.length; +} + +var _JsArray_initialize = F3(function(size, offset, func) +{ + var result = new Array(size); + + for (var i = 0; i < size; i++) + { + result[i] = func(offset + i); + } + + return result; +}); + +var _JsArray_initializeFromList = F2(function (max, ls) +{ + var result = new Array(max); + + for (var i = 0; i < max && ls.b; i++) + { + result[i] = ls.a; + ls = ls.b; + } + + result.length = i; + return _Utils_Tuple2(result, ls); +}); + +var _JsArray_unsafeGet = F2(function(index, array) +{ + return array[index]; +}); + +var _JsArray_unsafeSet = F3(function(index, value, array) +{ + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = array[i]; + } + + result[index] = value; + return result; +}); + +var _JsArray_push = F2(function(value, array) +{ + var length = array.length; + var result = new Array(length + 1); + + for (var i = 0; i < length; i++) + { + result[i] = array[i]; + } + + result[length] = value; + return result; +}); + +var _JsArray_foldl = F3(function(func, acc, array) +{ + var length = array.length; + + for (var i = 0; i < length; i++) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_foldr = F3(function(func, acc, array) +{ + for (var i = array.length - 1; i >= 0; i--) + { + acc = A2(func, array[i], acc); + } + + return acc; +}); + +var _JsArray_map = F2(function(func, array) +{ + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = func(array[i]); + } + + return result; +}); + +var _JsArray_indexedMap = F3(function(func, offset, array) +{ + var length = array.length; + var result = new Array(length); + + for (var i = 0; i < length; i++) + { + result[i] = A2(func, offset + i, array[i]); + } + + return result; +}); + +var _JsArray_slice = F3(function(from, to, array) +{ + return array.slice(from, to); +}); + +var _JsArray_appendN = F3(function(n, dest, source) +{ + var destLen = dest.length; + var itemsToCopy = n - destLen; + + if (itemsToCopy > source.length) + { + itemsToCopy = source.length; + } + + var size = destLen + itemsToCopy; + var result = new Array(size); + + for (var i = 0; i < destLen; i++) + { + result[i] = dest[i]; + } + + for (var i = 0; i < itemsToCopy; i++) + { + result[i + destLen] = source[i]; + } + + return result; +}); + + + +// LOG + +var _Debug_log_UNUSED = F2(function(tag, value) +{ + return value; +}); + +var _Debug_log = F2(function(tag, value) +{ + console.log(tag + ': ' + _Debug_toString(value)); + return value; +}); + + +// TODOS + +function _Debug_todo(moduleName, region) +{ + return function(message) { + _Debug_crash(8, moduleName, region, message); + }; +} + +function _Debug_todoCase(moduleName, region, value) +{ + return function(message) { + _Debug_crash(9, moduleName, region, value, message); + }; +} + + +// TO STRING + +function _Debug_toString_UNUSED(value) +{ + return ''; +} + +function _Debug_toString(value) +{ + return _Debug_toAnsiString(false, value); +} + +function _Debug_toAnsiString(ansi, value) +{ + if (typeof value === 'function') + { + return _Debug_internalColor(ansi, ''); + } + + if (typeof value === 'boolean') + { + return _Debug_ctorColor(ansi, value ? 'True' : 'False'); + } + + if (typeof value === 'number') + { + return _Debug_numberColor(ansi, value + ''); + } + + if (value instanceof String) + { + return _Debug_charColor(ansi, "'" + _Debug_addSlashes(value, true) + "'"); + } + + if (typeof value === 'string') + { + return _Debug_stringColor(ansi, '"' + _Debug_addSlashes(value, false) + '"'); + } + + if (typeof value === 'object' && '$' in value) + { + var tag = value.$; + + if (typeof tag === 'number') + { + return _Debug_internalColor(ansi, ''); + } + + if (tag[0] === '#') + { + var output = []; + for (var k in value) + { + if (k === '$') continue; + output.push(_Debug_toAnsiString(ansi, value[k])); + } + return '(' + output.join(',') + ')'; + } + + if (tag === 'Set_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Set') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Set$toList(value)); + } + + if (tag === 'RBNode_elm_builtin' || tag === 'RBEmpty_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Dict') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Dict$toList(value)); + } + + if (tag === 'Array_elm_builtin') + { + return _Debug_ctorColor(ansi, 'Array') + + _Debug_fadeColor(ansi, '.fromList') + ' ' + + _Debug_toAnsiString(ansi, $elm$core$Array$toList(value)); + } + + if (tag === '::' || tag === '[]') + { + var output = '['; + + value.b && (output += _Debug_toAnsiString(ansi, value.a), value = value.b) + + for (; value.b; value = value.b) // WHILE_CONS + { + output += ',' + _Debug_toAnsiString(ansi, value.a); + } + return output + ']'; + } + + var output = ''; + for (var i in value) + { + if (i === '$') continue; + var str = _Debug_toAnsiString(ansi, value[i]); + var c0 = str[0]; + var parenless = c0 === '{' || c0 === '(' || c0 === '[' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; + output += ' ' + (parenless ? str : '(' + str + ')'); + } + return _Debug_ctorColor(ansi, tag) + output; + } + + if (typeof DataView === 'function' && value instanceof DataView) + { + return _Debug_stringColor(ansi, '<' + value.byteLength + ' bytes>'); + } + + if (typeof File !== 'undefined' && value instanceof File) + { + return _Debug_internalColor(ansi, '<' + value.name + '>'); + } + + if (typeof value === 'object') + { + var output = []; + for (var key in value) + { + var field = key[0] === '_' ? key.slice(1) : key; + output.push(_Debug_fadeColor(ansi, field) + ' = ' + _Debug_toAnsiString(ansi, value[key])); + } + if (output.length === 0) + { + return '{}'; + } + return '{ ' + output.join(', ') + ' }'; + } + + return _Debug_internalColor(ansi, ''); +} + +function _Debug_addSlashes(str, isChar) +{ + var s = str + .replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t') + .replace(/\r/g, '\\r') + .replace(/\v/g, '\\v') + .replace(/\0/g, '\\0'); + + if (isChar) + { + return s.replace(/\'/g, '\\\''); + } + else + { + return s.replace(/\"/g, '\\"'); + } +} + +function _Debug_ctorColor(ansi, string) +{ + return ansi ? '\x1b[96m' + string + '\x1b[0m' : string; +} + +function _Debug_numberColor(ansi, string) +{ + return ansi ? '\x1b[95m' + string + '\x1b[0m' : string; +} + +function _Debug_stringColor(ansi, string) +{ + return ansi ? '\x1b[93m' + string + '\x1b[0m' : string; +} + +function _Debug_charColor(ansi, string) +{ + return ansi ? '\x1b[92m' + string + '\x1b[0m' : string; +} + +function _Debug_fadeColor(ansi, string) +{ + return ansi ? '\x1b[37m' + string + '\x1b[0m' : string; +} + +function _Debug_internalColor(ansi, string) +{ + return ansi ? '\x1b[36m' + string + '\x1b[0m' : string; +} + +function _Debug_toHexDigit(n) +{ + return String.fromCharCode(n < 10 ? 48 + n : 55 + n); +} + + +// CRASH + + +function _Debug_crash_UNUSED(identifier) +{ + throw new Error('https://github.com/elm/core/blob/1.0.0/hints/' + identifier + '.md'); +} + + +function _Debug_crash(identifier, fact1, fact2, fact3, fact4) +{ + switch(identifier) + { + case 0: + throw new Error('What node should I take over? In JavaScript I need something like:\n\n Elm.Main.init({\n node: document.getElementById("elm-node")\n })\n\nYou need to do this with any Browser.sandbox or Browser.element program.'); + + case 1: + throw new Error('Browser.application programs cannot handle URLs like this:\n\n ' + document.location.href + '\n\nWhat is the root? The root of your file system? Try looking at this program with `elm reactor` or some other server.'); + + case 2: + var jsonErrorString = fact1; + throw new Error('Problem with the flags given to your Elm program on initialization.\n\n' + jsonErrorString); + + case 3: + var portName = fact1; + throw new Error('There can only be one port named `' + portName + '`, but your program has multiple.'); + + case 4: + var portName = fact1; + var problem = fact2; + throw new Error('Trying to send an unexpected type of value through port `' + portName + '`:\n' + problem); + + case 5: + throw new Error('Trying to use `(==)` on functions.\nThere is no way to know if functions are "the same" in the Elm sense.\nRead more about this at https://package.elm-lang.org/packages/elm/core/latest/Basics#== which describes why it is this way and what the better version will look like.'); + + case 6: + var moduleName = fact1; + throw new Error('Your page is loading multiple Elm scripts with a module named ' + moduleName + '. Maybe a duplicate script is getting loaded accidentally? If not, rename one of them so I know which is which!'); + + case 8: + var moduleName = fact1; + var region = fact2; + var message = fact3; + throw new Error('TODO in module `' + moduleName + '` ' + _Debug_regionToString(region) + '\n\n' + message); + + case 9: + var moduleName = fact1; + var region = fact2; + var value = fact3; + var message = fact4; + throw new Error( + 'TODO in module `' + moduleName + '` from the `case` expression ' + + _Debug_regionToString(region) + '\n\nIt received the following value:\n\n ' + + _Debug_toString(value).replace('\n', '\n ') + + '\n\nBut the branch that handles it says:\n\n ' + message.replace('\n', '\n ') + ); + + case 10: + throw new Error('Bug in https://github.com/elm/virtual-dom/issues'); + + case 11: + throw new Error('Cannot perform mod 0. Division by zero error.'); + } +} + +function _Debug_regionToString(region) +{ + if (region.start.line === region.end.line) + { + return 'on line ' + region.start.line; + } + return 'on lines ' + region.start.line + ' through ' + region.end.line; +} + + + +// MATH + +var _Basics_add = F2(function(a, b) { return a + b; }); +var _Basics_sub = F2(function(a, b) { return a - b; }); +var _Basics_mul = F2(function(a, b) { return a * b; }); +var _Basics_fdiv = F2(function(a, b) { return a / b; }); +var _Basics_idiv = F2(function(a, b) { return (a / b) | 0; }); +var _Basics_pow = F2(Math.pow); + +var _Basics_remainderBy = F2(function(b, a) { return a % b; }); + +// https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/divmodnote-letter.pdf +var _Basics_modBy = F2(function(modulus, x) +{ + var answer = x % modulus; + return modulus === 0 + ? _Debug_crash(11) + : + ((answer > 0 && modulus < 0) || (answer < 0 && modulus > 0)) + ? answer + modulus + : answer; +}); + + +// TRIGONOMETRY + +var _Basics_pi = Math.PI; +var _Basics_e = Math.E; +var _Basics_cos = Math.cos; +var _Basics_sin = Math.sin; +var _Basics_tan = Math.tan; +var _Basics_acos = Math.acos; +var _Basics_asin = Math.asin; +var _Basics_atan = Math.atan; +var _Basics_atan2 = F2(Math.atan2); + + +// MORE MATH + +function _Basics_toFloat(x) { return x; } +function _Basics_truncate(n) { return n | 0; } +function _Basics_isInfinite(n) { return n === Infinity || n === -Infinity; } + +var _Basics_ceiling = Math.ceil; +var _Basics_floor = Math.floor; +var _Basics_round = Math.round; +var _Basics_sqrt = Math.sqrt; +var _Basics_log = Math.log; +var _Basics_isNaN = isNaN; + + +// BOOLEANS + +function _Basics_not(bool) { return !bool; } +var _Basics_and = F2(function(a, b) { return a && b; }); +var _Basics_or = F2(function(a, b) { return a || b; }); +var _Basics_xor = F2(function(a, b) { return a !== b; }); + + + +var _String_cons = F2(function(chr, str) +{ + return chr + str; +}); + +function _String_uncons(string) +{ + var word = string.charCodeAt(0); + return !isNaN(word) + ? $elm$core$Maybe$Just( + 0xD800 <= word && word <= 0xDBFF + ? _Utils_Tuple2(_Utils_chr(string[0] + string[1]), string.slice(2)) + : _Utils_Tuple2(_Utils_chr(string[0]), string.slice(1)) + ) + : $elm$core$Maybe$Nothing; +} + +var _String_append = F2(function(a, b) +{ + return a + b; +}); + +function _String_length(str) +{ + return str.length; +} + +var _String_map = F2(function(func, string) +{ + var len = string.length; + var array = new Array(len); + var i = 0; + while (i < len) + { + var word = string.charCodeAt(i); + if (0xD800 <= word && word <= 0xDBFF) + { + array[i] = func(_Utils_chr(string[i] + string[i+1])); + i += 2; + continue; + } + array[i] = func(_Utils_chr(string[i])); + i++; + } + return array.join(''); +}); + +var _String_filter = F2(function(isGood, str) +{ + var arr = []; + var len = str.length; + var i = 0; + while (i < len) + { + var char = str[i]; + var word = str.charCodeAt(i); + i++; + if (0xD800 <= word && word <= 0xDBFF) + { + char += str[i]; + i++; + } + + if (isGood(_Utils_chr(char))) + { + arr.push(char); + } + } + return arr.join(''); +}); + +function _String_reverse(str) +{ + var len = str.length; + var arr = new Array(len); + var i = 0; + while (i < len) + { + var word = str.charCodeAt(i); + if (0xD800 <= word && word <= 0xDBFF) + { + arr[len - i] = str[i + 1]; + i++; + arr[len - i] = str[i - 1]; + i++; + } + else + { + arr[len - i] = str[i]; + i++; + } + } + return arr.join(''); +} + +var _String_foldl = F3(function(func, state, string) +{ + var len = string.length; + var i = 0; + while (i < len) + { + var char = string[i]; + var word = string.charCodeAt(i); + i++; + if (0xD800 <= word && word <= 0xDBFF) + { + char += string[i]; + i++; + } + state = A2(func, _Utils_chr(char), state); + } + return state; +}); + +var _String_foldr = F3(function(func, state, string) +{ + var i = string.length; + while (i--) + { + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + state = A2(func, _Utils_chr(char), state); + } + return state; +}); + +var _String_split = F2(function(sep, str) +{ + return str.split(sep); +}); + +var _String_join = F2(function(sep, strs) +{ + return strs.join(sep); +}); + +var _String_slice = F3(function(start, end, str) { + return str.slice(start, end); +}); + +function _String_trim(str) +{ + return str.trim(); +} + +function _String_trimLeft(str) +{ + return str.replace(/^\s+/, ''); +} + +function _String_trimRight(str) +{ + return str.replace(/\s+$/, ''); +} + +function _String_words(str) +{ + return _List_fromArray(str.trim().split(/\s+/g)); +} + +function _String_lines(str) +{ + return _List_fromArray(str.split(/\r\n|\r|\n/g)); +} + +function _String_toUpper(str) +{ + return str.toUpperCase(); +} + +function _String_toLower(str) +{ + return str.toLowerCase(); +} + +var _String_any = F2(function(isGood, string) +{ + var i = string.length; + while (i--) + { + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + if (isGood(_Utils_chr(char))) + { + return true; + } + } + return false; +}); + +var _String_all = F2(function(isGood, string) +{ + var i = string.length; + while (i--) + { + var char = string[i]; + var word = string.charCodeAt(i); + if (0xDC00 <= word && word <= 0xDFFF) + { + i--; + char = string[i] + char; + } + if (!isGood(_Utils_chr(char))) + { + return false; + } + } + return true; +}); + +var _String_contains = F2(function(sub, str) +{ + return str.indexOf(sub) > -1; +}); + +var _String_startsWith = F2(function(sub, str) +{ + return str.indexOf(sub) === 0; +}); + +var _String_endsWith = F2(function(sub, str) +{ + return str.length >= sub.length && + str.lastIndexOf(sub) === str.length - sub.length; +}); + +var _String_indexes = F2(function(sub, str) +{ + var subLen = sub.length; + + if (subLen < 1) + { + return _List_Nil; + } + + var i = 0; + var is = []; + + while ((i = str.indexOf(sub, i)) > -1) + { + is.push(i); + i = i + subLen; + } + + return _List_fromArray(is); +}); + + +// TO STRING + +function _String_fromNumber(number) +{ + return number + ''; +} + + +// INT CONVERSIONS + +function _String_toInt(str) +{ + var total = 0; + var code0 = str.charCodeAt(0); + var start = code0 == 0x2B /* + */ || code0 == 0x2D /* - */ ? 1 : 0; + + for (var i = start; i < str.length; ++i) + { + var code = str.charCodeAt(i); + if (code < 0x30 || 0x39 < code) + { + return $elm$core$Maybe$Nothing; + } + total = 10 * total + code - 0x30; + } + + return i == start + ? $elm$core$Maybe$Nothing + : $elm$core$Maybe$Just(code0 == 0x2D ? -total : total); +} + + +// FLOAT CONVERSIONS + +function _String_toFloat(s) +{ + // check if it is a hex, octal, or binary number + if (s.length === 0 || /[\sxbo]/.test(s)) + { + return $elm$core$Maybe$Nothing; + } + var n = +s; + // faster isNaN check + return n === n ? $elm$core$Maybe$Just(n) : $elm$core$Maybe$Nothing; +} + +function _String_fromList(chars) +{ + return _List_toArray(chars).join(''); +} + + + + +function _Char_toCode(char) +{ + var code = char.charCodeAt(0); + if (0xD800 <= code && code <= 0xDBFF) + { + return (code - 0xD800) * 0x400 + char.charCodeAt(1) - 0xDC00 + 0x10000 + } + return code; +} + +function _Char_fromCode(code) +{ + return _Utils_chr( + (code < 0 || 0x10FFFF < code) + ? '\uFFFD' + : + (code <= 0xFFFF) + ? String.fromCharCode(code) + : + (code -= 0x10000, + String.fromCharCode(Math.floor(code / 0x400) + 0xD800, code % 0x400 + 0xDC00) + ) + ); +} + +function _Char_toUpper(char) +{ + return _Utils_chr(char.toUpperCase()); +} + +function _Char_toLower(char) +{ + return _Utils_chr(char.toLowerCase()); +} + +function _Char_toLocaleUpper(char) +{ + return _Utils_chr(char.toLocaleUpperCase()); +} + +function _Char_toLocaleLower(char) +{ + return _Utils_chr(char.toLocaleLowerCase()); +} + + + +/**/ +function _Json_errorToString(error) +{ + return $elm$json$Json$Decode$errorToString(error); +} +//*/ + + +// CORE DECODERS + +function _Json_succeed(msg) +{ + return { + $: 0, + a: msg + }; +} + +function _Json_fail(msg) +{ + return { + $: 1, + a: msg + }; +} + +function _Json_decodePrim(decoder) +{ + return { $: 2, b: decoder }; +} + +var _Json_decodeInt = _Json_decodePrim(function(value) { + return (typeof value !== 'number') + ? _Json_expecting('an INT', value) + : + (-2147483647 < value && value < 2147483647 && (value | 0) === value) + ? $elm$core$Result$Ok(value) + : + (isFinite(value) && !(value % 1)) + ? $elm$core$Result$Ok(value) + : _Json_expecting('an INT', value); +}); + +var _Json_decodeBool = _Json_decodePrim(function(value) { + return (typeof value === 'boolean') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a BOOL', value); +}); + +var _Json_decodeFloat = _Json_decodePrim(function(value) { + return (typeof value === 'number') + ? $elm$core$Result$Ok(value) + : _Json_expecting('a FLOAT', value); +}); + +var _Json_decodeValue = _Json_decodePrim(function(value) { + return $elm$core$Result$Ok(_Json_wrap(value)); +}); + +var _Json_decodeString = _Json_decodePrim(function(value) { + return (typeof value === 'string') + ? $elm$core$Result$Ok(value) + : (value instanceof String) + ? $elm$core$Result$Ok(value + '') + : _Json_expecting('a STRING', value); +}); + +function _Json_decodeList(decoder) { return { $: 3, b: decoder }; } +function _Json_decodeArray(decoder) { return { $: 4, b: decoder }; } + +function _Json_decodeNull(value) { return { $: 5, c: value }; } + +var _Json_decodeField = F2(function(field, decoder) +{ + return { + $: 6, + d: field, + b: decoder + }; +}); + +var _Json_decodeIndex = F2(function(index, decoder) +{ + return { + $: 7, + e: index, + b: decoder + }; +}); + +function _Json_decodeKeyValuePairs(decoder) +{ + return { + $: 8, + b: decoder + }; +} + +function _Json_mapMany(f, decoders) +{ + return { + $: 9, + f: f, + g: decoders + }; +} + +var _Json_andThen = F2(function(callback, decoder) +{ + return { + $: 10, + b: decoder, + h: callback + }; +}); + +function _Json_oneOf(decoders) +{ + return { + $: 11, + g: decoders + }; +} + + +// DECODING OBJECTS + +var _Json_map1 = F2(function(f, d1) +{ + return _Json_mapMany(f, [d1]); +}); + +var _Json_map2 = F3(function(f, d1, d2) +{ + return _Json_mapMany(f, [d1, d2]); +}); + +var _Json_map3 = F4(function(f, d1, d2, d3) +{ + return _Json_mapMany(f, [d1, d2, d3]); +}); + +var _Json_map4 = F5(function(f, d1, d2, d3, d4) +{ + return _Json_mapMany(f, [d1, d2, d3, d4]); +}); + +var _Json_map5 = F6(function(f, d1, d2, d3, d4, d5) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5]); +}); + +var _Json_map6 = F7(function(f, d1, d2, d3, d4, d5, d6) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6]); +}); + +var _Json_map7 = F8(function(f, d1, d2, d3, d4, d5, d6, d7) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); +}); + +var _Json_map8 = F9(function(f, d1, d2, d3, d4, d5, d6, d7, d8) +{ + return _Json_mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); +}); + + +// DECODE + +var _Json_runOnString = F2(function(decoder, string) +{ + try + { + var value = JSON.parse(string); + return _Json_runHelp(decoder, value); + } + catch (e) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'This is not valid JSON! ' + e.message, _Json_wrap(string))); + } +}); + +var _Json_run = F2(function(decoder, value) +{ + return _Json_runHelp(decoder, _Json_unwrap(value)); +}); + +function _Json_runHelp(decoder, value) +{ + switch (decoder.$) + { + case 2: + return decoder.b(value); + + case 5: + return (value === null) + ? $elm$core$Result$Ok(decoder.c) + : _Json_expecting('null', value); + + case 3: + if (!_Json_isArray(value)) + { + return _Json_expecting('a LIST', value); + } + return _Json_runArrayDecoder(decoder.b, value, _List_fromArray); + + case 4: + if (!_Json_isArray(value)) + { + return _Json_expecting('an ARRAY', value); + } + return _Json_runArrayDecoder(decoder.b, value, _Json_toElmArray); + + case 6: + var field = decoder.d; + if (typeof value !== 'object' || value === null || !(field in value)) + { + return _Json_expecting('an OBJECT with a field named `' + field + '`', value); + } + var result = _Json_runHelp(decoder.b, value[field]); + return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, field, result.a)); + + case 7: + var index = decoder.e; + if (!_Json_isArray(value)) + { + return _Json_expecting('an ARRAY', value); + } + if (index >= value.length) + { + return _Json_expecting('a LONGER array. Need index ' + index + ' but only see ' + value.length + ' entries', value); + } + var result = _Json_runHelp(decoder.b, value[index]); + return ($elm$core$Result$isOk(result)) ? result : $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, index, result.a)); + + case 8: + if (typeof value !== 'object' || value === null || _Json_isArray(value)) + { + return _Json_expecting('an OBJECT', value); + } + + var keyValuePairs = _List_Nil; + // TODO test perf of Object.keys and switch when support is good enough + for (var key in value) + { + if (Object.prototype.hasOwnProperty.call(value, key)) + { + var result = _Json_runHelp(decoder.b, value[key]); + if (!$elm$core$Result$isOk(result)) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Field, key, result.a)); + } + keyValuePairs = _List_Cons(_Utils_Tuple2(key, result.a), keyValuePairs); + } + } + return $elm$core$Result$Ok($elm$core$List$reverse(keyValuePairs)); + + case 9: + var answer = decoder.f; + var decoders = decoder.g; + for (var i = 0; i < decoders.length; i++) + { + var result = _Json_runHelp(decoders[i], value); + if (!$elm$core$Result$isOk(result)) + { + return result; + } + answer = answer(result.a); + } + return $elm$core$Result$Ok(answer); + + case 10: + var result = _Json_runHelp(decoder.b, value); + return (!$elm$core$Result$isOk(result)) + ? result + : _Json_runHelp(decoder.h(result.a), value); + + case 11: + var errors = _List_Nil; + for (var temp = decoder.g; temp.b; temp = temp.b) // WHILE_CONS + { + var result = _Json_runHelp(temp.a, value); + if ($elm$core$Result$isOk(result)) + { + return result; + } + errors = _List_Cons(result.a, errors); + } + return $elm$core$Result$Err($elm$json$Json$Decode$OneOf($elm$core$List$reverse(errors))); + + case 1: + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, decoder.a, _Json_wrap(value))); + + case 0: + return $elm$core$Result$Ok(decoder.a); + } +} + +function _Json_runArrayDecoder(decoder, value, toElmValue) +{ + var len = value.length; + var array = new Array(len); + for (var i = 0; i < len; i++) + { + var result = _Json_runHelp(decoder, value[i]); + if (!$elm$core$Result$isOk(result)) + { + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Index, i, result.a)); + } + array[i] = result.a; + } + return $elm$core$Result$Ok(toElmValue(array)); +} + +function _Json_isArray(value) +{ + return Array.isArray(value) || (typeof FileList !== 'undefined' && value instanceof FileList); +} + +function _Json_toElmArray(array) +{ + return A2($elm$core$Array$initialize, array.length, function(i) { return array[i]; }); +} + +function _Json_expecting(type, value) +{ + return $elm$core$Result$Err(A2($elm$json$Json$Decode$Failure, 'Expecting ' + type, _Json_wrap(value))); +} + + +// EQUALITY + +function _Json_equality(x, y) +{ + if (x === y) + { + return true; + } + + if (x.$ !== y.$) + { + return false; + } + + switch (x.$) + { + case 0: + case 1: + return x.a === y.a; + + case 2: + return x.b === y.b; + + case 5: + return x.c === y.c; + + case 3: + case 4: + case 8: + return _Json_equality(x.b, y.b); + + case 6: + return x.d === y.d && _Json_equality(x.b, y.b); + + case 7: + return x.e === y.e && _Json_equality(x.b, y.b); + + case 9: + return x.f === y.f && _Json_listEquality(x.g, y.g); + + case 10: + return x.h === y.h && _Json_equality(x.b, y.b); + + case 11: + return _Json_listEquality(x.g, y.g); + } +} + +function _Json_listEquality(aDecoders, bDecoders) +{ + var len = aDecoders.length; + if (len !== bDecoders.length) + { + return false; + } + for (var i = 0; i < len; i++) + { + if (!_Json_equality(aDecoders[i], bDecoders[i])) + { + return false; + } + } + return true; +} + + +// ENCODE + +var _Json_encode = F2(function(indentLevel, value) +{ + return JSON.stringify(_Json_unwrap(value), null, indentLevel) + ''; +}); + +function _Json_wrap(value) { return { $: 0, a: value }; } +function _Json_unwrap(value) { return value.a; } + +function _Json_wrap_UNUSED(value) { return value; } +function _Json_unwrap_UNUSED(value) { return value; } + +function _Json_emptyArray() { return []; } +function _Json_emptyObject() { return {}; } + +var _Json_addField = F3(function(key, value, object) +{ + var unwrapped = _Json_unwrap(value); + if (!(key === 'toJSON' && typeof unwrapped === 'function')) + { + object[key] = unwrapped; + } + return object; +}); + +function _Json_addEntry(func) +{ + return F2(function(entry, array) + { + array.push(_Json_unwrap(func(entry))); + return array; + }); +} + +var _Json_encodeNull = _Json_wrap(null); + + + +// TASKS + +function _Scheduler_succeed(value) +{ + return { + $: 0, + a: value + }; +} + +function _Scheduler_fail(error) +{ + return { + $: 1, + a: error + }; +} + +function _Scheduler_binding(callback) +{ + return { + $: 2, + b: callback, + c: null + }; +} + +var _Scheduler_andThen = F2(function(callback, task) +{ + return { + $: 3, + b: callback, + d: task + }; +}); + +var _Scheduler_onError = F2(function(callback, task) +{ + return { + $: 4, + b: callback, + d: task + }; +}); + +function _Scheduler_receive(callback) +{ + return { + $: 5, + b: callback + }; +} + + +// PROCESSES + +var _Scheduler_guid = 0; + +function _Scheduler_rawSpawn(task) +{ + var proc = { + $: 0, + e: _Scheduler_guid++, + f: task, + g: null, + h: [] + }; + + _Scheduler_enqueue(proc); + + return proc; +} + +function _Scheduler_spawn(task) +{ + return _Scheduler_binding(function(callback) { + callback(_Scheduler_succeed(_Scheduler_rawSpawn(task))); + }); +} + +function _Scheduler_rawSend(proc, msg) +{ + proc.h.push(msg); + _Scheduler_enqueue(proc); +} + +var _Scheduler_send = F2(function(proc, msg) +{ + return _Scheduler_binding(function(callback) { + _Scheduler_rawSend(proc, msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + +function _Scheduler_kill(proc) +{ + return _Scheduler_binding(function(callback) { + var task = proc.f; + if (task.$ === 2 && task.c) + { + task.c(); + } + + proc.f = null; + + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +} + + +/* STEP PROCESSES + +type alias Process = + { $ : tag + , id : unique_id + , root : Task + , stack : null | { $: SUCCEED | FAIL, a: callback, b: stack } + , mailbox : [msg] + } + +*/ + + +var _Scheduler_working = false; +var _Scheduler_queue = []; + + +function _Scheduler_enqueue(proc) +{ + _Scheduler_queue.push(proc); + if (_Scheduler_working) + { + return; + } + _Scheduler_working = true; + while (proc = _Scheduler_queue.shift()) + { + _Scheduler_step(proc); + } + _Scheduler_working = false; +} + + +function _Scheduler_step(proc) +{ + while (proc.f) + { + var rootTag = proc.f.$; + if (rootTag === 0 || rootTag === 1) + { + while (proc.g && proc.g.$ !== rootTag) + { + proc.g = proc.g.i; + } + if (!proc.g) + { + return; + } + proc.f = proc.g.b(proc.f.a); + proc.g = proc.g.i; + } + else if (rootTag === 2) + { + proc.f.c = proc.f.b(function(newRoot) { + proc.f = newRoot; + _Scheduler_enqueue(proc); + }); + return; + } + else if (rootTag === 5) + { + if (proc.h.length === 0) + { + return; + } + proc.f = proc.f.b(proc.h.shift()); + } + else // if (rootTag === 3 || rootTag === 4) + { + proc.g = { + $: rootTag === 3 ? 0 : 1, + b: proc.f.b, + i: proc.g + }; + proc.f = proc.f.d; + } + } +} + + + +function _Process_sleep(time) +{ + return _Scheduler_binding(function(callback) { + var id = setTimeout(function() { + callback(_Scheduler_succeed(_Utils_Tuple0)); + }, time); + + return function() { clearTimeout(id); }; + }); +} + + + + +// PROGRAMS + + +var _Platform_worker = F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function() { return function() {} } + ); +}); + + + +// INITIALIZE A PROGRAM + + +function _Platform_initialize(flagDecoder, args, init, update, subscriptions, stepperBuilder) +{ + var result = A2(_Json_run, flagDecoder, _Json_wrap(args ? args['flags'] : undefined)); + $elm$core$Result$isOk(result) || _Debug_crash(2 /**/, _Json_errorToString(result.a) /**/); + var managers = {}; + var initPair = init(result.a); + var model = initPair.a; + var stepper = stepperBuilder(sendToApp, model); + var ports = _Platform_setupEffects(managers, sendToApp); + + function sendToApp(msg, viewMetadata) + { + var pair = A2(update, msg, model); + stepper(model = pair.a, viewMetadata); + _Platform_enqueueEffects(managers, pair.b, subscriptions(model)); + } + + _Platform_enqueueEffects(managers, initPair.b, subscriptions(model)); + + return ports ? { ports: ports } : {}; +} + + + +// TRACK PRELOADS +// +// This is used by code in elm/browser and elm/http +// to register any HTTP requests that are triggered by init. +// + + +var _Platform_preload; + + +function _Platform_registerPreload(url) +{ + _Platform_preload.add(url); +} + + + +// EFFECT MANAGERS + + +var _Platform_effectManagers = {}; + + +function _Platform_setupEffects(managers, sendToApp) +{ + var ports; + + // setup all necessary effect managers + for (var key in _Platform_effectManagers) + { + var manager = _Platform_effectManagers[key]; + + if (manager.a) + { + ports = ports || {}; + ports[key] = manager.a(key, sendToApp); + } + + managers[key] = _Platform_instantiateManager(manager, sendToApp); + } + + return ports; +} + + +function _Platform_createManager(init, onEffects, onSelfMsg, cmdMap, subMap) +{ + return { + b: init, + c: onEffects, + d: onSelfMsg, + e: cmdMap, + f: subMap + }; +} + + +function _Platform_instantiateManager(info, sendToApp) +{ + var router = { + g: sendToApp, + h: undefined + }; + + var onEffects = info.c; + var onSelfMsg = info.d; + var cmdMap = info.e; + var subMap = info.f; + + function loop(state) + { + return A2(_Scheduler_andThen, loop, _Scheduler_receive(function(msg) + { + var value = msg.a; + + if (msg.$ === 0) + { + return A3(onSelfMsg, router, value, state); + } + + return cmdMap && subMap + ? A4(onEffects, router, value.i, value.j, state) + : A3(onEffects, router, cmdMap ? value.i : value.j, state); + })); + } + + return router.h = _Scheduler_rawSpawn(A2(_Scheduler_andThen, loop, info.b)); +} + + + +// ROUTING + + +var _Platform_sendToApp = F2(function(router, msg) +{ + return _Scheduler_binding(function(callback) + { + router.g(msg); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + + +var _Platform_sendToSelf = F2(function(router, msg) +{ + return A2(_Scheduler_send, router.h, { + $: 0, + a: msg + }); +}); + + + +// BAGS + + +function _Platform_leaf(home) +{ + return function(value) + { + return { + $: 1, + k: home, + l: value + }; + }; +} + + +function _Platform_batch(list) +{ + return { + $: 2, + m: list + }; +} + + +var _Platform_map = F2(function(tagger, bag) +{ + return { + $: 3, + n: tagger, + o: bag + } +}); + + + +// PIPE BAGS INTO EFFECT MANAGERS +// +// Effects must be queued! +// +// Say your init contains a synchronous command, like Time.now or Time.here +// +// - This will produce a batch of effects (FX_1) +// - The synchronous task triggers the subsequent `update` call +// - This will produce a batch of effects (FX_2) +// +// If we just start dispatching FX_2, subscriptions from FX_2 can be processed +// before subscriptions from FX_1. No good! Earlier versions of this code had +// this problem, leading to these reports: +// +// https://github.com/elm/core/issues/980 +// https://github.com/elm/core/pull/981 +// https://github.com/elm/compiler/issues/1776 +// +// The queue is necessary to avoid ordering issues for synchronous commands. + + +// Why use true/false here? Why not just check the length of the queue? +// The goal is to detect "are we currently dispatching effects?" If we +// are, we need to bail and let the ongoing while loop handle things. +// +// Now say the queue has 1 element. When we dequeue the final element, +// the queue will be empty, but we are still actively dispatching effects. +// So you could get queue jumping in a really tricky category of cases. +// +var _Platform_effectsQueue = []; +var _Platform_effectsActive = false; + + +function _Platform_enqueueEffects(managers, cmdBag, subBag) +{ + _Platform_effectsQueue.push({ p: managers, q: cmdBag, r: subBag }); + + if (_Platform_effectsActive) return; + + _Platform_effectsActive = true; + for (var fx; fx = _Platform_effectsQueue.shift(); ) + { + _Platform_dispatchEffects(fx.p, fx.q, fx.r); + } + _Platform_effectsActive = false; +} + + +function _Platform_dispatchEffects(managers, cmdBag, subBag) +{ + var effectsDict = {}; + _Platform_gatherEffects(true, cmdBag, effectsDict, null); + _Platform_gatherEffects(false, subBag, effectsDict, null); + + for (var home in managers) + { + _Scheduler_rawSend(managers[home], { + $: 'fx', + a: effectsDict[home] || { i: _List_Nil, j: _List_Nil } + }); + } +} + + +function _Platform_gatherEffects(isCmd, bag, effectsDict, taggers) +{ + switch (bag.$) + { + case 1: + var home = bag.k; + var effect = _Platform_toEffect(isCmd, home, taggers, bag.l); + effectsDict[home] = _Platform_insert(isCmd, effect, effectsDict[home]); + return; + + case 2: + for (var list = bag.m; list.b; list = list.b) // WHILE_CONS + { + _Platform_gatherEffects(isCmd, list.a, effectsDict, taggers); + } + return; + + case 3: + _Platform_gatherEffects(isCmd, bag.o, effectsDict, { + s: bag.n, + t: taggers + }); + return; + } +} + + +function _Platform_toEffect(isCmd, home, taggers, value) +{ + function applyTaggers(x) + { + for (var temp = taggers; temp; temp = temp.t) + { + x = temp.s(x); + } + return x; + } + + var map = isCmd + ? _Platform_effectManagers[home].e + : _Platform_effectManagers[home].f; + + return A2(map, applyTaggers, value) +} + + +function _Platform_insert(isCmd, newEffect, effects) +{ + effects = effects || { i: _List_Nil, j: _List_Nil }; + + isCmd + ? (effects.i = _List_Cons(newEffect, effects.i)) + : (effects.j = _List_Cons(newEffect, effects.j)); + + return effects; +} + + + +// PORTS + + +function _Platform_checkPortName(name) +{ + if (_Platform_effectManagers[name]) + { + _Debug_crash(3, name) + } +} + + + +// OUTGOING PORTS + + +function _Platform_outgoingPort(name, converter) +{ + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + e: _Platform_outgoingPortMap, + u: converter, + a: _Platform_setupOutgoingPort + }; + return _Platform_leaf(name); +} + + +var _Platform_outgoingPortMap = F2(function(tagger, value) { return value; }); + + +function _Platform_setupOutgoingPort(name) +{ + var subs = []; + var converter = _Platform_effectManagers[name].u; + + // CREATE MANAGER + + var init = _Process_sleep(0); + + _Platform_effectManagers[name].b = init; + _Platform_effectManagers[name].c = F3(function(router, cmdList, state) + { + for ( ; cmdList.b; cmdList = cmdList.b) // WHILE_CONS + { + // grab a separate reference to subs in case unsubscribe is called + var currentSubs = subs; + var value = _Json_unwrap(converter(cmdList.a)); + for (var i = 0; i < currentSubs.length; i++) + { + currentSubs[i](value); + } + } + return init; + }); + + // PUBLIC API + + function subscribe(callback) + { + subs.push(callback); + } + + function unsubscribe(callback) + { + // copy subs into a new array in case unsubscribe is called within a + // subscribed callback + subs = subs.slice(); + var index = subs.indexOf(callback); + if (index >= 0) + { + subs.splice(index, 1); + } + } + + return { + subscribe: subscribe, + unsubscribe: unsubscribe + }; +} + + + +// INCOMING PORTS + + +function _Platform_incomingPort(name, converter) +{ + _Platform_checkPortName(name); + _Platform_effectManagers[name] = { + f: _Platform_incomingPortMap, + u: converter, + a: _Platform_setupIncomingPort + }; + return _Platform_leaf(name); +} + + +var _Platform_incomingPortMap = F2(function(tagger, finalTagger) +{ + return function(value) + { + return tagger(finalTagger(value)); + }; +}); + + +function _Platform_setupIncomingPort(name, sendToApp) +{ + var subs = _List_Nil; + var converter = _Platform_effectManagers[name].u; + + // CREATE MANAGER + + var init = _Scheduler_succeed(null); + + _Platform_effectManagers[name].b = init; + _Platform_effectManagers[name].c = F3(function(router, subList, state) + { + subs = subList; + return init; + }); + + // PUBLIC API + + function send(incomingValue) + { + var result = A2(_Json_run, converter, _Json_wrap(incomingValue)); + + $elm$core$Result$isOk(result) || _Debug_crash(4, name, result.a); + + var value = result.a; + for (var temp = subs; temp.b; temp = temp.b) // WHILE_CONS + { + sendToApp(temp.a(value)); + } + } + + return { send: send }; +} + + + +// EXPORT ELM MODULES +// +// Have DEBUG and PROD versions so that we can (1) give nicer errors in +// debug mode and (2) not pay for the bits needed for that in prod mode. +// + + +function _Platform_export_UNUSED(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsProd(scope['Elm'], exports) + : scope['Elm'] = exports; +} + + +function _Platform_mergeExportsProd(obj, exports) +{ + for (var name in exports) + { + (name in obj) + ? (name == 'init') + ? _Debug_crash(6) + : _Platform_mergeExportsProd(obj[name], exports[name]) + : (obj[name] = exports[name]); + } +} + + +function _Platform_export(exports) +{ + scope['Elm'] + ? _Platform_mergeExportsDebug('Elm', scope['Elm'], exports) + : scope['Elm'] = exports; +} + + +function _Platform_mergeExportsDebug(moduleName, obj, exports) +{ + for (var name in exports) + { + (name in obj) + ? (name == 'init') + ? _Debug_crash(6, moduleName) + : _Platform_mergeExportsDebug(moduleName + '.' + name, obj[name], exports[name]) + : (obj[name] = exports[name]); + } +} + + + + +// HELPERS + + +var _VirtualDom_divertHrefToApp; + +var _VirtualDom_doc = typeof document !== 'undefined' ? document : {}; + + +function _VirtualDom_appendChild(parent, child) +{ + parent.appendChild(child); +} + +var _VirtualDom_init = F4(function(virtualNode, flagDecoder, debugMetadata, args) +{ + // NOTE: this function needs _Platform_export available to work + + /**_UNUSED/ + var node = args['node']; + //*/ + /**/ + var node = args && args['node'] ? args['node'] : _Debug_crash(0); + //*/ + + node.parentNode.replaceChild( + _VirtualDom_render(virtualNode, function() {}), + node + ); + + return {}; +}); + + + +// TEXT + + +function _VirtualDom_text(string) +{ + return { + $: 0, + a: string + }; +} + + + +// NODE + + +var _VirtualDom_nodeNS = F2(function(namespace, tag) +{ + return F2(function(factList, kidList) + { + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS + { + var kid = kidList.a; + descendantsCount += (kid.b || 0); + kids.push(kid); + } + descendantsCount += kids.length; + + return { + $: 1, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); + + +var _VirtualDom_node = _VirtualDom_nodeNS(undefined); + + + +// KEYED NODE + + +var _VirtualDom_keyedNodeNS = F2(function(namespace, tag) +{ + return F2(function(factList, kidList) + { + for (var kids = [], descendantsCount = 0; kidList.b; kidList = kidList.b) // WHILE_CONS + { + var kid = kidList.a; + descendantsCount += (kid.b.b || 0); + kids.push(kid); + } + descendantsCount += kids.length; + + return { + $: 2, + c: tag, + d: _VirtualDom_organizeFacts(factList), + e: kids, + f: namespace, + b: descendantsCount + }; + }); +}); + + +var _VirtualDom_keyedNode = _VirtualDom_keyedNodeNS(undefined); + + + +// CUSTOM + + +function _VirtualDom_custom(factList, model, render, diff) +{ + return { + $: 3, + d: _VirtualDom_organizeFacts(factList), + g: model, + h: render, + i: diff + }; +} + + + +// MAP + + +var _VirtualDom_map = F2(function(tagger, node) +{ + return { + $: 4, + j: tagger, + k: node, + b: 1 + (node.b || 0) + }; +}); + + + +// LAZY + + +function _VirtualDom_thunk(refs, thunk) +{ + return { + $: 5, + l: refs, + m: thunk, + k: undefined + }; +} + +var _VirtualDom_lazy = F2(function(func, a) +{ + return _VirtualDom_thunk([func, a], function() { + return func(a); + }); +}); + +var _VirtualDom_lazy2 = F3(function(func, a, b) +{ + return _VirtualDom_thunk([func, a, b], function() { + return A2(func, a, b); + }); +}); + +var _VirtualDom_lazy3 = F4(function(func, a, b, c) +{ + return _VirtualDom_thunk([func, a, b, c], function() { + return A3(func, a, b, c); + }); +}); + +var _VirtualDom_lazy4 = F5(function(func, a, b, c, d) +{ + return _VirtualDom_thunk([func, a, b, c, d], function() { + return A4(func, a, b, c, d); + }); +}); + +var _VirtualDom_lazy5 = F6(function(func, a, b, c, d, e) +{ + return _VirtualDom_thunk([func, a, b, c, d, e], function() { + return A5(func, a, b, c, d, e); + }); +}); + +var _VirtualDom_lazy6 = F7(function(func, a, b, c, d, e, f) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f], function() { + return A6(func, a, b, c, d, e, f); + }); +}); + +var _VirtualDom_lazy7 = F8(function(func, a, b, c, d, e, f, g) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f, g], function() { + return A7(func, a, b, c, d, e, f, g); + }); +}); + +var _VirtualDom_lazy8 = F9(function(func, a, b, c, d, e, f, g, h) +{ + return _VirtualDom_thunk([func, a, b, c, d, e, f, g, h], function() { + return A8(func, a, b, c, d, e, f, g, h); + }); +}); + + + +// FACTS + + +var _VirtualDom_on = F2(function(key, handler) +{ + return { + $: 'a0', + n: key, + o: handler + }; +}); +var _VirtualDom_style = F2(function(key, value) +{ + return { + $: 'a1', + n: key, + o: value + }; +}); +var _VirtualDom_property = F2(function(key, value) +{ + return { + $: 'a2', + n: key, + o: value + }; +}); +var _VirtualDom_attribute = F2(function(key, value) +{ + return { + $: 'a3', + n: key, + o: value + }; +}); +var _VirtualDom_attributeNS = F3(function(namespace, key, value) +{ + return { + $: 'a4', + n: key, + o: { f: namespace, o: value } + }; +}); + + + +// XSS ATTACK VECTOR CHECKS +// +// For some reason, tabs can appear in href protocols and it still works. +// So '\tjava\tSCRIPT:alert("!!!")' and 'javascript:alert("!!!")' are the same +// in practice. That is why _VirtualDom_RE_js and _VirtualDom_RE_js_html look +// so freaky. +// +// Pulling the regular expressions out to the top level gives a slight speed +// boost in small benchmarks (4-10%) but hoisting values to reduce allocation +// can be unpredictable in large programs where JIT may have a harder time with +// functions are not fully self-contained. The benefit is more that the js and +// js_html ones are so weird that I prefer to see them near each other. + + +var _VirtualDom_RE_script = /^script$/i; +var _VirtualDom_RE_on_formAction = /^(on|formAction$)/i; +var _VirtualDom_RE_js = /^\s*j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i; +var _VirtualDom_RE_js_html = /^\s*(j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:|d\s*a\s*t\s*a\s*:\s*t\s*e\s*x\s*t\s*\/\s*h\s*t\s*m\s*l\s*(,|;))/i; + + +function _VirtualDom_noScript(tag) +{ + return _VirtualDom_RE_script.test(tag) ? 'p' : tag; +} + +function _VirtualDom_noOnOrFormAction(key) +{ + return _VirtualDom_RE_on_formAction.test(key) ? 'data-' + key : key; +} + +function _VirtualDom_noInnerHtmlOrFormAction(key) +{ + return key == 'innerHTML' || key == 'outerHTML' || key == 'formAction' ? 'data-' + key : key; +} + +function _VirtualDom_noJavaScriptUri(value) +{ + return _VirtualDom_RE_js.test(value) + ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ + : value; +} + +function _VirtualDom_noJavaScriptOrHtmlUri(value) +{ + return _VirtualDom_RE_js_html.test(value) + ? /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ + : value; +} + +function _VirtualDom_noJavaScriptOrHtmlJson(value) +{ + return ( + (typeof _Json_unwrap(value) === 'string' && _VirtualDom_RE_js_html.test(_Json_unwrap(value))) + || + (Array.isArray(_Json_unwrap(value)) && _VirtualDom_RE_js_html.test(String(_Json_unwrap(value)))) + ) + ? _Json_wrap( + /**_UNUSED/''//*//**/'javascript:alert("This is an XSS vector. Please use ports or web components instead.")'//*/ + ) : value; +} + + + +// MAP FACTS + + +var _VirtualDom_mapAttribute = F2(function(func, attr) +{ + return (attr.$ === 'a0') + ? A2(_VirtualDom_on, attr.n, _VirtualDom_mapHandler(func, attr.o)) + : attr; +}); + +function _VirtualDom_mapHandler(func, handler) +{ + var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); + + // 0 = Normal + // 1 = MayStopPropagation + // 2 = MayPreventDefault + // 3 = Custom + + return { + $: handler.$, + a: + !tag + ? A2($elm$json$Json$Decode$map, func, handler.a) + : + A3($elm$json$Json$Decode$map2, + tag < 3 + ? _VirtualDom_mapEventTuple + : _VirtualDom_mapEventRecord, + $elm$json$Json$Decode$succeed(func), + handler.a + ) + }; +} + +var _VirtualDom_mapEventTuple = F2(function(func, tuple) +{ + return _Utils_Tuple2(func(tuple.a), tuple.b); +}); + +var _VirtualDom_mapEventRecord = F2(function(func, record) +{ + return { + message: func(record.message), + stopPropagation: record.stopPropagation, + preventDefault: record.preventDefault + } +}); + + + +// ORGANIZE FACTS + + +function _VirtualDom_organizeFacts(factList) +{ + for (var facts = {}; factList.b; factList = factList.b) // WHILE_CONS + { + var entry = factList.a; + + var tag = entry.$; + var key = entry.n; + var value = entry.o; + + if (tag === 'a2') + { + (key === 'className') + ? _VirtualDom_addClass(facts, key, _Json_unwrap(value)) + : facts[key] = _Json_unwrap(value); + + continue; + } + + var subFacts = facts[tag] || (facts[tag] = {}); + (tag === 'a3' && key === 'class') + ? _VirtualDom_addClass(subFacts, key, value) + : subFacts[key] = value; + } + + return facts; +} + +function _VirtualDom_addClass(object, key, newClass) +{ + var classes = object[key]; + object[key] = classes ? classes + ' ' + newClass : newClass; +} + + + +// RENDER + + +function _VirtualDom_render(vNode, eventNode) +{ + var tag = vNode.$; + + if (tag === 5) + { + return _VirtualDom_render(vNode.k || (vNode.k = vNode.m()), eventNode); + } + + if (tag === 0) + { + return _VirtualDom_doc.createTextNode(vNode.a); + } + + if (tag === 4) + { + var subNode = vNode.k; + var tagger = vNode.j; + + while (subNode.$ === 4) + { + typeof tagger !== 'object' + ? tagger = [tagger, subNode.j] + : tagger.push(subNode.j); + + subNode = subNode.k; + } + + var subEventRoot = { j: tagger, p: eventNode }; + var domNode = _VirtualDom_render(subNode, subEventRoot); + domNode.elm_event_node_ref = subEventRoot; + return domNode; + } + + if (tag === 3) + { + var domNode = vNode.h(vNode.g); + _VirtualDom_applyFacts(domNode, eventNode, vNode.d); + return domNode; + } + + // at this point `tag` must be 1 or 2 + + var domNode = vNode.f + ? _VirtualDom_doc.createElementNS(vNode.f, vNode.c) + : _VirtualDom_doc.createElement(vNode.c); + + if (_VirtualDom_divertHrefToApp && vNode.c == 'a') + { + domNode.addEventListener('click', _VirtualDom_divertHrefToApp(domNode)); + } + + _VirtualDom_applyFacts(domNode, eventNode, vNode.d); + + for (var kids = vNode.e, i = 0; i < kids.length; i++) + { + _VirtualDom_appendChild(domNode, _VirtualDom_render(tag === 1 ? kids[i] : kids[i].b, eventNode)); + } + + return domNode; +} + + + +// APPLY FACTS + + +function _VirtualDom_applyFacts(domNode, eventNode, facts) +{ + for (var key in facts) + { + var value = facts[key]; + + key === 'a1' + ? _VirtualDom_applyStyles(domNode, value) + : + key === 'a0' + ? _VirtualDom_applyEvents(domNode, eventNode, value) + : + key === 'a3' + ? _VirtualDom_applyAttrs(domNode, value) + : + key === 'a4' + ? _VirtualDom_applyAttrsNS(domNode, value) + : + ((key !== 'value' && key !== 'checked') || domNode[key] !== value) && (domNode[key] = value); + } +} + + + +// APPLY STYLES + + +function _VirtualDom_applyStyles(domNode, styles) +{ + var domNodeStyle = domNode.style; + + for (var key in styles) + { + domNodeStyle[key] = styles[key]; + } +} + + + +// APPLY ATTRS + + +function _VirtualDom_applyAttrs(domNode, attrs) +{ + for (var key in attrs) + { + var value = attrs[key]; + typeof value !== 'undefined' + ? domNode.setAttribute(key, value) + : domNode.removeAttribute(key); + } +} + + + +// APPLY NAMESPACED ATTRS + + +function _VirtualDom_applyAttrsNS(domNode, nsAttrs) +{ + for (var key in nsAttrs) + { + var pair = nsAttrs[key]; + var namespace = pair.f; + var value = pair.o; + + typeof value !== 'undefined' + ? domNode.setAttributeNS(namespace, key, value) + : domNode.removeAttributeNS(namespace, key); + } +} + + + +// APPLY EVENTS + + +function _VirtualDom_applyEvents(domNode, eventNode, events) +{ + var allCallbacks = domNode.elmFs || (domNode.elmFs = {}); + + for (var key in events) + { + var newHandler = events[key]; + var oldCallback = allCallbacks[key]; + + if (!newHandler) + { + domNode.removeEventListener(key, oldCallback); + allCallbacks[key] = undefined; + continue; + } + + if (oldCallback) + { + var oldHandler = oldCallback.q; + if (oldHandler.$ === newHandler.$) + { + oldCallback.q = newHandler; + continue; + } + domNode.removeEventListener(key, oldCallback); + } + + oldCallback = _VirtualDom_makeCallback(eventNode, newHandler); + domNode.addEventListener(key, oldCallback, + _VirtualDom_passiveSupported + && { passive: $elm$virtual_dom$VirtualDom$toHandlerInt(newHandler) < 2 } + ); + allCallbacks[key] = oldCallback; + } +} + + + +// PASSIVE EVENTS + + +var _VirtualDom_passiveSupported; + +try +{ + window.addEventListener('t', null, Object.defineProperty({}, 'passive', { + get: function() { _VirtualDom_passiveSupported = true; } + })); +} +catch(e) {} + + + +// EVENT HANDLERS + + +function _VirtualDom_makeCallback(eventNode, initialHandler) +{ + function callback(event) + { + var handler = callback.q; + var result = _Json_runHelp(handler.a, event); + + if (!$elm$core$Result$isOk(result)) + { + return; + } + + var tag = $elm$virtual_dom$VirtualDom$toHandlerInt(handler); + + // 0 = Normal + // 1 = MayStopPropagation + // 2 = MayPreventDefault + // 3 = Custom + + var value = result.a; + var message = !tag ? value : tag < 3 ? value.a : value.message; + var stopPropagation = tag == 1 ? value.b : tag == 3 && value.stopPropagation; + var currentEventNode = ( + stopPropagation && event.stopPropagation(), + (tag == 2 ? value.b : tag == 3 && value.preventDefault) && event.preventDefault(), + eventNode + ); + var tagger; + var i; + while (tagger = currentEventNode.j) + { + if (typeof tagger == 'function') + { + message = tagger(message); + } + else + { + for (var i = tagger.length; i--; ) + { + message = tagger[i](message); + } + } + currentEventNode = currentEventNode.p; + } + currentEventNode(message, stopPropagation); // stopPropagation implies isSync + } + + callback.q = initialHandler; + + return callback; +} + +function _VirtualDom_equalEvents(x, y) +{ + return x.$ == y.$ && _Json_equality(x.a, y.a); +} + + + +// DIFF + + +// TODO: Should we do patches like in iOS? +// +// type Patch +// = At Int Patch +// | Batch (List Patch) +// | Change ... +// +// How could it not be better? +// +function _VirtualDom_diff(x, y) +{ + var patches = []; + _VirtualDom_diffHelp(x, y, patches, 0); + return patches; +} + + +function _VirtualDom_pushPatch(patches, type, index, data) +{ + var patch = { + $: type, + r: index, + s: data, + t: undefined, + u: undefined + }; + patches.push(patch); + return patch; +} + + +function _VirtualDom_diffHelp(x, y, patches, index) +{ + if (x === y) + { + return; + } + + var xType = x.$; + var yType = y.$; + + // Bail if you run into different types of nodes. Implies that the + // structure has changed significantly and it's not worth a diff. + if (xType !== yType) + { + if (xType === 1 && yType === 2) + { + y = _VirtualDom_dekey(y); + yType = 1; + } + else + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + } + + // Now we know that both nodes are the same $. + switch (yType) + { + case 5: + var xRefs = x.l; + var yRefs = y.l; + var i = xRefs.length; + var same = i === yRefs.length; + while (same && i--) + { + same = xRefs[i] === yRefs[i]; + } + if (same) + { + y.k = x.k; + return; + } + y.k = y.m(); + var subPatches = []; + _VirtualDom_diffHelp(x.k, y.k, subPatches, 0); + subPatches.length > 0 && _VirtualDom_pushPatch(patches, 1, index, subPatches); + return; + + case 4: + // gather nested taggers + var xTaggers = x.j; + var yTaggers = y.j; + var nesting = false; + + var xSubNode = x.k; + while (xSubNode.$ === 4) + { + nesting = true; + + typeof xTaggers !== 'object' + ? xTaggers = [xTaggers, xSubNode.j] + : xTaggers.push(xSubNode.j); + + xSubNode = xSubNode.k; + } + + var ySubNode = y.k; + while (ySubNode.$ === 4) + { + nesting = true; + + typeof yTaggers !== 'object' + ? yTaggers = [yTaggers, ySubNode.j] + : yTaggers.push(ySubNode.j); + + ySubNode = ySubNode.k; + } + + // Just bail if different numbers of taggers. This implies the + // structure of the virtual DOM has changed. + if (nesting && xTaggers.length !== yTaggers.length) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + // check if taggers are "the same" + if (nesting ? !_VirtualDom_pairwiseRefEqual(xTaggers, yTaggers) : xTaggers !== yTaggers) + { + _VirtualDom_pushPatch(patches, 2, index, yTaggers); + } + + // diff everything below the taggers + _VirtualDom_diffHelp(xSubNode, ySubNode, patches, index + 1); + return; + + case 0: + if (x.a !== y.a) + { + _VirtualDom_pushPatch(patches, 3, index, y.a); + } + return; + + case 1: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKids); + return; + + case 2: + _VirtualDom_diffNodes(x, y, patches, index, _VirtualDom_diffKeyedKids); + return; + + case 3: + if (x.h !== y.h) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + var factsDiff = _VirtualDom_diffFacts(x.d, y.d); + factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); + + var patch = y.i(x.g, y.g); + patch && _VirtualDom_pushPatch(patches, 5, index, patch); + + return; + } +} + +// assumes the incoming arrays are the same length +function _VirtualDom_pairwiseRefEqual(as, bs) +{ + for (var i = 0; i < as.length; i++) + { + if (as[i] !== bs[i]) + { + return false; + } + } + + return true; +} + +function _VirtualDom_diffNodes(x, y, patches, index, diffKids) +{ + // Bail if obvious indicators have changed. Implies more serious + // structural changes such that it's not worth it to diff. + if (x.c !== y.c || x.f !== y.f) + { + _VirtualDom_pushPatch(patches, 0, index, y); + return; + } + + var factsDiff = _VirtualDom_diffFacts(x.d, y.d); + factsDiff && _VirtualDom_pushPatch(patches, 4, index, factsDiff); + + diffKids(x, y, patches, index); +} + + + +// DIFF FACTS + + +// TODO Instead of creating a new diff object, it's possible to just test if +// there *is* a diff. During the actual patch, do the diff again and make the +// modifications directly. This way, there's no new allocations. Worth it? +function _VirtualDom_diffFacts(x, y, category) +{ + var diff; + + // look for changes and removals + for (var xKey in x) + { + if (xKey === 'a1' || xKey === 'a0' || xKey === 'a3' || xKey === 'a4') + { + var subDiff = _VirtualDom_diffFacts(x[xKey], y[xKey] || {}, xKey); + if (subDiff) + { + diff = diff || {}; + diff[xKey] = subDiff; + } + continue; + } + + // remove if not in the new facts + if (!(xKey in y)) + { + diff = diff || {}; + diff[xKey] = + !category + ? (typeof x[xKey] === 'string' ? '' : null) + : + (category === 'a1') + ? '' + : + (category === 'a0' || category === 'a3') + ? undefined + : + { f: x[xKey].f, o: undefined }; + + continue; + } + + var xValue = x[xKey]; + var yValue = y[xKey]; + + // reference equal, so don't worry about it + if (xValue === yValue && xKey !== 'value' && xKey !== 'checked' + || category === 'a0' && _VirtualDom_equalEvents(xValue, yValue)) + { + continue; + } + + diff = diff || {}; + diff[xKey] = yValue; + } + + // add new stuff + for (var yKey in y) + { + if (!(yKey in x)) + { + diff = diff || {}; + diff[yKey] = y[yKey]; + } + } + + return diff; +} + + + +// DIFF KIDS + + +function _VirtualDom_diffKids(xParent, yParent, patches, index) +{ + var xKids = xParent.e; + var yKids = yParent.e; + + var xLen = xKids.length; + var yLen = yKids.length; + + // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS + + if (xLen > yLen) + { + _VirtualDom_pushPatch(patches, 6, index, { + v: yLen, + i: xLen - yLen + }); + } + else if (xLen < yLen) + { + _VirtualDom_pushPatch(patches, 7, index, { + v: xLen, + e: yKids + }); + } + + // PAIRWISE DIFF EVERYTHING ELSE + + for (var minLen = xLen < yLen ? xLen : yLen, i = 0; i < minLen; i++) + { + var xKid = xKids[i]; + _VirtualDom_diffHelp(xKid, yKids[i], patches, ++index); + index += xKid.b || 0; + } +} + + + +// KEYED DIFF + + +function _VirtualDom_diffKeyedKids(xParent, yParent, patches, rootIndex) +{ + var localPatches = []; + + var changes = {}; // Dict String Entry + var inserts = []; // Array { index : Int, entry : Entry } + // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } + + var xKids = xParent.e; + var yKids = yParent.e; + var xLen = xKids.length; + var yLen = yKids.length; + var xIndex = 0; + var yIndex = 0; + + var index = rootIndex; + + while (xIndex < xLen && yIndex < yLen) + { + var x = xKids[xIndex]; + var y = yKids[yIndex]; + + var xKey = x.a; + var yKey = y.a; + var xNode = x.b; + var yNode = y.b; + + var newMatch = undefined; + var oldMatch = undefined; + + // check if keys match + + if (xKey === yKey) + { + index++; + _VirtualDom_diffHelp(xNode, yNode, localPatches, index); + index += xNode.b || 0; + + xIndex++; + yIndex++; + continue; + } + + // look ahead 1 to detect insertions and removals. + + var xNext = xKids[xIndex + 1]; + var yNext = yKids[yIndex + 1]; + + if (xNext) + { + var xNextKey = xNext.a; + var xNextNode = xNext.b; + oldMatch = yKey === xNextKey; + } + + if (yNext) + { + var yNextKey = yNext.a; + var yNextNode = yNext.b; + newMatch = xKey === yNextKey; + } + + + // swap x and y + if (newMatch && oldMatch) + { + index++; + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + _VirtualDom_insertNode(changes, localPatches, xKey, yNode, yIndex, inserts); + index += xNode.b || 0; + + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNextNode, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 2; + continue; + } + + // insert y + if (newMatch) + { + index++; + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + _VirtualDom_diffHelp(xNode, yNextNode, localPatches, index); + index += xNode.b || 0; + + xIndex += 1; + yIndex += 2; + continue; + } + + // remove x + if (oldMatch) + { + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + index += xNode.b || 0; + + index++; + _VirtualDom_diffHelp(xNextNode, yNode, localPatches, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 1; + continue; + } + + // remove x, insert y + if (xNext && xNextKey === yNextKey) + { + index++; + _VirtualDom_removeNode(changes, localPatches, xKey, xNode, index); + _VirtualDom_insertNode(changes, localPatches, yKey, yNode, yIndex, inserts); + index += xNode.b || 0; + + index++; + _VirtualDom_diffHelp(xNextNode, yNextNode, localPatches, index); + index += xNextNode.b || 0; + + xIndex += 2; + yIndex += 2; + continue; + } + + break; + } + + // eat up any remaining nodes with removeNode and insertNode + + while (xIndex < xLen) + { + index++; + var x = xKids[xIndex]; + var xNode = x.b; + _VirtualDom_removeNode(changes, localPatches, x.a, xNode, index); + index += xNode.b || 0; + xIndex++; + } + + while (yIndex < yLen) + { + var endInserts = endInserts || []; + var y = yKids[yIndex]; + _VirtualDom_insertNode(changes, localPatches, y.a, y.b, undefined, endInserts); + yIndex++; + } + + if (localPatches.length > 0 || inserts.length > 0 || endInserts) + { + _VirtualDom_pushPatch(patches, 8, rootIndex, { + w: localPatches, + x: inserts, + y: endInserts + }); + } +} + + + +// CHANGES FROM KEYED DIFF + + +var _VirtualDom_POSTFIX = '_elmW6BL'; + + +function _VirtualDom_insertNode(changes, localPatches, key, vnode, yIndex, inserts) +{ + var entry = changes[key]; + + // never seen this key before + if (!entry) + { + entry = { + c: 0, + z: vnode, + r: yIndex, + s: undefined + }; + + inserts.push({ r: yIndex, A: entry }); + changes[key] = entry; + + return; + } + + // this key was removed earlier, a match! + if (entry.c === 1) + { + inserts.push({ r: yIndex, A: entry }); + + entry.c = 2; + var subPatches = []; + _VirtualDom_diffHelp(entry.z, vnode, subPatches, entry.r); + entry.r = yIndex; + entry.s.s = { + w: subPatches, + A: entry + }; + + return; + } + + // this key has already been inserted or moved, a duplicate! + _VirtualDom_insertNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, yIndex, inserts); +} + + +function _VirtualDom_removeNode(changes, localPatches, key, vnode, index) +{ + var entry = changes[key]; + + // never seen this key before + if (!entry) + { + var patch = _VirtualDom_pushPatch(localPatches, 9, index, undefined); + + changes[key] = { + c: 1, + z: vnode, + r: index, + s: patch + }; + + return; + } + + // this key was inserted earlier, a match! + if (entry.c === 0) + { + entry.c = 2; + var subPatches = []; + _VirtualDom_diffHelp(vnode, entry.z, subPatches, index); + + _VirtualDom_pushPatch(localPatches, 9, index, { + w: subPatches, + A: entry + }); + + return; + } + + // this key has already been removed or moved, a duplicate! + _VirtualDom_removeNode(changes, localPatches, key + _VirtualDom_POSTFIX, vnode, index); +} + + + +// ADD DOM NODES +// +// Each DOM node has an "index" assigned in order of traversal. It is important +// to minimize our crawl over the actual DOM, so these indexes (along with the +// descendantsCount of virtual nodes) let us skip touching entire subtrees of +// the DOM if we know there are no patches there. + + +function _VirtualDom_addDomNodes(domNode, vNode, patches, eventNode) +{ + _VirtualDom_addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.b, eventNode); +} + + +// assumes `patches` is non-empty and indexes increase monotonically. +function _VirtualDom_addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) +{ + var patch = patches[i]; + var index = patch.r; + + while (index === low) + { + var patchType = patch.$; + + if (patchType === 1) + { + _VirtualDom_addDomNodes(domNode, vNode.k, patch.s, eventNode); + } + else if (patchType === 8) + { + patch.t = domNode; + patch.u = eventNode; + + var subPatches = patch.s.w; + if (subPatches.length > 0) + { + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + else if (patchType === 9) + { + patch.t = domNode; + patch.u = eventNode; + + var data = patch.s; + if (data) + { + data.A.s = domNode; + var subPatches = data.w; + if (subPatches.length > 0) + { + _VirtualDom_addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + } + else + { + patch.t = domNode; + patch.u = eventNode; + } + + i++; + + if (!(patch = patches[i]) || (index = patch.r) > high) + { + return i; + } + } + + var tag = vNode.$; + + if (tag === 4) + { + var subNode = vNode.k; + + while (subNode.$ === 4) + { + subNode = subNode.k; + } + + return _VirtualDom_addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); + } + + // tag must be 1 or 2 at this point + + var vKids = vNode.e; + var childNodes = domNode.childNodes; + for (var j = 0; j < vKids.length; j++) + { + low++; + var vKid = tag === 1 ? vKids[j] : vKids[j].b; + var nextLow = low + (vKid.b || 0); + if (low <= index && index <= nextLow) + { + i = _VirtualDom_addDomNodesHelp(childNodes[j], vKid, patches, i, low, nextLow, eventNode); + if (!(patch = patches[i]) || (index = patch.r) > high) + { + return i; + } + } + low = nextLow; + } + return i; +} + + + +// APPLY PATCHES + + +function _VirtualDom_applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) +{ + if (patches.length === 0) + { + return rootDomNode; + } + + _VirtualDom_addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); + return _VirtualDom_applyPatchesHelp(rootDomNode, patches); +} + +function _VirtualDom_applyPatchesHelp(rootDomNode, patches) +{ + for (var i = 0; i < patches.length; i++) + { + var patch = patches[i]; + var localDomNode = patch.t + var newNode = _VirtualDom_applyPatch(localDomNode, patch); + if (localDomNode === rootDomNode) + { + rootDomNode = newNode; + } + } + return rootDomNode; +} + +function _VirtualDom_applyPatch(domNode, patch) +{ + switch (patch.$) + { + case 0: + return _VirtualDom_applyPatchRedraw(domNode, patch.s, patch.u); + + case 4: + _VirtualDom_applyFacts(domNode, patch.u, patch.s); + return domNode; + + case 3: + domNode.replaceData(0, domNode.length, patch.s); + return domNode; + + case 1: + return _VirtualDom_applyPatchesHelp(domNode, patch.s); + + case 2: + if (domNode.elm_event_node_ref) + { + domNode.elm_event_node_ref.j = patch.s; + } + else + { + domNode.elm_event_node_ref = { j: patch.s, p: patch.u }; + } + return domNode; + + case 6: + var data = patch.s; + for (var i = 0; i < data.i; i++) + { + domNode.removeChild(domNode.childNodes[data.v]); + } + return domNode; + + case 7: + var data = patch.s; + var kids = data.e; + var i = data.v; + var theEnd = domNode.childNodes[i]; + for (; i < kids.length; i++) + { + domNode.insertBefore(_VirtualDom_render(kids[i], patch.u), theEnd); + } + return domNode; + + case 9: + var data = patch.s; + if (!data) + { + domNode.parentNode.removeChild(domNode); + return domNode; + } + var entry = data.A; + if (typeof entry.r !== 'undefined') + { + domNode.parentNode.removeChild(domNode); + } + entry.s = _VirtualDom_applyPatchesHelp(domNode, data.w); + return domNode; + + case 8: + return _VirtualDom_applyPatchReorder(domNode, patch); + + case 5: + return patch.s(domNode); + + default: + _Debug_crash(10); // 'Ran into an unknown patch!' + } +} + + +function _VirtualDom_applyPatchRedraw(domNode, vNode, eventNode) +{ + var parentNode = domNode.parentNode; + var newNode = _VirtualDom_render(vNode, eventNode); + + if (!newNode.elm_event_node_ref) + { + newNode.elm_event_node_ref = domNode.elm_event_node_ref; + } + + if (parentNode && newNode !== domNode) + { + parentNode.replaceChild(newNode, domNode); + } + return newNode; +} + + +function _VirtualDom_applyPatchReorder(domNode, patch) +{ + var data = patch.s; + + // remove end inserts + var frag = _VirtualDom_applyPatchReorderEndInsertsHelp(data.y, patch); + + // removals + domNode = _VirtualDom_applyPatchesHelp(domNode, data.w); + + // inserts + var inserts = data.x; + for (var i = 0; i < inserts.length; i++) + { + var insert = inserts[i]; + var entry = insert.A; + var node = entry.c === 2 + ? entry.s + : _VirtualDom_render(entry.z, patch.u); + domNode.insertBefore(node, domNode.childNodes[insert.r]); + } + + // add end inserts + if (frag) + { + _VirtualDom_appendChild(domNode, frag); + } + + return domNode; +} + + +function _VirtualDom_applyPatchReorderEndInsertsHelp(endInserts, patch) +{ + if (!endInserts) + { + return; + } + + var frag = _VirtualDom_doc.createDocumentFragment(); + for (var i = 0; i < endInserts.length; i++) + { + var insert = endInserts[i]; + var entry = insert.A; + _VirtualDom_appendChild(frag, entry.c === 2 + ? entry.s + : _VirtualDom_render(entry.z, patch.u) + ); + } + return frag; +} + + +function _VirtualDom_virtualize(node) +{ + // TEXT NODES + + if (node.nodeType === 3) + { + return _VirtualDom_text(node.textContent); + } + + + // WEIRD NODES + + if (node.nodeType !== 1) + { + return _VirtualDom_text(''); + } + + + // ELEMENT NODES + + var attrList = _List_Nil; + var attrs = node.attributes; + for (var i = attrs.length; i--; ) + { + var attr = attrs[i]; + var name = attr.name; + var value = attr.value; + attrList = _List_Cons( A2(_VirtualDom_attribute, name, value), attrList ); + } + + var tag = node.tagName.toLowerCase(); + var kidList = _List_Nil; + var kids = node.childNodes; + + for (var i = kids.length; i--; ) + { + kidList = _List_Cons(_VirtualDom_virtualize(kids[i]), kidList); + } + return A3(_VirtualDom_node, tag, attrList, kidList); +} + +function _VirtualDom_dekey(keyedNode) +{ + var keyedKids = keyedNode.e; + var len = keyedKids.length; + var kids = new Array(len); + for (var i = 0; i < len; i++) + { + kids[i] = keyedKids[i].b; + } + + return { + $: 1, + c: keyedNode.c, + d: keyedNode.d, + e: kids, + f: keyedNode.f, + b: keyedNode.b + }; +} + + + +var _Bitwise_and = F2(function(a, b) +{ + return a & b; +}); + +var _Bitwise_or = F2(function(a, b) +{ + return a | b; +}); + +var _Bitwise_xor = F2(function(a, b) +{ + return a ^ b; +}); + +function _Bitwise_complement(a) +{ + return ~a; +}; + +var _Bitwise_shiftLeftBy = F2(function(offset, a) +{ + return a << offset; +}); + +var _Bitwise_shiftRightBy = F2(function(offset, a) +{ + return a >> offset; +}); + +var _Bitwise_shiftRightZfBy = F2(function(offset, a) +{ + return a >>> offset; +}); + + + + +// HELPERS + + +function _Debugger_unsafeCoerce(value) +{ + return value; +} + + + +// PROGRAMS + + +var _Debugger_element = F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + A3($elm$browser$Debugger$Main$wrapInit, _Json_wrap(debugMetadata), _Debugger_popout(), impl.init), + $elm$browser$Debugger$Main$wrapUpdate(impl.update), + $elm$browser$Debugger$Main$wrapSubs(impl.subscriptions), + function(sendToApp, initialModel) + { + var view = impl.view; + var title = _VirtualDom_doc.title; + var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); + var currNode = _VirtualDom_virtualize(domNode); + var currBlocker = $elm$browser$Debugger$Main$toBlockerType(initialModel); + var currPopout; + + var cornerNode = _VirtualDom_doc.createElement('div'); + domNode.parentNode.insertBefore(cornerNode, domNode.nextSibling); + var cornerCurr = _VirtualDom_virtualize(cornerNode); + + initialModel.popout.a = sendToApp; + + return _Browser_makeAnimator(initialModel, function(model) + { + var nextNode = A2(_VirtualDom_map, $elm$browser$Debugger$Main$UserMsg, view($elm$browser$Debugger$Main$getUserModel(model))); + var patches = _VirtualDom_diff(currNode, nextNode); + domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); + currNode = nextNode; + + // update blocker + + var nextBlocker = $elm$browser$Debugger$Main$toBlockerType(model); + _Debugger_updateBlocker(currBlocker, nextBlocker); + currBlocker = nextBlocker; + + // view corner + + var cornerNext = $elm$browser$Debugger$Main$cornerView(model); + var cornerPatches = _VirtualDom_diff(cornerCurr, cornerNext); + cornerNode = _VirtualDom_applyPatches(cornerNode, cornerCurr, cornerPatches, sendToApp); + cornerCurr = cornerNext; + + if (!model.popout.b) + { + currPopout = undefined; + return; + } + + // view popout + + _VirtualDom_doc = model.popout.b; // SWITCH TO POPOUT DOC + currPopout || (currPopout = _VirtualDom_virtualize(model.popout.b)); + var nextPopout = $elm$browser$Debugger$Main$popoutView(model); + var popoutPatches = _VirtualDom_diff(currPopout, nextPopout); + _VirtualDom_applyPatches(model.popout.b.body, currPopout, popoutPatches, sendToApp); + currPopout = nextPopout; + _VirtualDom_doc = document; // SWITCH BACK TO NORMAL DOC + }); + } + ); +}); + + +var _Debugger_document = F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + A3($elm$browser$Debugger$Main$wrapInit, _Json_wrap(debugMetadata), _Debugger_popout(), impl.init), + $elm$browser$Debugger$Main$wrapUpdate(impl.update), + $elm$browser$Debugger$Main$wrapSubs(impl.subscriptions), + function(sendToApp, initialModel) + { + var divertHrefToApp = impl.setup && impl.setup(function(x) { return sendToApp($elm$browser$Debugger$Main$UserMsg(x)); }); + var view = impl.view; + var title = _VirtualDom_doc.title; + var bodyNode = _VirtualDom_doc.body; + var currNode = _VirtualDom_virtualize(bodyNode); + var currBlocker = $elm$browser$Debugger$Main$toBlockerType(initialModel); + var currPopout; + + initialModel.popout.a = sendToApp; + + return _Browser_makeAnimator(initialModel, function(model) + { + _VirtualDom_divertHrefToApp = divertHrefToApp; + var doc = view($elm$browser$Debugger$Main$getUserModel(model)); + var nextNode = _VirtualDom_node('body')(_List_Nil)( + _Utils_ap( + A2($elm$core$List$map, _VirtualDom_map($elm$browser$Debugger$Main$UserMsg), doc.body), + _List_Cons($elm$browser$Debugger$Main$cornerView(model), _List_Nil) + ) + ); + var patches = _VirtualDom_diff(currNode, nextNode); + bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); + currNode = nextNode; + _VirtualDom_divertHrefToApp = 0; + (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); + + // update blocker + + var nextBlocker = $elm$browser$Debugger$Main$toBlockerType(model); + _Debugger_updateBlocker(currBlocker, nextBlocker); + currBlocker = nextBlocker; + + // view popout + + if (!model.popout.b) { currPopout = undefined; return; } + + _VirtualDom_doc = model.popout.b; // SWITCH TO POPOUT DOC + currPopout || (currPopout = _VirtualDom_virtualize(model.popout.b)); + var nextPopout = $elm$browser$Debugger$Main$popoutView(model); + var popoutPatches = _VirtualDom_diff(currPopout, nextPopout); + _VirtualDom_applyPatches(model.popout.b.body, currPopout, popoutPatches, sendToApp); + currPopout = nextPopout; + _VirtualDom_doc = document; // SWITCH BACK TO NORMAL DOC + }); + } + ); +}); + + +function _Debugger_popout() +{ + return { + b: undefined, + a: undefined + }; +} + +function _Debugger_isOpen(popout) +{ + return !!popout.b; +} + +function _Debugger_open(popout) +{ + return _Scheduler_binding(function(callback) + { + _Debugger_openWindow(popout); + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +} + +function _Debugger_openWindow(popout) +{ + var w = $elm$browser$Debugger$Main$initialWindowWidth, + h = $elm$browser$Debugger$Main$initialWindowHeight, + x = screen.width - w, + y = screen.height - h; + + var debuggerWindow = window.open('', '', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y); + var doc = debuggerWindow.document; + doc.title = 'Elm Debugger'; + + // handle arrow keys + doc.addEventListener('keydown', function(event) { + event.metaKey && event.which === 82 && window.location.reload(); + event.key === 'ArrowUp' && (popout.a($elm$browser$Debugger$Main$Up ), event.preventDefault()); + event.key === 'ArrowDown' && (popout.a($elm$browser$Debugger$Main$Down), event.preventDefault()); + }); + + // handle window close + window.addEventListener('unload', close); + debuggerWindow.addEventListener('unload', function() { + popout.b = undefined; + popout.a($elm$browser$Debugger$Main$NoOp); + window.removeEventListener('unload', close); + }); + + function close() { + popout.b = undefined; + popout.a($elm$browser$Debugger$Main$NoOp); + debuggerWindow.close(); + } + + // register new window + popout.b = doc; +} + + + +// SCROLL + + +function _Debugger_scroll(popout) +{ + return _Scheduler_binding(function(callback) + { + if (popout.b) + { + var msgs = popout.b.getElementById('elm-debugger-sidebar'); + if (msgs && msgs.scrollTop !== 0) + { + msgs.scrollTop = 0; + } + } + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +} + + +var _Debugger_scrollTo = F2(function(id, popout) +{ + return _Scheduler_binding(function(callback) + { + if (popout.b) + { + var msg = popout.b.getElementById(id); + if (msg) + { + msg.scrollIntoView(false); + } + } + callback(_Scheduler_succeed(_Utils_Tuple0)); + }); +}); + + + +// UPLOAD + + +function _Debugger_upload(popout) +{ + return _Scheduler_binding(function(callback) + { + var doc = popout.b || document; + var element = doc.createElement('input'); + element.setAttribute('type', 'file'); + element.setAttribute('accept', 'text/json'); + element.style.display = 'none'; + element.addEventListener('change', function(event) + { + var fileReader = new FileReader(); + fileReader.onload = function(e) + { + callback(_Scheduler_succeed(e.target.result)); + }; + fileReader.readAsText(event.target.files[0]); + doc.body.removeChild(element); + }); + doc.body.appendChild(element); + element.click(); + }); +} + + + +// DOWNLOAD + + +var _Debugger_download = F2(function(historyLength, json) +{ + return _Scheduler_binding(function(callback) + { + var fileName = 'history-' + historyLength + '.txt'; + var jsonString = JSON.stringify(json); + var mime = 'text/plain;charset=utf-8'; + var done = _Scheduler_succeed(_Utils_Tuple0); + + // for IE10+ + if (navigator.msSaveBlob) + { + navigator.msSaveBlob(new Blob([jsonString], {type: mime}), fileName); + return callback(done); + } + + // for HTML5 + var element = document.createElement('a'); + element.setAttribute('href', 'data:' + mime + ',' + encodeURIComponent(jsonString)); + element.setAttribute('download', fileName); + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); + callback(done); + }); +}); + + + +// POPOUT CONTENT + + +function _Debugger_messageToString(value) +{ + if (typeof value === 'boolean') + { + return value ? 'True' : 'False'; + } + + if (typeof value === 'number') + { + return value + ''; + } + + if (typeof value === 'string') + { + return '"' + _Debugger_addSlashes(value, false) + '"'; + } + + if (value instanceof String) + { + return "'" + _Debugger_addSlashes(value, true) + "'"; + } + + if (typeof value !== 'object' || value === null || !('$' in value)) + { + return '…'; + } + + if (typeof value.$ === 'number') + { + return '…'; + } + + var code = value.$.charCodeAt(0); + if (code === 0x23 /* # */ || /* a */ 0x61 <= code && code <= 0x7A /* z */) + { + return '…'; + } + + if (['Array_elm_builtin', 'Set_elm_builtin', 'RBNode_elm_builtin', 'RBEmpty_elm_builtin'].indexOf(value.$) >= 0) + { + return '…'; + } + + var keys = Object.keys(value); + switch (keys.length) + { + case 1: + return value.$; + case 2: + return value.$ + ' ' + _Debugger_messageToString(value.a); + default: + return value.$ + ' … ' + _Debugger_messageToString(value[keys[keys.length - 1]]); + } +} + + +function _Debugger_init(value) +{ + if (typeof value === 'boolean') + { + return A3($elm$browser$Debugger$Expando$Constructor, $elm$core$Maybe$Just(value ? 'True' : 'False'), true, _List_Nil); + } + + if (typeof value === 'number') + { + return $elm$browser$Debugger$Expando$Primitive(value + ''); + } + + if (typeof value === 'string') + { + return $elm$browser$Debugger$Expando$S('"' + _Debugger_addSlashes(value, false) + '"'); + } + + if (value instanceof String) + { + return $elm$browser$Debugger$Expando$S("'" + _Debugger_addSlashes(value, true) + "'"); + } + + if (typeof value === 'object' && '$' in value) + { + var tag = value.$; + + if (tag === '::' || tag === '[]') + { + return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$ListSeq, true, + A2($elm$core$List$map, _Debugger_init, value) + ); + } + + if (tag === 'Set_elm_builtin') + { + return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$SetSeq, true, + A3($elm$core$Set$foldr, _Debugger_initCons, _List_Nil, value) + ); + } + + if (tag === 'RBNode_elm_builtin' || tag == 'RBEmpty_elm_builtin') + { + return A2($elm$browser$Debugger$Expando$Dictionary, true, + A3($elm$core$Dict$foldr, _Debugger_initKeyValueCons, _List_Nil, value) + ); + } + + if (tag === 'Array_elm_builtin') + { + return A3($elm$browser$Debugger$Expando$Sequence, $elm$browser$Debugger$Expando$ArraySeq, true, + A3($elm$core$Array$foldr, _Debugger_initCons, _List_Nil, value) + ); + } + + if (typeof tag === 'number') + { + return $elm$browser$Debugger$Expando$Primitive(''); + } + + var char = tag.charCodeAt(0); + if (char === 35 || 65 <= char && char <= 90) + { + var list = _List_Nil; + for (var i in value) + { + if (i === '$') continue; + list = _List_Cons(_Debugger_init(value[i]), list); + } + return A3($elm$browser$Debugger$Expando$Constructor, char === 35 ? $elm$core$Maybe$Nothing : $elm$core$Maybe$Just(tag), true, $elm$core$List$reverse(list)); + } + + return $elm$browser$Debugger$Expando$Primitive(''); + } + + if (typeof value === 'object') + { + var dict = $elm$core$Dict$empty; + for (var i in value) + { + dict = A3($elm$core$Dict$insert, i, _Debugger_init(value[i]), dict); + } + return A2($elm$browser$Debugger$Expando$Record, true, dict); + } + + return $elm$browser$Debugger$Expando$Primitive(''); +} + +var _Debugger_initCons = F2(function initConsHelp(value, list) +{ + return _List_Cons(_Debugger_init(value), list); +}); + +var _Debugger_initKeyValueCons = F3(function(key, value, list) +{ + return _List_Cons( + _Utils_Tuple2(_Debugger_init(key), _Debugger_init(value)), + list + ); +}); + +function _Debugger_addSlashes(str, isChar) +{ + var s = str + .replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t') + .replace(/\r/g, '\\r') + .replace(/\v/g, '\\v') + .replace(/\0/g, '\\0'); + if (isChar) + { + return s.replace(/\'/g, '\\\''); + } + else + { + return s.replace(/\"/g, '\\"'); + } +} + + + +// BLOCK EVENTS + + +function _Debugger_updateBlocker(oldBlocker, newBlocker) +{ + if (oldBlocker === newBlocker) return; + + var oldEvents = _Debugger_blockerToEvents(oldBlocker); + var newEvents = _Debugger_blockerToEvents(newBlocker); + + // remove old blockers + for (var i = 0; i < oldEvents.length; i++) + { + document.removeEventListener(oldEvents[i], _Debugger_blocker, true); + } + + // add new blockers + for (var i = 0; i < newEvents.length; i++) + { + document.addEventListener(newEvents[i], _Debugger_blocker, true); + } +} + + +function _Debugger_blocker(event) +{ + if (event.type === 'keydown' && event.metaKey && event.which === 82) + { + return; + } + + var isScroll = event.type === 'scroll' || event.type === 'wheel'; + for (var node = event.target; node; node = node.parentNode) + { + if (isScroll ? node.id === 'elm-debugger-details' : node.id === 'elm-debugger-overlay') + { + return; + } + } + + event.stopPropagation(); + event.preventDefault(); +} + +function _Debugger_blockerToEvents(blocker) +{ + return blocker === $elm$browser$Debugger$Overlay$BlockNone + ? [] + : blocker === $elm$browser$Debugger$Overlay$BlockMost + ? _Debugger_mostEvents + : _Debugger_allEvents; +} + +var _Debugger_mostEvents = [ + 'click', 'dblclick', 'mousemove', + 'mouseup', 'mousedown', 'mouseenter', 'mouseleave', + 'touchstart', 'touchend', 'touchcancel', 'touchmove', + 'pointerdown', 'pointerup', 'pointerover', 'pointerout', + 'pointerenter', 'pointerleave', 'pointermove', 'pointercancel', + 'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop', + 'keyup', 'keydown', 'keypress', + 'input', 'change', + 'focus', 'blur' +]; + +var _Debugger_allEvents = _Debugger_mostEvents.concat('wheel', 'scroll'); + + + + +// ELEMENT + + +var _Debugger_element; + +var _Browser_element = _Debugger_element || F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function(sendToApp, initialModel) { + var view = impl.view; + /**_UNUSED/ + var domNode = args['node']; + //*/ + /**/ + var domNode = args && args['node'] ? args['node'] : _Debug_crash(0); + //*/ + var currNode = _VirtualDom_virtualize(domNode); + + return _Browser_makeAnimator(initialModel, function(model) + { + var nextNode = view(model); + var patches = _VirtualDom_diff(currNode, nextNode); + domNode = _VirtualDom_applyPatches(domNode, currNode, patches, sendToApp); + currNode = nextNode; + }); + } + ); +}); + + + +// DOCUMENT + + +var _Debugger_document; + +var _Browser_document = _Debugger_document || F4(function(impl, flagDecoder, debugMetadata, args) +{ + return _Platform_initialize( + flagDecoder, + args, + impl.init, + impl.update, + impl.subscriptions, + function(sendToApp, initialModel) { + var divertHrefToApp = impl.setup && impl.setup(sendToApp) + var view = impl.view; + var title = _VirtualDom_doc.title; + var bodyNode = _VirtualDom_doc.body; + var currNode = _VirtualDom_virtualize(bodyNode); + return _Browser_makeAnimator(initialModel, function(model) + { + _VirtualDom_divertHrefToApp = divertHrefToApp; + var doc = view(model); + var nextNode = _VirtualDom_node('body')(_List_Nil)(doc.body); + var patches = _VirtualDom_diff(currNode, nextNode); + bodyNode = _VirtualDom_applyPatches(bodyNode, currNode, patches, sendToApp); + currNode = nextNode; + _VirtualDom_divertHrefToApp = 0; + (title !== doc.title) && (_VirtualDom_doc.title = title = doc.title); + }); + } + ); +}); + + + +// ANIMATION + + +var _Browser_cancelAnimationFrame = + typeof cancelAnimationFrame !== 'undefined' + ? cancelAnimationFrame + : function(id) { clearTimeout(id); }; + +var _Browser_requestAnimationFrame = + typeof requestAnimationFrame !== 'undefined' + ? requestAnimationFrame + : function(callback) { return setTimeout(callback, 1000 / 60); }; + + +function _Browser_makeAnimator(model, draw) +{ + draw(model); + + var state = 0; + + function updateIfNeeded() + { + state = state === 1 + ? 0 + : ( _Browser_requestAnimationFrame(updateIfNeeded), draw(model), 1 ); + } + + return function(nextModel, isSync) + { + model = nextModel; + + isSync + ? ( draw(model), + state === 2 && (state = 1) + ) + : ( state === 0 && _Browser_requestAnimationFrame(updateIfNeeded), + state = 2 + ); + }; +} + + + +// APPLICATION + + +function _Browser_application(impl) +{ + var onUrlChange = impl.onUrlChange; + var onUrlRequest = impl.onUrlRequest; + var key = function() { key.a(onUrlChange(_Browser_getUrl())); }; + + return _Browser_document({ + setup: function(sendToApp) + { + key.a = sendToApp; + _Browser_window.addEventListener('popstate', key); + _Browser_window.navigator.userAgent.indexOf('Trident') < 0 || _Browser_window.addEventListener('hashchange', key); + + return F2(function(domNode, event) + { + if (!event.ctrlKey && !event.metaKey && !event.shiftKey && event.button < 1 && !domNode.target && !domNode.hasAttribute('download')) + { + event.preventDefault(); + var href = domNode.href; + var curr = _Browser_getUrl(); + var next = $elm$url$Url$fromString(href).a; + sendToApp(onUrlRequest( + (next + && curr.protocol === next.protocol + && curr.host === next.host + && curr.port_.a === next.port_.a + ) + ? $elm$browser$Browser$Internal(next) + : $elm$browser$Browser$External(href) + )); + } + }); + }, + init: function(flags) + { + return A3(impl.init, flags, _Browser_getUrl(), key); + }, + view: impl.view, + update: impl.update, + subscriptions: impl.subscriptions + }); +} + +function _Browser_getUrl() +{ + return $elm$url$Url$fromString(_VirtualDom_doc.location.href).a || _Debug_crash(1); +} + +var _Browser_go = F2(function(key, n) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + n && history.go(n); + key(); + })); +}); + +var _Browser_pushUrl = F2(function(key, url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + history.pushState({}, '', url); + key(); + })); +}); + +var _Browser_replaceUrl = F2(function(key, url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function() { + history.replaceState({}, '', url); + key(); + })); +}); + + + +// GLOBAL EVENTS + + +var _Browser_fakeNode = { addEventListener: function() {}, removeEventListener: function() {} }; +var _Browser_doc = typeof document !== 'undefined' ? document : _Browser_fakeNode; +var _Browser_window = typeof window !== 'undefined' ? window : _Browser_fakeNode; + +var _Browser_on = F3(function(node, eventName, sendToSelf) +{ + return _Scheduler_spawn(_Scheduler_binding(function(callback) + { + function handler(event) { _Scheduler_rawSpawn(sendToSelf(event)); } + node.addEventListener(eventName, handler, _VirtualDom_passiveSupported && { passive: true }); + return function() { node.removeEventListener(eventName, handler); }; + })); +}); + +var _Browser_decodeEvent = F2(function(decoder, event) +{ + var result = _Json_runHelp(decoder, event); + return $elm$core$Result$isOk(result) ? $elm$core$Maybe$Just(result.a) : $elm$core$Maybe$Nothing; +}); + + + +// PAGE VISIBILITY + + +function _Browser_visibilityInfo() +{ + return (typeof _VirtualDom_doc.hidden !== 'undefined') + ? { hidden: 'hidden', change: 'visibilitychange' } + : + (typeof _VirtualDom_doc.mozHidden !== 'undefined') + ? { hidden: 'mozHidden', change: 'mozvisibilitychange' } + : + (typeof _VirtualDom_doc.msHidden !== 'undefined') + ? { hidden: 'msHidden', change: 'msvisibilitychange' } + : + (typeof _VirtualDom_doc.webkitHidden !== 'undefined') + ? { hidden: 'webkitHidden', change: 'webkitvisibilitychange' } + : { hidden: 'hidden', change: 'visibilitychange' }; +} + + + +// ANIMATION FRAMES + + +function _Browser_rAF() +{ + return _Scheduler_binding(function(callback) + { + var id = _Browser_requestAnimationFrame(function() { + callback(_Scheduler_succeed(Date.now())); + }); + + return function() { + _Browser_cancelAnimationFrame(id); + }; + }); +} + + +function _Browser_now() +{ + return _Scheduler_binding(function(callback) + { + callback(_Scheduler_succeed(Date.now())); + }); +} + + + +// DOM STUFF + + +function _Browser_withNode(id, doStuff) +{ + return _Scheduler_binding(function(callback) + { + _Browser_requestAnimationFrame(function() { + var node = document.getElementById(id); + callback(node + ? _Scheduler_succeed(doStuff(node)) + : _Scheduler_fail($elm$browser$Browser$Dom$NotFound(id)) + ); + }); + }); +} + + +function _Browser_withWindow(doStuff) +{ + return _Scheduler_binding(function(callback) + { + _Browser_requestAnimationFrame(function() { + callback(_Scheduler_succeed(doStuff())); + }); + }); +} + + +// FOCUS and BLUR + + +var _Browser_call = F2(function(functionName, id) +{ + return _Browser_withNode(id, function(node) { + node[functionName](); + return _Utils_Tuple0; + }); +}); + + + +// WINDOW VIEWPORT + + +function _Browser_getViewport() +{ + return { + scene: _Browser_getScene(), + viewport: { + x: _Browser_window.pageXOffset, + y: _Browser_window.pageYOffset, + width: _Browser_doc.documentElement.clientWidth, + height: _Browser_doc.documentElement.clientHeight + } + }; +} + +function _Browser_getScene() +{ + var body = _Browser_doc.body; + var elem = _Browser_doc.documentElement; + return { + width: Math.max(body.scrollWidth, body.offsetWidth, elem.scrollWidth, elem.offsetWidth, elem.clientWidth), + height: Math.max(body.scrollHeight, body.offsetHeight, elem.scrollHeight, elem.offsetHeight, elem.clientHeight) + }; +} + +var _Browser_setViewport = F2(function(x, y) +{ + return _Browser_withWindow(function() + { + _Browser_window.scroll(x, y); + return _Utils_Tuple0; + }); +}); + + + +// ELEMENT VIEWPORT + + +function _Browser_getViewportOf(id) +{ + return _Browser_withNode(id, function(node) + { + return { + scene: { + width: node.scrollWidth, + height: node.scrollHeight + }, + viewport: { + x: node.scrollLeft, + y: node.scrollTop, + width: node.clientWidth, + height: node.clientHeight + } + }; + }); +} + + +var _Browser_setViewportOf = F3(function(id, x, y) +{ + return _Browser_withNode(id, function(node) + { + node.scrollLeft = x; + node.scrollTop = y; + return _Utils_Tuple0; + }); +}); + + + +// ELEMENT + + +function _Browser_getElement(id) +{ + return _Browser_withNode(id, function(node) + { + var rect = node.getBoundingClientRect(); + var x = _Browser_window.pageXOffset; + var y = _Browser_window.pageYOffset; + return { + scene: _Browser_getScene(), + viewport: { + x: x, + y: y, + width: _Browser_doc.documentElement.clientWidth, + height: _Browser_doc.documentElement.clientHeight + }, + element: { + x: x + rect.left, + y: y + rect.top, + width: rect.width, + height: rect.height + } + }; + }); +} + + + +// LOAD and RELOAD + + +function _Browser_reload(skipCache) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) + { + _VirtualDom_doc.location.reload(skipCache); + })); +} + +function _Browser_load(url) +{ + return A2($elm$core$Task$perform, $elm$core$Basics$never, _Scheduler_binding(function(callback) + { + try + { + _Browser_window.location = url; + } + catch(err) + { + // Only Firefox can throw a NS_ERROR_MALFORMED_URI exception here. + // Other browsers reload the page, so let's be consistent about that. + _VirtualDom_doc.location.reload(false); + } + })); +} + + + +function _Time_now(millisToPosix) +{ + return _Scheduler_binding(function(callback) + { + callback(_Scheduler_succeed(millisToPosix(Date.now()))); + }); +} + +var _Time_setInterval = F2(function(interval, task) +{ + return _Scheduler_binding(function(callback) + { + var id = setInterval(function() { _Scheduler_rawSpawn(task); }, interval); + return function() { clearInterval(id); }; + }); +}); + +function _Time_here() +{ + return _Scheduler_binding(function(callback) + { + callback(_Scheduler_succeed( + A2($elm$time$Time$customZone, -(new Date().getTimezoneOffset()), _List_Nil) + )); + }); +} + + +function _Time_getZoneName() +{ + return _Scheduler_binding(function(callback) + { + try + { + var name = $elm$time$Time$Name(Intl.DateTimeFormat().resolvedOptions().timeZone); + } + catch (e) + { + var name = $elm$time$Time$Offset(new Date().getTimezoneOffset()); + } + callback(_Scheduler_succeed(name)); + }); +} + + + + +// STRINGS + + +var _Parser_isSubString = F5(function(smallString, offset, row, col, bigString) +{ + var smallLength = smallString.length; + var isGood = offset + smallLength <= bigString.length; + + for (var i = 0; isGood && i < smallLength; ) + { + var code = bigString.charCodeAt(offset); + isGood = + smallString[i++] === bigString[offset++] + && ( + code === 0x000A /* \n */ + ? ( row++, col=1 ) + : ( col++, (code & 0xF800) === 0xD800 ? smallString[i++] === bigString[offset++] : 1 ) + ) + } + + return _Utils_Tuple3(isGood ? offset : -1, row, col); +}); + + + +// CHARS + + +var _Parser_isSubChar = F3(function(predicate, offset, string) +{ + return ( + string.length <= offset + ? -1 + : + (string.charCodeAt(offset) & 0xF800) === 0xD800 + ? (predicate(_Utils_chr(string.substr(offset, 2))) ? offset + 2 : -1) + : + (predicate(_Utils_chr(string[offset])) + ? ((string[offset] === '\n') ? -2 : (offset + 1)) + : -1 + ) + ); +}); + + +var _Parser_isAsciiCode = F3(function(code, offset, string) +{ + return string.charCodeAt(offset) === code; +}); + + + +// NUMBERS + + +var _Parser_chompBase10 = F2(function(offset, string) +{ + for (; offset < string.length; offset++) + { + var code = string.charCodeAt(offset); + if (code < 0x30 || 0x39 < code) + { + return offset; + } + } + return offset; +}); + + +var _Parser_consumeBase = F3(function(base, offset, string) +{ + for (var total = 0; offset < string.length; offset++) + { + var digit = string.charCodeAt(offset) - 0x30; + if (digit < 0 || base <= digit) break; + total = base * total + digit; + } + return _Utils_Tuple2(offset, total); +}); + + +var _Parser_consumeBase16 = F2(function(offset, string) +{ + for (var total = 0; offset < string.length; offset++) + { + var code = string.charCodeAt(offset); + if (0x30 <= code && code <= 0x39) + { + total = 16 * total + code - 0x30; + } + else if (0x41 <= code && code <= 0x46) + { + total = 16 * total + code - 55; + } + else if (0x61 <= code && code <= 0x66) + { + total = 16 * total + code - 87; + } + else + { + break; + } + } + return _Utils_Tuple2(offset, total); +}); + + + +// FIND STRING + + +var _Parser_findSubString = F5(function(smallString, offset, row, col, bigString) +{ + var newOffset = bigString.indexOf(smallString, offset); + var target = newOffset < 0 ? bigString.length : newOffset + smallString.length; + + while (offset < target) + { + var code = bigString.charCodeAt(offset++); + code === 0x000A /* \n */ + ? ( col=1, row++ ) + : ( col++, (code & 0xF800) === 0xD800 && offset++ ) + } + + return _Utils_Tuple3(newOffset, row, col); +}); + + +// CREATE + +var _Regex_never = /.^/; + +var _Regex_fromStringWith = F2(function(options, string) +{ + var flags = 'g'; + if (options.multiline) { flags += 'm'; } + if (options.caseInsensitive) { flags += 'i'; } + + try + { + return $elm$core$Maybe$Just(new RegExp(string, flags)); + } + catch(error) + { + return $elm$core$Maybe$Nothing; + } +}); + + +// USE + +var _Regex_contains = F2(function(re, string) +{ + return string.match(re) !== null; +}); + + +var _Regex_findAtMost = F3(function(n, re, str) +{ + var out = []; + var number = 0; + var string = str; + var lastIndex = re.lastIndex; + var prevLastIndex = -1; + var result; + while (number++ < n && (result = re.exec(string))) + { + if (prevLastIndex == re.lastIndex) break; + var i = result.length - 1; + var subs = new Array(i); + while (i > 0) + { + var submatch = result[i]; + subs[--i] = submatch + ? $elm$core$Maybe$Just(submatch) + : $elm$core$Maybe$Nothing; + } + out.push(A4($elm$regex$Regex$Match, result[0], result.index, number, _List_fromArray(subs))); + prevLastIndex = re.lastIndex; + } + re.lastIndex = lastIndex; + return _List_fromArray(out); +}); + + +var _Regex_replaceAtMost = F4(function(n, re, replacer, string) +{ + var count = 0; + function jsReplacer(match) + { + if (count++ >= n) + { + return match; + } + var i = arguments.length - 3; + var submatches = new Array(i); + while (i > 0) + { + var submatch = arguments[i]; + submatches[--i] = submatch + ? $elm$core$Maybe$Just(submatch) + : $elm$core$Maybe$Nothing; + } + return replacer(A4($elm$regex$Regex$Match, match, arguments[arguments.length - 2], count, _List_fromArray(submatches))); + } + return string.replace(re, jsReplacer); +}); + +var _Regex_splitAtMost = F3(function(n, re, str) +{ + var string = str; + var out = []; + var start = re.lastIndex; + var restoreLastIndex = re.lastIndex; + while (n--) + { + var result = re.exec(string); + if (!result) break; + out.push(string.slice(start, result.index)); + start = re.lastIndex; + } + out.push(string.slice(start)); + re.lastIndex = restoreLastIndex; + return _List_fromArray(out); +}); + +var _Regex_infinity = Infinity; +var $elm$core$Basics$EQ = {$: 'EQ'}; +var $elm$core$Basics$GT = {$: 'GT'}; +var $elm$core$Basics$LT = {$: 'LT'}; +var $elm$core$List$cons = _List_cons; +var $elm$core$Dict$foldr = F3( + function (func, acc, t) { + foldr: + while (true) { + if (t.$ === 'RBEmpty_elm_builtin') { + return acc; + } else { + var key = t.b; + var value = t.c; + var left = t.d; + var right = t.e; + var $temp$func = func, + $temp$acc = A3( + func, + key, + value, + A3($elm$core$Dict$foldr, func, acc, right)), + $temp$t = left; + func = $temp$func; + acc = $temp$acc; + t = $temp$t; + continue foldr; + } + } + }); +var $elm$core$Dict$toList = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, list) { + return A2( + $elm$core$List$cons, + _Utils_Tuple2(key, value), + list); + }), + _List_Nil, + dict); +}; +var $elm$core$Dict$keys = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, keyList) { + return A2($elm$core$List$cons, key, keyList); + }), + _List_Nil, + dict); +}; +var $elm$core$Set$toList = function (_v0) { + var dict = _v0.a; + return $elm$core$Dict$keys(dict); +}; +var $elm$core$Elm$JsArray$foldr = _JsArray_foldr; +var $elm$core$Array$foldr = F3( + function (func, baseCase, _v0) { + var tree = _v0.c; + var tail = _v0.d; + var helper = F2( + function (node, acc) { + if (node.$ === 'SubTree') { + var subTree = node.a; + return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree); + } else { + var values = node.a; + return A3($elm$core$Elm$JsArray$foldr, func, acc, values); + } + }); + return A3( + $elm$core$Elm$JsArray$foldr, + helper, + A3($elm$core$Elm$JsArray$foldr, func, baseCase, tail), + tree); + }); +var $elm$core$Array$toList = function (array) { + return A3($elm$core$Array$foldr, $elm$core$List$cons, _List_Nil, array); +}; +var $elm$core$Result$Err = function (a) { + return {$: 'Err', a: a}; +}; +var $elm$json$Json$Decode$Failure = F2( + function (a, b) { + return {$: 'Failure', a: a, b: b}; + }); +var $elm$json$Json$Decode$Field = F2( + function (a, b) { + return {$: 'Field', a: a, b: b}; + }); +var $elm$json$Json$Decode$Index = F2( + function (a, b) { + return {$: 'Index', a: a, b: b}; + }); +var $elm$core$Result$Ok = function (a) { + return {$: 'Ok', a: a}; +}; +var $elm$json$Json$Decode$OneOf = function (a) { + return {$: 'OneOf', a: a}; +}; +var $elm$core$Basics$False = {$: 'False'}; +var $elm$core$Basics$add = _Basics_add; +var $elm$core$Maybe$Just = function (a) { + return {$: 'Just', a: a}; +}; +var $elm$core$Maybe$Nothing = {$: 'Nothing'}; +var $elm$core$String$all = _String_all; +var $elm$core$Basics$and = _Basics_and; +var $elm$core$Basics$append = _Utils_append; +var $elm$json$Json$Encode$encode = _Json_encode; +var $elm$core$String$fromInt = _String_fromNumber; +var $elm$core$String$join = F2( + function (sep, chunks) { + return A2( + _String_join, + sep, + _List_toArray(chunks)); + }); +var $elm$core$String$split = F2( + function (sep, string) { + return _List_fromArray( + A2(_String_split, sep, string)); + }); +var $elm$json$Json$Decode$indent = function (str) { + return A2( + $elm$core$String$join, + '\n ', + A2($elm$core$String$split, '\n', str)); +}; +var $elm$core$List$foldl = F3( + function (func, acc, list) { + foldl: + while (true) { + if (!list.b) { + return acc; + } else { + var x = list.a; + var xs = list.b; + var $temp$func = func, + $temp$acc = A2(func, x, acc), + $temp$list = xs; + func = $temp$func; + acc = $temp$acc; + list = $temp$list; + continue foldl; + } + } + }); +var $elm$core$List$length = function (xs) { + return A3( + $elm$core$List$foldl, + F2( + function (_v0, i) { + return i + 1; + }), + 0, + xs); +}; +var $elm$core$List$map2 = _List_map2; +var $elm$core$Basics$le = _Utils_le; +var $elm$core$Basics$sub = _Basics_sub; +var $elm$core$List$rangeHelp = F3( + function (lo, hi, list) { + rangeHelp: + while (true) { + if (_Utils_cmp(lo, hi) < 1) { + var $temp$lo = lo, + $temp$hi = hi - 1, + $temp$list = A2($elm$core$List$cons, hi, list); + lo = $temp$lo; + hi = $temp$hi; + list = $temp$list; + continue rangeHelp; + } else { + return list; + } + } + }); +var $elm$core$List$range = F2( + function (lo, hi) { + return A3($elm$core$List$rangeHelp, lo, hi, _List_Nil); + }); +var $elm$core$List$indexedMap = F2( + function (f, xs) { + return A3( + $elm$core$List$map2, + f, + A2( + $elm$core$List$range, + 0, + $elm$core$List$length(xs) - 1), + xs); + }); +var $elm$core$Char$toCode = _Char_toCode; +var $elm$core$Char$isLower = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (97 <= code) && (code <= 122); +}; +var $elm$core$Char$isUpper = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 90) && (65 <= code); +}; +var $elm$core$Basics$or = _Basics_or; +var $elm$core$Char$isAlpha = function (_char) { + return $elm$core$Char$isLower(_char) || $elm$core$Char$isUpper(_char); +}; +var $elm$core$Char$isDigit = function (_char) { + var code = $elm$core$Char$toCode(_char); + return (code <= 57) && (48 <= code); +}; +var $elm$core$Char$isAlphaNum = function (_char) { + return $elm$core$Char$isLower(_char) || ($elm$core$Char$isUpper(_char) || $elm$core$Char$isDigit(_char)); +}; +var $elm$core$List$reverse = function (list) { + return A3($elm$core$List$foldl, $elm$core$List$cons, _List_Nil, list); +}; +var $elm$core$String$uncons = _String_uncons; +var $elm$json$Json$Decode$errorOneOf = F2( + function (i, error) { + return '\n\n(' + ($elm$core$String$fromInt(i + 1) + (') ' + $elm$json$Json$Decode$indent( + $elm$json$Json$Decode$errorToString(error)))); + }); +var $elm$json$Json$Decode$errorToString = function (error) { + return A2($elm$json$Json$Decode$errorToStringHelp, error, _List_Nil); +}; +var $elm$json$Json$Decode$errorToStringHelp = F2( + function (error, context) { + errorToStringHelp: + while (true) { + switch (error.$) { + case 'Field': + var f = error.a; + var err = error.b; + var isSimple = function () { + var _v1 = $elm$core$String$uncons(f); + if (_v1.$ === 'Nothing') { + return false; + } else { + var _v2 = _v1.a; + var _char = _v2.a; + var rest = _v2.b; + return $elm$core$Char$isAlpha(_char) && A2($elm$core$String$all, $elm$core$Char$isAlphaNum, rest); + } + }(); + var fieldName = isSimple ? ('.' + f) : ('[\'' + (f + '\']')); + var $temp$error = err, + $temp$context = A2($elm$core$List$cons, fieldName, context); + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + case 'Index': + var i = error.a; + var err = error.b; + var indexName = '[' + ($elm$core$String$fromInt(i) + ']'); + var $temp$error = err, + $temp$context = A2($elm$core$List$cons, indexName, context); + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + case 'OneOf': + var errors = error.a; + if (!errors.b) { + return 'Ran into a Json.Decode.oneOf with no possibilities' + function () { + if (!context.b) { + return '!'; + } else { + return ' at json' + A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)); + } + }(); + } else { + if (!errors.b.b) { + var err = errors.a; + var $temp$error = err, + $temp$context = context; + error = $temp$error; + context = $temp$context; + continue errorToStringHelp; + } else { + var starter = function () { + if (!context.b) { + return 'Json.Decode.oneOf'; + } else { + return 'The Json.Decode.oneOf at json' + A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)); + } + }(); + var introduction = starter + (' failed in the following ' + ($elm$core$String$fromInt( + $elm$core$List$length(errors)) + ' ways:')); + return A2( + $elm$core$String$join, + '\n\n', + A2( + $elm$core$List$cons, + introduction, + A2($elm$core$List$indexedMap, $elm$json$Json$Decode$errorOneOf, errors))); + } + } + default: + var msg = error.a; + var json = error.b; + var introduction = function () { + if (!context.b) { + return 'Problem with the given value:\n\n'; + } else { + return 'Problem with the value at json' + (A2( + $elm$core$String$join, + '', + $elm$core$List$reverse(context)) + ':\n\n '); + } + }(); + return introduction + ($elm$json$Json$Decode$indent( + A2($elm$json$Json$Encode$encode, 4, json)) + ('\n\n' + msg)); + } + } + }); +var $elm$core$Array$branchFactor = 32; +var $elm$core$Array$Array_elm_builtin = F4( + function (a, b, c, d) { + return {$: 'Array_elm_builtin', a: a, b: b, c: c, d: d}; + }); +var $elm$core$Elm$JsArray$empty = _JsArray_empty; +var $elm$core$Basics$ceiling = _Basics_ceiling; +var $elm$core$Basics$fdiv = _Basics_fdiv; +var $elm$core$Basics$logBase = F2( + function (base, number) { + return _Basics_log(number) / _Basics_log(base); + }); +var $elm$core$Basics$toFloat = _Basics_toFloat; +var $elm$core$Array$shiftStep = $elm$core$Basics$ceiling( + A2($elm$core$Basics$logBase, 2, $elm$core$Array$branchFactor)); +var $elm$core$Array$empty = A4($elm$core$Array$Array_elm_builtin, 0, $elm$core$Array$shiftStep, $elm$core$Elm$JsArray$empty, $elm$core$Elm$JsArray$empty); +var $elm$core$Elm$JsArray$initialize = _JsArray_initialize; +var $elm$core$Array$Leaf = function (a) { + return {$: 'Leaf', a: a}; +}; +var $elm$core$Basics$apL = F2( + function (f, x) { + return f(x); + }); +var $elm$core$Basics$apR = F2( + function (x, f) { + return f(x); + }); +var $elm$core$Basics$eq = _Utils_equal; +var $elm$core$Basics$floor = _Basics_floor; +var $elm$core$Elm$JsArray$length = _JsArray_length; +var $elm$core$Basics$gt = _Utils_gt; +var $elm$core$Basics$max = F2( + function (x, y) { + return (_Utils_cmp(x, y) > 0) ? x : y; + }); +var $elm$core$Basics$mul = _Basics_mul; +var $elm$core$Array$SubTree = function (a) { + return {$: 'SubTree', a: a}; +}; +var $elm$core$Elm$JsArray$initializeFromList = _JsArray_initializeFromList; +var $elm$core$Array$compressNodes = F2( + function (nodes, acc) { + compressNodes: + while (true) { + var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodes); + var node = _v0.a; + var remainingNodes = _v0.b; + var newAcc = A2( + $elm$core$List$cons, + $elm$core$Array$SubTree(node), + acc); + if (!remainingNodes.b) { + return $elm$core$List$reverse(newAcc); + } else { + var $temp$nodes = remainingNodes, + $temp$acc = newAcc; + nodes = $temp$nodes; + acc = $temp$acc; + continue compressNodes; + } + } + }); +var $elm$core$Tuple$first = function (_v0) { + var x = _v0.a; + return x; +}; +var $elm$core$Array$treeFromBuilder = F2( + function (nodeList, nodeListSize) { + treeFromBuilder: + while (true) { + var newNodeSize = $elm$core$Basics$ceiling(nodeListSize / $elm$core$Array$branchFactor); + if (newNodeSize === 1) { + return A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, nodeList).a; + } else { + var $temp$nodeList = A2($elm$core$Array$compressNodes, nodeList, _List_Nil), + $temp$nodeListSize = newNodeSize; + nodeList = $temp$nodeList; + nodeListSize = $temp$nodeListSize; + continue treeFromBuilder; + } + } + }); +var $elm$core$Array$builderToArray = F2( + function (reverseNodeList, builder) { + if (!builder.nodeListSize) { + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.tail), + $elm$core$Array$shiftStep, + $elm$core$Elm$JsArray$empty, + builder.tail); + } else { + var treeLen = builder.nodeListSize * $elm$core$Array$branchFactor; + var depth = $elm$core$Basics$floor( + A2($elm$core$Basics$logBase, $elm$core$Array$branchFactor, treeLen - 1)); + var correctNodeList = reverseNodeList ? $elm$core$List$reverse(builder.nodeList) : builder.nodeList; + var tree = A2($elm$core$Array$treeFromBuilder, correctNodeList, builder.nodeListSize); + return A4( + $elm$core$Array$Array_elm_builtin, + $elm$core$Elm$JsArray$length(builder.tail) + treeLen, + A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep), + tree, + builder.tail); + } + }); +var $elm$core$Basics$idiv = _Basics_idiv; +var $elm$core$Basics$lt = _Utils_lt; +var $elm$core$Array$initializeHelp = F5( + function (fn, fromIndex, len, nodeList, tail) { + initializeHelp: + while (true) { + if (fromIndex < 0) { + return A2( + $elm$core$Array$builderToArray, + false, + {nodeList: nodeList, nodeListSize: (len / $elm$core$Array$branchFactor) | 0, tail: tail}); + } else { + var leaf = $elm$core$Array$Leaf( + A3($elm$core$Elm$JsArray$initialize, $elm$core$Array$branchFactor, fromIndex, fn)); + var $temp$fn = fn, + $temp$fromIndex = fromIndex - $elm$core$Array$branchFactor, + $temp$len = len, + $temp$nodeList = A2($elm$core$List$cons, leaf, nodeList), + $temp$tail = tail; + fn = $temp$fn; + fromIndex = $temp$fromIndex; + len = $temp$len; + nodeList = $temp$nodeList; + tail = $temp$tail; + continue initializeHelp; + } + } + }); +var $elm$core$Basics$remainderBy = _Basics_remainderBy; +var $elm$core$Array$initialize = F2( + function (len, fn) { + if (len <= 0) { + return $elm$core$Array$empty; + } else { + var tailLen = len % $elm$core$Array$branchFactor; + var tail = A3($elm$core$Elm$JsArray$initialize, tailLen, len - tailLen, fn); + var initialFromIndex = (len - tailLen) - $elm$core$Array$branchFactor; + return A5($elm$core$Array$initializeHelp, fn, initialFromIndex, len, _List_Nil, tail); + } + }); +var $elm$core$Basics$True = {$: 'True'}; +var $elm$core$Result$isOk = function (result) { + if (result.$ === 'Ok') { + return true; + } else { + return false; + } +}; +var $elm$json$Json$Decode$map = _Json_map1; +var $elm$json$Json$Decode$map2 = _Json_map2; +var $elm$json$Json$Decode$succeed = _Json_succeed; +var $elm$virtual_dom$VirtualDom$toHandlerInt = function (handler) { + switch (handler.$) { + case 'Normal': + return 0; + case 'MayStopPropagation': + return 1; + case 'MayPreventDefault': + return 2; + default: + return 3; + } +}; +var $elm$browser$Debugger$Expando$ArraySeq = {$: 'ArraySeq'}; +var $elm$browser$Debugger$Overlay$BlockMost = {$: 'BlockMost'}; +var $elm$browser$Debugger$Overlay$BlockNone = {$: 'BlockNone'}; +var $elm$browser$Debugger$Expando$Constructor = F3( + function (a, b, c) { + return {$: 'Constructor', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Expando$Dictionary = F2( + function (a, b) { + return {$: 'Dictionary', a: a, b: b}; + }); +var $elm$browser$Debugger$Main$Down = {$: 'Down'}; +var $elm$browser$Debugger$Expando$ListSeq = {$: 'ListSeq'}; +var $elm$browser$Debugger$Main$NoOp = {$: 'NoOp'}; +var $elm$browser$Debugger$Expando$Primitive = function (a) { + return {$: 'Primitive', a: a}; +}; +var $elm$browser$Debugger$Expando$Record = F2( + function (a, b) { + return {$: 'Record', a: a, b: b}; + }); +var $elm$browser$Debugger$Expando$S = function (a) { + return {$: 'S', a: a}; +}; +var $elm$browser$Debugger$Expando$Sequence = F3( + function (a, b, c) { + return {$: 'Sequence', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Expando$SetSeq = {$: 'SetSeq'}; +var $elm$browser$Debugger$Main$Up = {$: 'Up'}; +var $elm$browser$Debugger$Main$UserMsg = function (a) { + return {$: 'UserMsg', a: a}; +}; +var $elm$browser$Debugger$Main$Export = {$: 'Export'}; +var $elm$browser$Debugger$Main$Import = {$: 'Import'}; +var $elm$browser$Debugger$Main$Open = {$: 'Open'}; +var $elm$browser$Debugger$Main$OverlayMsg = function (a) { + return {$: 'OverlayMsg', a: a}; +}; +var $elm$browser$Debugger$Main$Resume = {$: 'Resume'}; +var $elm$browser$Debugger$Main$isPaused = function (state) { + if (state.$ === 'Running') { + return false; + } else { + return true; + } +}; +var $elm$browser$Debugger$History$size = function (history) { + return history.numMessages; +}; +var $elm$browser$Debugger$Overlay$Accept = function (a) { + return {$: 'Accept', a: a}; +}; +var $elm$browser$Debugger$Overlay$Choose = F2( + function (a, b) { + return {$: 'Choose', a: a, b: b}; + }); +var $elm$html$Html$div = _VirtualDom_node('div'); +var $elm$json$Json$Encode$string = _Json_wrap; +var $elm$html$Html$Attributes$stringProperty = F2( + function (key, string) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$string(string)); + }); +var $elm$html$Html$Attributes$id = $elm$html$Html$Attributes$stringProperty('id'); +var $elm$virtual_dom$VirtualDom$Normal = function (a) { + return {$: 'Normal', a: a}; +}; +var $elm$virtual_dom$VirtualDom$on = _VirtualDom_on; +var $elm$html$Html$Events$on = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$Normal(decoder)); + }); +var $elm$html$Html$Events$onClick = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'click', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$html$Html$span = _VirtualDom_node('span'); +var $elm$virtual_dom$VirtualDom$style = _VirtualDom_style; +var $elm$html$Html$Attributes$style = $elm$virtual_dom$VirtualDom$style; +var $elm$virtual_dom$VirtualDom$text = _VirtualDom_text; +var $elm$html$Html$text = $elm$virtual_dom$VirtualDom$text; +var $elm$html$Html$a = _VirtualDom_node('a'); +var $elm$browser$Debugger$Overlay$goodNews1 = '\nThe good news is that having values like this in your message type is not\nso great in the long run. You are better off using simpler data, like\n'; +var $elm$browser$Debugger$Overlay$goodNews2 = '\nfunction can pattern match on that data and call whatever functions, JSON\ndecoders, etc. you need. This makes the code much more explicit and easy to\nfollow for other readers (or you in a few months!)\n'; +var $elm$html$Html$Attributes$href = function (url) { + return A2( + $elm$html$Html$Attributes$stringProperty, + 'href', + _VirtualDom_noJavaScriptUri(url)); +}; +var $elm$core$List$foldrHelper = F4( + function (fn, acc, ctr, ls) { + if (!ls.b) { + return acc; + } else { + var a = ls.a; + var r1 = ls.b; + if (!r1.b) { + return A2(fn, a, acc); + } else { + var b = r1.a; + var r2 = r1.b; + if (!r2.b) { + return A2( + fn, + a, + A2(fn, b, acc)); + } else { + var c = r2.a; + var r3 = r2.b; + if (!r3.b) { + return A2( + fn, + a, + A2( + fn, + b, + A2(fn, c, acc))); + } else { + var d = r3.a; + var r4 = r3.b; + var res = (ctr > 500) ? A3( + $elm$core$List$foldl, + fn, + acc, + $elm$core$List$reverse(r4)) : A4($elm$core$List$foldrHelper, fn, acc, ctr + 1, r4); + return A2( + fn, + a, + A2( + fn, + b, + A2( + fn, + c, + A2(fn, d, res)))); + } + } + } + } + }); +var $elm$core$List$foldr = F3( + function (fn, acc, ls) { + return A4($elm$core$List$foldrHelper, fn, acc, 0, ls); + }); +var $elm$core$List$map = F2( + function (f, xs) { + return A3( + $elm$core$List$foldr, + F2( + function (x, acc) { + return A2( + $elm$core$List$cons, + f(x), + acc); + }), + _List_Nil, + xs); + }); +var $elm$html$Html$p = _VirtualDom_node('p'); +var $elm$html$Html$ul = _VirtualDom_node('ul'); +var $elm$html$Html$code = _VirtualDom_node('code'); +var $elm$browser$Debugger$Overlay$viewCode = function (name) { + return A2( + $elm$html$Html$code, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(name) + ])); +}; +var $elm$browser$Debugger$Overlay$addCommas = function (items) { + if (!items.b) { + return ''; + } else { + if (!items.b.b) { + var item = items.a; + return item; + } else { + if (!items.b.b.b) { + var item1 = items.a; + var _v1 = items.b; + var item2 = _v1.a; + return item1 + (' and ' + item2); + } else { + var lastItem = items.a; + var otherItems = items.b; + return A2( + $elm$core$String$join, + ', ', + _Utils_ap( + otherItems, + _List_fromArray( + [' and ' + lastItem]))); + } + } + } +}; +var $elm$html$Html$li = _VirtualDom_node('li'); +var $elm$browser$Debugger$Overlay$problemToString = function (problem) { + switch (problem.$) { + case 'Function': + return 'functions'; + case 'Decoder': + return 'JSON decoders'; + case 'Task': + return 'tasks'; + case 'Process': + return 'processes'; + case 'Socket': + return 'web sockets'; + case 'Request': + return 'HTTP requests'; + case 'Program': + return 'programs'; + default: + return 'virtual DOM values'; + } +}; +var $elm$browser$Debugger$Overlay$viewProblemType = function (_v0) { + var problems = _v0.problems; + var name = _v0.name; + return A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$viewCode(name), + $elm$html$Html$text( + ' can contain ' + ($elm$browser$Debugger$Overlay$addCommas( + A2($elm$core$List$map, $elm$browser$Debugger$Overlay$problemToString, problems)) + '.')) + ])); +}; +var $elm$browser$Debugger$Overlay$viewBadMetadata = function (_v0) { + var problems = _v0.problems; + var message = _v0.message; + return _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('The '), + $elm$browser$Debugger$Overlay$viewCode(message), + $elm$html$Html$text(' type of your program cannot be reliably serialized for history files.') + ])), + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Functions cannot be serialized, nor can values that contain functions. This is a problem in these places:') + ])), + A2( + $elm$html$Html$ul, + _List_Nil, + A2($elm$core$List$map, $elm$browser$Debugger$Overlay$viewProblemType, problems)), + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text($elm$browser$Debugger$Overlay$goodNews1), + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $elm$html$Html$Attributes$href('https://guide.elm-lang.org/types/custom_types.html') + ]), + _List_fromArray( + [ + $elm$html$Html$text('custom types') + ])), + $elm$html$Html$text(', in your messages. From there, your '), + $elm$browser$Debugger$Overlay$viewCode('update'), + $elm$html$Html$text($elm$browser$Debugger$Overlay$goodNews2) + ])) + ]); +}; +var $elm$virtual_dom$VirtualDom$map = _VirtualDom_map; +var $elm$html$Html$map = $elm$virtual_dom$VirtualDom$map; +var $elm$browser$Debugger$Overlay$Cancel = {$: 'Cancel'}; +var $elm$browser$Debugger$Overlay$Proceed = {$: 'Proceed'}; +var $elm$html$Html$button = _VirtualDom_node('button'); +var $elm$browser$Debugger$Overlay$viewButtons = function (buttons) { + var btn = F2( + function (msg, string) { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'margin-right', '20px'), + $elm$html$Html$Events$onClick(msg) + ]), + _List_fromArray( + [ + $elm$html$Html$text(string) + ])); + }); + var buttonNodes = function () { + if (buttons.$ === 'Accept') { + var proceed = buttons.a; + return _List_fromArray( + [ + A2(btn, $elm$browser$Debugger$Overlay$Proceed, proceed) + ]); + } else { + var cancel = buttons.a; + var proceed = buttons.b; + return _List_fromArray( + [ + A2(btn, $elm$browser$Debugger$Overlay$Cancel, cancel), + A2(btn, $elm$browser$Debugger$Overlay$Proceed, proceed) + ]); + } + }(); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'height', '60px'), + A2($elm$html$Html$Attributes$style, 'line-height', '60px'), + A2($elm$html$Html$Attributes$style, 'text-align', 'right'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') + ]), + buttonNodes); +}; +var $elm$browser$Debugger$Overlay$viewMessage = F4( + function (config, title, details, buttons) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-overlay'), + A2($elm$html$Html$Attributes$style, 'position', 'fixed'), + A2($elm$html$Html$Attributes$style, 'top', '0'), + A2($elm$html$Html$Attributes$style, 'left', '0'), + A2($elm$html$Html$Attributes$style, 'width', '100vw'), + A2($elm$html$Html$Attributes$style, 'height', '100vh'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'none'), + A2($elm$html$Html$Attributes$style, 'font-family', '\'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif'), + A2($elm$html$Html$Attributes$style, 'z-index', '2147483647') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'absolute'), + A2($elm$html$Html$Attributes$style, 'width', '600px'), + A2($elm$html$Html$Attributes$style, 'height', '100vh'), + A2($elm$html$Html$Attributes$style, 'padding-left', 'calc(50% - 300px)'), + A2($elm$html$Html$Attributes$style, 'padding-right', 'calc(50% - 300px)'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgba(200, 200, 200, 0.7)'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '36px'), + A2($elm$html$Html$Attributes$style, 'height', '80px'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)'), + A2($elm$html$Html$Attributes$style, 'padding-left', '22px'), + A2($elm$html$Html$Attributes$style, 'vertical-align', 'middle'), + A2($elm$html$Html$Attributes$style, 'line-height', '80px') + ]), + _List_fromArray( + [ + $elm$html$Html$text(title) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-details'), + A2($elm$html$Html$Attributes$style, 'padding', ' 8px 20px'), + A2($elm$html$Html$Attributes$style, 'overflow-y', 'auto'), + A2($elm$html$Html$Attributes$style, 'max-height', 'calc(100vh - 156px)'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(61, 61, 61)') + ]), + details), + A2( + $elm$html$Html$map, + config.wrap, + $elm$browser$Debugger$Overlay$viewButtons(buttons)) + ])) + ])); + }); +var $elm$virtual_dom$VirtualDom$attribute = F2( + function (key, value) { + return A2( + _VirtualDom_attribute, + _VirtualDom_noOnOrFormAction(key), + _VirtualDom_noJavaScriptOrHtmlUri(value)); + }); +var $elm$core$Basics$negate = function (n) { + return -n; +}; +var $elm$virtual_dom$VirtualDom$nodeNS = F2( + function (namespace, tag) { + return A2( + _VirtualDom_nodeNS, + namespace, + _VirtualDom_noScript(tag)); + }); +var $elm$core$String$fromFloat = _String_fromNumber; +var $elm$browser$Debugger$Overlay$viewShape = F4( + function (x, y, angle, coordinates) { + return A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'polygon', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'points', coordinates), + A2( + $elm$virtual_dom$VirtualDom$attribute, + 'transform', + 'translate(' + ($elm$core$String$fromFloat(x) + (' ' + ($elm$core$String$fromFloat(y) + (') rotate(' + ($elm$core$String$fromFloat(-angle) + ')')))))) + ]), + _List_Nil); + }); +var $elm$browser$Debugger$Overlay$elmLogo = A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'svg', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'viewBox', '-300 -300 600 600'), + A2($elm$virtual_dom$VirtualDom$attribute, 'xmlns', 'http://www.w3.org/2000/svg'), + A2($elm$virtual_dom$VirtualDom$attribute, 'fill', 'currentColor'), + A2($elm$virtual_dom$VirtualDom$attribute, 'width', '24px'), + A2($elm$virtual_dom$VirtualDom$attribute, 'height', '24px') + ]), + _List_fromArray( + [ + A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'g', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'transform', 'scale(1 -1)') + ]), + _List_fromArray( + [ + A4($elm$browser$Debugger$Overlay$viewShape, 0, -210, 0, '-280,-90 0,190 280,-90'), + A4($elm$browser$Debugger$Overlay$viewShape, -210, 0, 90, '-280,-90 0,190 280,-90'), + A4($elm$browser$Debugger$Overlay$viewShape, 207, 207, 45, '-198,-66 0,132 198,-66'), + A4($elm$browser$Debugger$Overlay$viewShape, 150, 0, 0, '-130,0 0,-130 130,0 0,130'), + A4($elm$browser$Debugger$Overlay$viewShape, -89, 239, 0, '-191,61 69,61 191,-61 -69,-61'), + A4($elm$browser$Debugger$Overlay$viewShape, 0, 106, 180, '-130,-44 0,86 130,-44'), + A4($elm$browser$Debugger$Overlay$viewShape, 256, -150, 270, '-130,-44 0,86 130,-44') + ])) + ])); +var $elm$core$String$length = _String_length; +var $elm$browser$Debugger$Overlay$viewMiniControls = F2( + function (config, numMsgs) { + var string = $elm$core$String$fromInt(numMsgs); + var width = $elm$core$String$fromInt( + 2 + $elm$core$String$length(string)); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'fixed'), + A2($elm$html$Html$Attributes$style, 'bottom', '2em'), + A2($elm$html$Html$Attributes$style, 'right', '2em'), + A2($elm$html$Html$Attributes$style, 'width', 'calc(42px + ' + (width + 'ch)')), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'background-color', '#1293D8'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'font-family', 'monospace'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto'), + A2($elm$html$Html$Attributes$style, 'z-index', '2147483647'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'center'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + $elm$html$Html$Events$onClick(config.open) + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$elmLogo, + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'padding-left', 'calc(1ch + 6px)'), + A2($elm$html$Html$Attributes$style, 'padding-right', '1ch') + ]), + _List_fromArray( + [ + $elm$html$Html$text(string) + ])) + ])); + }); +var $elm$browser$Debugger$Overlay$explanationBad = '\nThe messages in this history do not match the messages handled by your\nprogram. I noticed changes in the following types:\n'; +var $elm$browser$Debugger$Overlay$explanationRisky = '\nThis history seems old. It will work with this program, but some\nmessages have been added since the history was created:\n'; +var $elm$core$List$intersperse = F2( + function (sep, xs) { + if (!xs.b) { + return _List_Nil; + } else { + var hd = xs.a; + var tl = xs.b; + var step = F2( + function (x, rest) { + return A2( + $elm$core$List$cons, + sep, + A2($elm$core$List$cons, x, rest)); + }); + var spersed = A3($elm$core$List$foldr, step, _List_Nil, tl); + return A2($elm$core$List$cons, hd, spersed); + } + }); +var $elm$browser$Debugger$Overlay$viewMention = F2( + function (tags, verbed) { + var _v0 = A2( + $elm$core$List$map, + $elm$browser$Debugger$Overlay$viewCode, + $elm$core$List$reverse(tags)); + if (!_v0.b) { + return $elm$html$Html$text(''); + } else { + if (!_v0.b.b) { + var tag = _v0.a; + return A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(verbed), + tag, + $elm$html$Html$text('.') + ])); + } else { + if (!_v0.b.b.b) { + var tag2 = _v0.a; + var _v1 = _v0.b; + var tag1 = _v1.a; + return A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(verbed), + tag1, + $elm$html$Html$text(' and '), + tag2, + $elm$html$Html$text('.') + ])); + } else { + var lastTag = _v0.a; + var otherTags = _v0.b; + return A2( + $elm$html$Html$li, + _List_Nil, + A2( + $elm$core$List$cons, + $elm$html$Html$text(verbed), + _Utils_ap( + A2( + $elm$core$List$intersperse, + $elm$html$Html$text(', '), + $elm$core$List$reverse(otherTags)), + _List_fromArray( + [ + $elm$html$Html$text(', and '), + lastTag, + $elm$html$Html$text('.') + ])))); + } + } + } + }); +var $elm$browser$Debugger$Overlay$viewChange = function (change) { + return A2( + $elm$html$Html$li, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'margin', '8px 0') + ]), + function () { + if (change.$ === 'AliasChange') { + var name = change.a; + return _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '1.5em') + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$viewCode(name) + ])) + ]); + } else { + var name = change.a; + var argsMatch = change.b.argsMatch; + var added = change.b.added; + var changed = change.b.changed; + var removed = change.b.removed; + return _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '1.5em') + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Overlay$viewCode(name) + ])), + A2( + $elm$html$Html$ul, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'list-style-type', 'disc'), + A2($elm$html$Html$Attributes$style, 'padding-left', '2em') + ]), + _List_fromArray( + [ + A2($elm$browser$Debugger$Overlay$viewMention, removed, 'Removed '), + A2($elm$browser$Debugger$Overlay$viewMention, changed, 'Changed '), + A2($elm$browser$Debugger$Overlay$viewMention, added, 'Added ') + ])), + argsMatch ? $elm$html$Html$text('') : $elm$html$Html$text('This may be due to the fact that the type variable names changed.') + ]); + } + }()); +}; +var $elm$browser$Debugger$Overlay$viewReport = F2( + function (isBad, report) { + switch (report.$) { + case 'CorruptHistory': + return _List_fromArray( + [ + $elm$html$Html$text('Looks like this history file is corrupt. I cannot understand it.') + ]); + case 'VersionChanged': + var old = report.a; + var _new = report.b; + return _List_fromArray( + [ + $elm$html$Html$text('This history was created with Elm ' + (old + (', but you are using Elm ' + (_new + ' right now.')))) + ]); + case 'MessageChanged': + var old = report.a; + var _new = report.b; + return _List_fromArray( + [ + $elm$html$Html$text('To import some other history, the overall message type must' + ' be the same. The old history has '), + $elm$browser$Debugger$Overlay$viewCode(old), + $elm$html$Html$text(' messages, but the new program works with '), + $elm$browser$Debugger$Overlay$viewCode(_new), + $elm$html$Html$text(' messages.') + ]); + default: + var changes = report.a; + return _List_fromArray( + [ + A2( + $elm$html$Html$p, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + isBad ? $elm$browser$Debugger$Overlay$explanationBad : $elm$browser$Debugger$Overlay$explanationRisky) + ])), + A2( + $elm$html$Html$ul, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'list-style-type', 'none'), + A2($elm$html$Html$Attributes$style, 'padding-left', '20px') + ]), + A2($elm$core$List$map, $elm$browser$Debugger$Overlay$viewChange, changes)) + ]); + } + }); +var $elm$browser$Debugger$Overlay$view = F5( + function (config, isPaused, isOpen, numMsgs, state) { + switch (state.$) { + case 'None': + return isOpen ? $elm$html$Html$text('') : (isPaused ? A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-overlay'), + A2($elm$html$Html$Attributes$style, 'position', 'fixed'), + A2($elm$html$Html$Attributes$style, 'top', '0'), + A2($elm$html$Html$Attributes$style, 'left', '0'), + A2($elm$html$Html$Attributes$style, 'width', '100vw'), + A2($elm$html$Html$Attributes$style, 'height', '100vh'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'center'), + A2($elm$html$Html$Attributes$style, 'pointer-events', 'auto'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgba(200, 200, 200, 0.7)'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'font-family', '\'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif'), + A2($elm$html$Html$Attributes$style, 'z-index', '2147483646'), + $elm$html$Html$Events$onClick(config.resume) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'font-size', '80px') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Click to Resume') + ])), + A2($elm$browser$Debugger$Overlay$viewMiniControls, config, numMsgs) + ])) : A2($elm$browser$Debugger$Overlay$viewMiniControls, config, numMsgs)); + case 'BadMetadata': + var badMetadata_ = state.a; + return A4( + $elm$browser$Debugger$Overlay$viewMessage, + config, + 'Cannot use Import or Export', + $elm$browser$Debugger$Overlay$viewBadMetadata(badMetadata_), + $elm$browser$Debugger$Overlay$Accept('Ok')); + case 'BadImport': + var report = state.a; + return A4( + $elm$browser$Debugger$Overlay$viewMessage, + config, + 'Cannot Import History', + A2($elm$browser$Debugger$Overlay$viewReport, true, report), + $elm$browser$Debugger$Overlay$Accept('Ok')); + default: + var report = state.a; + return A4( + $elm$browser$Debugger$Overlay$viewMessage, + config, + 'Warning', + A2($elm$browser$Debugger$Overlay$viewReport, false, report), + A2($elm$browser$Debugger$Overlay$Choose, 'Cancel', 'Import Anyway')); + } + }); +var $elm$browser$Debugger$Main$cornerView = function (model) { + return A5( + $elm$browser$Debugger$Overlay$view, + {exportHistory: $elm$browser$Debugger$Main$Export, importHistory: $elm$browser$Debugger$Main$Import, open: $elm$browser$Debugger$Main$Open, resume: $elm$browser$Debugger$Main$Resume, wrap: $elm$browser$Debugger$Main$OverlayMsg}, + $elm$browser$Debugger$Main$isPaused(model.state), + _Debugger_isOpen(model.popout), + $elm$browser$Debugger$History$size(model.history), + model.overlay); +}; +var $elm$core$Dict$RBEmpty_elm_builtin = {$: 'RBEmpty_elm_builtin'}; +var $elm$core$Dict$empty = $elm$core$Dict$RBEmpty_elm_builtin; +var $elm$core$Set$foldr = F3( + function (func, initialState, _v0) { + var dict = _v0.a; + return A3( + $elm$core$Dict$foldr, + F3( + function (key, _v1, state) { + return A2(func, key, state); + }), + initialState, + dict); + }); +var $elm$browser$Debugger$Main$getCurrentModel = function (state) { + if (state.$ === 'Running') { + var model = state.a; + return model; + } else { + var model = state.b; + return model; + } +}; +var $elm$browser$Debugger$Main$getUserModel = function (model) { + return $elm$browser$Debugger$Main$getCurrentModel(model.state); +}; +var $elm$browser$Debugger$Main$initialWindowHeight = 420; +var $elm$browser$Debugger$Main$initialWindowWidth = 900; +var $elm$core$Dict$Black = {$: 'Black'}; +var $elm$core$Dict$RBNode_elm_builtin = F5( + function (a, b, c, d, e) { + return {$: 'RBNode_elm_builtin', a: a, b: b, c: c, d: d, e: e}; + }); +var $elm$core$Dict$Red = {$: 'Red'}; +var $elm$core$Dict$balance = F5( + function (color, key, value, left, right) { + if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Red')) { + var _v1 = right.a; + var rK = right.b; + var rV = right.c; + var rLeft = right.d; + var rRight = right.e; + if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) { + var _v3 = left.a; + var lK = left.b; + var lV = left.c; + var lLeft = left.d; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + key, + value, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + rK, + rV, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, left, rLeft), + rRight); + } + } else { + if ((((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) && (left.d.$ === 'RBNode_elm_builtin')) && (left.d.a.$ === 'Red')) { + var _v5 = left.a; + var lK = left.b; + var lV = left.c; + var _v6 = left.d; + var _v7 = _v6.a; + var llK = _v6.b; + var llV = _v6.c; + var llLeft = _v6.d; + var llRight = _v6.e; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + lK, + lV, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, key, value, lRight, right)); + } else { + return A5($elm$core$Dict$RBNode_elm_builtin, color, key, value, left, right); + } + } + }); +var $elm$core$Basics$compare = _Utils_compare; +var $elm$core$Dict$insertHelp = F3( + function (key, value, dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, $elm$core$Dict$RBEmpty_elm_builtin, $elm$core$Dict$RBEmpty_elm_builtin); + } else { + var nColor = dict.a; + var nKey = dict.b; + var nValue = dict.c; + var nLeft = dict.d; + var nRight = dict.e; + var _v1 = A2($elm$core$Basics$compare, key, nKey); + switch (_v1.$) { + case 'LT': + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + A3($elm$core$Dict$insertHelp, key, value, nLeft), + nRight); + case 'EQ': + return A5($elm$core$Dict$RBNode_elm_builtin, nColor, nKey, value, nLeft, nRight); + default: + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + nLeft, + A3($elm$core$Dict$insertHelp, key, value, nRight)); + } + } + }); +var $elm$core$Dict$insert = F3( + function (key, value, dict) { + var _v0 = A3($elm$core$Dict$insertHelp, key, value, dict); + if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) { + var _v1 = _v0.a; + var k = _v0.b; + var v = _v0.c; + var l = _v0.d; + var r = _v0.e; + return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r); + } else { + var x = _v0; + return x; + } + }); +var $elm$browser$Debugger$Main$cachedHistory = function (model) { + var _v0 = model.state; + if (_v0.$ === 'Running') { + return model.history; + } else { + var history = _v0.e; + return history; + } +}; +var $elm$virtual_dom$VirtualDom$node = function (tag) { + return _VirtualDom_node( + _VirtualDom_noScript(tag)); +}; +var $elm$html$Html$node = $elm$virtual_dom$VirtualDom$node; +var $elm$browser$Debugger$Main$DragEnd = {$: 'DragEnd'}; +var $elm$browser$Debugger$Main$getDragStatus = function (layout) { + if (layout.$ === 'Horizontal') { + var status = layout.a; + return status; + } else { + var status = layout.a; + return status; + } +}; +var $elm$browser$Debugger$Main$Drag = function (a) { + return {$: 'Drag', a: a}; +}; +var $elm$browser$Debugger$Main$DragInfo = F5( + function (x, y, down, width, height) { + return {down: down, height: height, width: width, x: x, y: y}; + }); +var $elm$json$Json$Decode$field = _Json_decodeField; +var $elm$json$Json$Decode$at = F2( + function (fields, decoder) { + return A3($elm$core$List$foldr, $elm$json$Json$Decode$field, decoder, fields); + }); +var $elm$json$Json$Decode$float = _Json_decodeFloat; +var $elm$browser$Debugger$Main$decodeDimension = function (field) { + return A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['currentTarget', 'ownerDocument', 'defaultView', field]), + $elm$json$Json$Decode$float); +}; +var $elm$json$Json$Decode$int = _Json_decodeInt; +var $elm$json$Json$Decode$map5 = _Json_map5; +var $elm$browser$Debugger$Main$onMouseMove = A2( + $elm$html$Html$Events$on, + 'mousemove', + A2( + $elm$json$Json$Decode$map, + $elm$browser$Debugger$Main$Drag, + A6( + $elm$json$Json$Decode$map5, + $elm$browser$Debugger$Main$DragInfo, + A2($elm$json$Json$Decode$field, 'pageX', $elm$json$Json$Decode$float), + A2($elm$json$Json$Decode$field, 'pageY', $elm$json$Json$Decode$float), + A2( + $elm$json$Json$Decode$field, + 'buttons', + A2( + $elm$json$Json$Decode$map, + function (v) { + return v === 1; + }, + $elm$json$Json$Decode$int)), + $elm$browser$Debugger$Main$decodeDimension('innerWidth'), + $elm$browser$Debugger$Main$decodeDimension('innerHeight')))); +var $elm$html$Html$Events$onMouseUp = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'mouseup', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$browser$Debugger$Main$toDragListeners = function (layout) { + var _v0 = $elm$browser$Debugger$Main$getDragStatus(layout); + if (_v0.$ === 'Static') { + return _List_Nil; + } else { + return _List_fromArray( + [ + $elm$browser$Debugger$Main$onMouseMove, + $elm$html$Html$Events$onMouseUp($elm$browser$Debugger$Main$DragEnd) + ]); + } +}; +var $elm$browser$Debugger$Main$toFlexDirection = function (layout) { + if (layout.$ === 'Horizontal') { + return 'row'; + } else { + return 'column-reverse'; + } +}; +var $elm$browser$Debugger$Main$DragStart = {$: 'DragStart'}; +var $elm$html$Html$Events$onMouseDown = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'mousedown', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$browser$Debugger$Main$toPercent = function (fraction) { + return $elm$core$String$fromFloat(100 * fraction) + '%'; +}; +var $elm$browser$Debugger$Main$viewDragZone = function (layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'absolute'), + A2($elm$html$Html$Attributes$style, 'top', '0'), + A2( + $elm$html$Html$Attributes$style, + 'left', + $elm$browser$Debugger$Main$toPercent(x)), + A2($elm$html$Html$Attributes$style, 'margin-left', '-5px'), + A2($elm$html$Html$Attributes$style, 'width', '10px'), + A2($elm$html$Html$Attributes$style, 'height', '100%'), + A2($elm$html$Html$Attributes$style, 'cursor', 'col-resize'), + $elm$html$Html$Events$onMouseDown($elm$browser$Debugger$Main$DragStart) + ]), + _List_Nil); + } else { + var y = layout.c; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'position', 'absolute'), + A2( + $elm$html$Html$Attributes$style, + 'top', + $elm$browser$Debugger$Main$toPercent(y)), + A2($elm$html$Html$Attributes$style, 'left', '0'), + A2($elm$html$Html$Attributes$style, 'margin-top', '-5px'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '10px'), + A2($elm$html$Html$Attributes$style, 'cursor', 'row-resize'), + $elm$html$Html$Events$onMouseDown($elm$browser$Debugger$Main$DragStart) + ]), + _List_Nil); + } +}; +var $elm$browser$Debugger$Main$TweakExpandoModel = function (a) { + return {$: 'TweakExpandoModel', a: a}; +}; +var $elm$browser$Debugger$Main$TweakExpandoMsg = function (a) { + return {$: 'TweakExpandoMsg', a: a}; +}; +var $elm$browser$Debugger$Main$toExpandoPercents = function (layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + return _Utils_Tuple2( + $elm$browser$Debugger$Main$toPercent(1 - x), + '100%'); + } else { + var y = layout.c; + return _Utils_Tuple2( + '100%', + $elm$browser$Debugger$Main$toPercent(y)); + } +}; +var $elm$browser$Debugger$Main$toMouseBlocker = function (layout) { + var _v0 = $elm$browser$Debugger$Main$getDragStatus(layout); + if (_v0.$ === 'Static') { + return 'auto'; + } else { + return 'none'; + } +}; +var $elm$browser$Debugger$Expando$Field = F2( + function (a, b) { + return {$: 'Field', a: a, b: b}; + }); +var $elm$browser$Debugger$Expando$Index = F3( + function (a, b, c) { + return {$: 'Index', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Expando$Key = {$: 'Key'}; +var $elm$browser$Debugger$Expando$None = {$: 'None'}; +var $elm$browser$Debugger$Expando$Toggle = {$: 'Toggle'}; +var $elm$browser$Debugger$Expando$Value = {$: 'Value'}; +var $elm$browser$Debugger$Expando$blue = A2($elm$html$Html$Attributes$style, 'color', 'rgb(28, 0, 207)'); +var $elm$core$Basics$composeL = F3( + function (g, f, x) { + return g( + f(x)); + }); +var $elm$browser$Debugger$Expando$leftPad = function (maybeKey) { + if (maybeKey.$ === 'Nothing') { + return _List_Nil; + } else { + return _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'padding-left', '4ch') + ]); + } +}; +var $elm$browser$Debugger$Expando$makeArrow = function (arrow) { + return A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'color', '#777'), + A2($elm$html$Html$Attributes$style, 'padding-left', '2ch'), + A2($elm$html$Html$Attributes$style, 'width', '2ch'), + A2($elm$html$Html$Attributes$style, 'display', 'inline-block') + ]), + _List_fromArray( + [ + $elm$html$Html$text(arrow) + ])); +}; +var $elm$browser$Debugger$Expando$purple = A2($elm$html$Html$Attributes$style, 'color', 'rgb(136, 19, 145)'); +var $elm$browser$Debugger$Expando$lineStarter = F3( + function (maybeKey, maybeIsClosed, description) { + var arrow = function () { + if (maybeIsClosed.$ === 'Nothing') { + return $elm$browser$Debugger$Expando$makeArrow(''); + } else { + if (maybeIsClosed.a) { + return $elm$browser$Debugger$Expando$makeArrow('▸'); + } else { + return $elm$browser$Debugger$Expando$makeArrow('▾'); + } + } + }(); + if (maybeKey.$ === 'Nothing') { + return A2($elm$core$List$cons, arrow, description); + } else { + var key = maybeKey.a; + return A2( + $elm$core$List$cons, + arrow, + A2( + $elm$core$List$cons, + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$purple]), + _List_fromArray( + [ + $elm$html$Html$text(key) + ])), + A2( + $elm$core$List$cons, + $elm$html$Html$text(' = '), + description))); + } + }); +var $elm$browser$Debugger$Expando$red = A2($elm$html$Html$Attributes$style, 'color', 'rgb(196, 26, 22)'); +var $elm$core$Tuple$second = function (_v0) { + var y = _v0.b; + return y; +}; +var $elm$browser$Debugger$Expando$seqTypeToString = F2( + function (n, seqType) { + switch (seqType.$) { + case 'ListSeq': + return 'List(' + ($elm$core$String$fromInt(n) + ')'); + case 'SetSeq': + return 'Set(' + ($elm$core$String$fromInt(n) + ')'); + default: + return 'Array(' + ($elm$core$String$fromInt(n) + ')'); + } + }); +var $elm$core$String$slice = _String_slice; +var $elm$core$String$left = F2( + function (n, string) { + return (n < 1) ? '' : A3($elm$core$String$slice, 0, n, string); + }); +var $elm$core$String$right = F2( + function (n, string) { + return (n < 1) ? '' : A3( + $elm$core$String$slice, + -n, + $elm$core$String$length(string), + string); + }); +var $elm$browser$Debugger$Expando$elideMiddle = function (str) { + return ($elm$core$String$length(str) <= 18) ? str : (A2($elm$core$String$left, 8, str) + ('...' + A2($elm$core$String$right, 8, str))); +}; +var $elm$core$Dict$isEmpty = function (dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return true; + } else { + return false; + } +}; +var $elm$browser$Debugger$Expando$viewExtraTinyRecord = F3( + function (length, starter, entries) { + if (!entries.b) { + return _Utils_Tuple2( + length + 1, + _List_fromArray( + [ + $elm$html$Html$text('}') + ])); + } else { + var field = entries.a; + var rest = entries.b; + var nextLength = (length + $elm$core$String$length(field)) + 1; + if (nextLength > 18) { + return _Utils_Tuple2( + length + 2, + _List_fromArray( + [ + $elm$html$Html$text('…}') + ])); + } else { + var _v1 = A3($elm$browser$Debugger$Expando$viewExtraTinyRecord, nextLength, ',', rest); + var finalLength = _v1.a; + var otherHtmls = _v1.b; + return _Utils_Tuple2( + finalLength, + A2( + $elm$core$List$cons, + $elm$html$Html$text(starter), + A2( + $elm$core$List$cons, + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$purple]), + _List_fromArray( + [ + $elm$html$Html$text(field) + ])), + otherHtmls))); + } + } + }); +var $elm$browser$Debugger$Expando$viewTinyHelp = function (str) { + return _Utils_Tuple2( + $elm$core$String$length(str), + _List_fromArray( + [ + $elm$html$Html$text(str) + ])); +}; +var $elm$core$Maybe$withDefault = F2( + function (_default, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return value; + } else { + return _default; + } + }); +var $elm$browser$Debugger$Expando$viewExtraTiny = function (value) { + if (value.$ === 'Record') { + var record = value.b; + return A3( + $elm$browser$Debugger$Expando$viewExtraTinyRecord, + 0, + '{', + $elm$core$Dict$keys(record)); + } else { + return $elm$browser$Debugger$Expando$viewTiny(value); + } +}; +var $elm$browser$Debugger$Expando$viewTiny = function (value) { + switch (value.$) { + case 'S': + var stringRep = value.a; + var str = $elm$browser$Debugger$Expando$elideMiddle(stringRep); + return _Utils_Tuple2( + $elm$core$String$length(str), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$red]), + _List_fromArray( + [ + $elm$html$Html$text(str) + ])) + ])); + case 'Primitive': + var stringRep = value.a; + return _Utils_Tuple2( + $elm$core$String$length(stringRep), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$blue]), + _List_fromArray( + [ + $elm$html$Html$text(stringRep) + ])) + ])); + case 'Sequence': + var seqType = value.a; + var valueList = value.c; + return $elm$browser$Debugger$Expando$viewTinyHelp( + A2( + $elm$browser$Debugger$Expando$seqTypeToString, + $elm$core$List$length(valueList), + seqType)); + case 'Dictionary': + var keyValuePairs = value.b; + return $elm$browser$Debugger$Expando$viewTinyHelp( + 'Dict(' + ($elm$core$String$fromInt( + $elm$core$List$length(keyValuePairs)) + ')')); + case 'Record': + var record = value.b; + return $elm$browser$Debugger$Expando$viewTinyRecord(record); + default: + if (!value.c.b) { + var maybeName = value.a; + return $elm$browser$Debugger$Expando$viewTinyHelp( + A2($elm$core$Maybe$withDefault, 'Unit', maybeName)); + } else { + var maybeName = value.a; + var valueList = value.c; + return $elm$browser$Debugger$Expando$viewTinyHelp( + function () { + if (maybeName.$ === 'Nothing') { + return 'Tuple(' + ($elm$core$String$fromInt( + $elm$core$List$length(valueList)) + ')'); + } else { + var name = maybeName.a; + return name + ' …'; + } + }()); + } + } +}; +var $elm$browser$Debugger$Expando$viewTinyRecord = function (record) { + return $elm$core$Dict$isEmpty(record) ? _Utils_Tuple2( + 2, + _List_fromArray( + [ + $elm$html$Html$text('{}') + ])) : A3( + $elm$browser$Debugger$Expando$viewTinyRecordHelp, + 0, + '{ ', + $elm$core$Dict$toList(record)); +}; +var $elm$browser$Debugger$Expando$viewTinyRecordHelp = F3( + function (length, starter, entries) { + if (!entries.b) { + return _Utils_Tuple2( + length + 2, + _List_fromArray( + [ + $elm$html$Html$text(' }') + ])); + } else { + var _v1 = entries.a; + var field = _v1.a; + var value = _v1.b; + var rest = entries.b; + var fieldLen = $elm$core$String$length(field); + var _v2 = $elm$browser$Debugger$Expando$viewExtraTiny(value); + var valueLen = _v2.a; + var valueHtmls = _v2.b; + var newLength = ((length + fieldLen) + valueLen) + 5; + if (newLength > 60) { + return _Utils_Tuple2( + length + 4, + _List_fromArray( + [ + $elm$html$Html$text(', … }') + ])); + } else { + var _v3 = A3($elm$browser$Debugger$Expando$viewTinyRecordHelp, newLength, ', ', rest); + var finalLength = _v3.a; + var otherHtmls = _v3.b; + return _Utils_Tuple2( + finalLength, + A2( + $elm$core$List$cons, + $elm$html$Html$text(starter), + A2( + $elm$core$List$cons, + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$purple]), + _List_fromArray( + [ + $elm$html$Html$text(field) + ])), + A2( + $elm$core$List$cons, + $elm$html$Html$text(' = '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, valueHtmls), + otherHtmls))))); + } + } + }); +var $elm$browser$Debugger$Expando$view = F2( + function (maybeKey, expando) { + switch (expando.$) { + case 'S': + var stringRep = expando.a; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Nothing, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$red]), + _List_fromArray( + [ + $elm$html$Html$text(stringRep) + ])) + ]))); + case 'Primitive': + var stringRep = expando.a; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Nothing, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [$elm$browser$Debugger$Expando$blue]), + _List_fromArray( + [ + $elm$html$Html$text(stringRep) + ])) + ]))); + case 'Sequence': + var seqType = expando.a; + var isClosed = expando.b; + var valueList = expando.c; + return A4($elm$browser$Debugger$Expando$viewSequence, maybeKey, seqType, isClosed, valueList); + case 'Dictionary': + var isClosed = expando.a; + var keyValuePairs = expando.b; + return A3($elm$browser$Debugger$Expando$viewDictionary, maybeKey, isClosed, keyValuePairs); + case 'Record': + var isClosed = expando.a; + var valueDict = expando.b; + return A3($elm$browser$Debugger$Expando$viewRecord, maybeKey, isClosed, valueDict); + default: + var maybeName = expando.a; + var isClosed = expando.b; + var valueList = expando.c; + return A4($elm$browser$Debugger$Expando$viewConstructor, maybeKey, maybeName, isClosed, valueList); + } + }); +var $elm$browser$Debugger$Expando$viewConstructor = F4( + function (maybeKey, maybeName, isClosed, valueList) { + var tinyArgs = A2( + $elm$core$List$map, + A2($elm$core$Basics$composeL, $elm$core$Tuple$second, $elm$browser$Debugger$Expando$viewExtraTiny), + valueList); + var description = function () { + var _v7 = _Utils_Tuple2(maybeName, tinyArgs); + if (_v7.a.$ === 'Nothing') { + if (!_v7.b.b) { + var _v8 = _v7.a; + return _List_fromArray( + [ + $elm$html$Html$text('()') + ]); + } else { + var _v9 = _v7.a; + var _v10 = _v7.b; + var x = _v10.a; + var xs = _v10.b; + return A2( + $elm$core$List$cons, + $elm$html$Html$text('( '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, x), + A3( + $elm$core$List$foldr, + F2( + function (args, rest) { + return A2( + $elm$core$List$cons, + $elm$html$Html$text(', '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, args), + rest)); + }), + _List_fromArray( + [ + $elm$html$Html$text(' )') + ]), + xs))); + } + } else { + if (!_v7.b.b) { + var name = _v7.a.a; + return _List_fromArray( + [ + $elm$html$Html$text(name) + ]); + } else { + var name = _v7.a.a; + var _v11 = _v7.b; + var x = _v11.a; + var xs = _v11.b; + return A2( + $elm$core$List$cons, + $elm$html$Html$text(name + ' '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, x), + A3( + $elm$core$List$foldr, + F2( + function (args, rest) { + return A2( + $elm$core$List$cons, + $elm$html$Html$text(' '), + A2( + $elm$core$List$cons, + A2($elm$html$Html$span, _List_Nil, args), + rest)); + }), + _List_Nil, + xs))); + } + } + }(); + var _v4 = function () { + if (!valueList.b) { + return _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A2($elm$html$Html$div, _List_Nil, _List_Nil)); + } else { + if (!valueList.b.b) { + var entry = valueList.a; + switch (entry.$) { + case 'S': + return _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A2($elm$html$Html$div, _List_Nil, _List_Nil)); + case 'Primitive': + return _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A2($elm$html$Html$div, _List_Nil, _List_Nil)); + case 'Sequence': + var subValueList = entry.c; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewSequenceOpen(subValueList))); + case 'Dictionary': + var keyValuePairs = entry.b; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewDictionaryOpen(keyValuePairs))); + case 'Record': + var record = entry.b; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewRecordOpen(record))); + default: + var subValueList = entry.c; + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, 0), + $elm$browser$Debugger$Expando$viewConstructorOpen(subValueList))); + } + } else { + return _Utils_Tuple2( + $elm$core$Maybe$Just(isClosed), + isClosed ? A2($elm$html$Html$div, _List_Nil, _List_Nil) : $elm$browser$Debugger$Expando$viewConstructorOpen(valueList)); + } + } + }(); + var maybeIsClosed = _v4.a; + var openHtml = _v4.b; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3($elm$browser$Debugger$Expando$lineStarter, maybeKey, maybeIsClosed, description)), + openHtml + ])); + }); +var $elm$browser$Debugger$Expando$viewConstructorEntry = F2( + function (index, value) { + return A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$None, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just( + $elm$core$String$fromInt(index)), + value)); + }); +var $elm$browser$Debugger$Expando$viewConstructorOpen = function (valueList) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewConstructorEntry, valueList)); +}; +var $elm$browser$Debugger$Expando$viewDictionary = F3( + function (maybeKey, isClosed, keyValuePairs) { + var starter = 'Dict(' + ($elm$core$String$fromInt( + $elm$core$List$length(keyValuePairs)) + ')'); + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Just(isClosed), + _List_fromArray( + [ + $elm$html$Html$text(starter) + ]))), + isClosed ? $elm$html$Html$text('') : $elm$browser$Debugger$Expando$viewDictionaryOpen(keyValuePairs) + ])); + }); +var $elm$browser$Debugger$Expando$viewDictionaryEntry = F2( + function (index, _v2) { + var key = _v2.a; + var value = _v2.b; + switch (key.$) { + case 'S': + var stringRep = key.a; + return A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just(stringRep), + value)); + case 'Primitive': + var stringRep = key.a; + return A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just(stringRep), + value)); + default: + return A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Key, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just('key'), + key)), + A2( + $elm$html$Html$map, + A2($elm$browser$Debugger$Expando$Index, $elm$browser$Debugger$Expando$Value, index), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just('value'), + value)) + ])); + } + }); +var $elm$browser$Debugger$Expando$viewDictionaryOpen = function (keyValuePairs) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewDictionaryEntry, keyValuePairs)); +}; +var $elm$browser$Debugger$Expando$viewRecord = F3( + function (maybeKey, isClosed, record) { + var _v1 = isClosed ? _Utils_Tuple3( + $elm$browser$Debugger$Expando$viewTinyRecord(record).b, + $elm$html$Html$text(''), + $elm$html$Html$text('')) : _Utils_Tuple3( + _List_fromArray( + [ + $elm$html$Html$text('{') + ]), + $elm$browser$Debugger$Expando$viewRecordOpen(record), + A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad( + $elm$core$Maybe$Just(_Utils_Tuple0)), + _List_fromArray( + [ + $elm$html$Html$text('}') + ]))); + var start = _v1.a; + var middle = _v1.b; + var end = _v1.c; + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Just(isClosed), + start)), + middle, + end + ])); + }); +var $elm$browser$Debugger$Expando$viewRecordEntry = function (_v0) { + var field = _v0.a; + var value = _v0.b; + return A2( + $elm$html$Html$map, + $elm$browser$Debugger$Expando$Field(field), + A2( + $elm$browser$Debugger$Expando$view, + $elm$core$Maybe$Just(field), + value)); +}; +var $elm$browser$Debugger$Expando$viewRecordOpen = function (record) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2( + $elm$core$List$map, + $elm$browser$Debugger$Expando$viewRecordEntry, + $elm$core$Dict$toList(record))); +}; +var $elm$browser$Debugger$Expando$viewSequence = F4( + function (maybeKey, seqType, isClosed, valueList) { + var starter = A2( + $elm$browser$Debugger$Expando$seqTypeToString, + $elm$core$List$length(valueList), + seqType); + return A2( + $elm$html$Html$div, + $elm$browser$Debugger$Expando$leftPad(maybeKey), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Events$onClick($elm$browser$Debugger$Expando$Toggle) + ]), + A3( + $elm$browser$Debugger$Expando$lineStarter, + maybeKey, + $elm$core$Maybe$Just(isClosed), + _List_fromArray( + [ + $elm$html$Html$text(starter) + ]))), + isClosed ? $elm$html$Html$text('') : $elm$browser$Debugger$Expando$viewSequenceOpen(valueList) + ])); + }); +var $elm$browser$Debugger$Expando$viewSequenceOpen = function (values) { + return A2( + $elm$html$Html$div, + _List_Nil, + A2($elm$core$List$indexedMap, $elm$browser$Debugger$Expando$viewConstructorEntry, values)); +}; +var $elm$browser$Debugger$Main$viewExpando = F3( + function (expandoMsg, expandoModel, layout) { + var block = $elm$browser$Debugger$Main$toMouseBlocker(layout); + var _v0 = $elm$browser$Debugger$Main$toExpandoPercents(layout); + var w = _v0.a; + var h = _v0.b; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'block'), + A2($elm$html$Html$Attributes$style, 'width', 'calc(' + (w + ' - 4em)')), + A2($elm$html$Html$Attributes$style, 'height', 'calc(' + (h + ' - 4em)')), + A2($elm$html$Html$Attributes$style, 'padding', '2em'), + A2($elm$html$Html$Attributes$style, 'margin', '0'), + A2($elm$html$Html$Attributes$style, 'overflow', 'auto'), + A2($elm$html$Html$Attributes$style, 'pointer-events', block), + A2($elm$html$Html$Attributes$style, '-webkit-user-select', block), + A2($elm$html$Html$Attributes$style, '-moz-user-select', block), + A2($elm$html$Html$Attributes$style, '-ms-user-select', block), + A2($elm$html$Html$Attributes$style, 'user-select', block) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'color', '#ccc'), + A2($elm$html$Html$Attributes$style, 'padding', '0 0 1em 0') + ]), + _List_fromArray( + [ + $elm$html$Html$text('-- MESSAGE') + ])), + A2( + $elm$html$Html$map, + $elm$browser$Debugger$Main$TweakExpandoMsg, + A2($elm$browser$Debugger$Expando$view, $elm$core$Maybe$Nothing, expandoMsg)), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'color', '#ccc'), + A2($elm$html$Html$Attributes$style, 'padding', '1em 0') + ]), + _List_fromArray( + [ + $elm$html$Html$text('-- MODEL') + ])), + A2( + $elm$html$Html$map, + $elm$browser$Debugger$Main$TweakExpandoModel, + A2($elm$browser$Debugger$Expando$view, $elm$core$Maybe$Nothing, expandoModel)) + ])); + }); +var $elm$browser$Debugger$Main$Jump = function (a) { + return {$: 'Jump', a: a}; +}; +var $elm$virtual_dom$VirtualDom$lazy = _VirtualDom_lazy; +var $elm$html$Html$Lazy$lazy = $elm$virtual_dom$VirtualDom$lazy; +var $elm$browser$Debugger$Main$toHistoryPercents = function (layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + return _Utils_Tuple2( + $elm$browser$Debugger$Main$toPercent(x), + '100%'); + } else { + var y = layout.c; + return _Utils_Tuple2( + '100%', + $elm$browser$Debugger$Main$toPercent(1 - y)); + } +}; +var $elm$virtual_dom$VirtualDom$lazy3 = _VirtualDom_lazy3; +var $elm$html$Html$Lazy$lazy3 = $elm$virtual_dom$VirtualDom$lazy3; +var $elm$html$Html$Attributes$class = $elm$html$Html$Attributes$stringProperty('className'); +var $elm$browser$Debugger$History$idForMessageIndex = function (index) { + return 'msg-' + $elm$core$String$fromInt(index); +}; +var $elm$html$Html$Attributes$title = $elm$html$Html$Attributes$stringProperty('title'); +var $elm$browser$Debugger$History$viewMessage = F3( + function (currentIndex, index, msg) { + var messageName = _Debugger_messageToString(msg); + var className = _Utils_eq(currentIndex, index) ? 'elm-debugger-entry elm-debugger-entry-selected' : 'elm-debugger-entry'; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id( + $elm$browser$Debugger$History$idForMessageIndex(index)), + $elm$html$Html$Attributes$class(className), + $elm$html$Html$Events$onClick(index) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$title(messageName), + $elm$html$Html$Attributes$class('elm-debugger-entry-content') + ]), + _List_fromArray( + [ + $elm$html$Html$text(messageName) + ])), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('elm-debugger-entry-index') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(index)) + ])) + ])); + }); +var $elm$browser$Debugger$History$consMsg = F3( + function (currentIndex, msg, _v0) { + var index = _v0.a; + var rest = _v0.b; + return _Utils_Tuple2( + index + 1, + A2( + $elm$core$List$cons, + _Utils_Tuple2( + $elm$core$String$fromInt(index), + A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewMessage, currentIndex, index, msg)), + rest)); + }); +var $elm$core$Array$length = function (_v0) { + var len = _v0.a; + return len; +}; +var $elm$core$Basics$neq = _Utils_notEqual; +var $elm$virtual_dom$VirtualDom$keyedNode = function (tag) { + return _VirtualDom_keyedNode( + _VirtualDom_noScript(tag)); +}; +var $elm$html$Html$Keyed$node = $elm$virtual_dom$VirtualDom$keyedNode; +var $elm$browser$Debugger$History$maxSnapshotSize = 31; +var $elm$browser$Debugger$History$showMoreButton = function (numMessages) { + var nextIndex = (numMessages - 1) - ($elm$browser$Debugger$History$maxSnapshotSize * 2); + var labelText = 'View more messages'; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('elm-debugger-entry'), + $elm$html$Html$Events$onClick(nextIndex) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$title(labelText), + $elm$html$Html$Attributes$class('elm-debugger-entry-content') + ]), + _List_fromArray( + [ + $elm$html$Html$text(labelText) + ])), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('elm-debugger-entry-index') + ]), + _List_Nil) + ])); +}; +var $elm$browser$Debugger$History$styles = A3( + $elm$html$Html$node, + 'style', + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('\n\n.elm-debugger-entry {\n cursor: pointer;\n width: 100%;\n box-sizing: border-box;\n padding: 8px;\n}\n\n.elm-debugger-entry:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.elm-debugger-entry-selected, .elm-debugger-entry-selected:hover {\n background-color: rgb(10, 10, 10);\n}\n\n.elm-debugger-entry-content {\n width: calc(100% - 40px);\n padding: 0 5px;\n box-sizing: border-box;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.elm-debugger-entry-index {\n color: #666;\n width: 40px;\n text-align: right;\n display: block;\n float: right;\n}\n\n') + ])); +var $elm$core$Basics$ge = _Utils_ge; +var $elm$browser$Debugger$History$viewSnapshot = F3( + function (selectedIndex, index, _v0) { + var messages = _v0.messages; + return A3( + $elm$html$Html$Keyed$node, + 'div', + _List_Nil, + A3( + $elm$core$Array$foldr, + $elm$browser$Debugger$History$consMsg(selectedIndex), + _Utils_Tuple2(index, _List_Nil), + messages).b); + }); +var $elm$browser$Debugger$History$consSnapshot = F3( + function (selectedIndex, snapshot, _v0) { + var index = _v0.a; + var rest = _v0.b; + var nextIndex = index + $elm$core$Array$length(snapshot.messages); + var selectedIndexHelp = ((_Utils_cmp(nextIndex, selectedIndex) > 0) && (_Utils_cmp(selectedIndex, index) > -1)) ? selectedIndex : (-1); + return _Utils_Tuple2( + nextIndex, + A2( + $elm$core$List$cons, + A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewSnapshot, selectedIndexHelp, index, snapshot), + rest)); + }); +var $elm$core$Elm$JsArray$foldl = _JsArray_foldl; +var $elm$core$Array$foldl = F3( + function (func, baseCase, _v0) { + var tree = _v0.c; + var tail = _v0.d; + var helper = F2( + function (node, acc) { + if (node.$ === 'SubTree') { + var subTree = node.a; + return A3($elm$core$Elm$JsArray$foldl, helper, acc, subTree); + } else { + var values = node.a; + return A3($elm$core$Elm$JsArray$foldl, func, acc, values); + } + }); + return A3( + $elm$core$Elm$JsArray$foldl, + func, + A3($elm$core$Elm$JsArray$foldl, helper, baseCase, tree), + tail); + }); +var $elm$browser$Debugger$History$viewAllSnapshots = F3( + function (selectedIndex, startIndex, snapshots) { + return A2( + $elm$html$Html$div, + _List_Nil, + A3( + $elm$core$Array$foldl, + $elm$browser$Debugger$History$consSnapshot(selectedIndex), + _Utils_Tuple2(startIndex, _List_Nil), + snapshots).b); + }); +var $elm$core$Array$fromListHelp = F3( + function (list, nodeList, nodeListSize) { + fromListHelp: + while (true) { + var _v0 = A2($elm$core$Elm$JsArray$initializeFromList, $elm$core$Array$branchFactor, list); + var jsArray = _v0.a; + var remainingItems = _v0.b; + if (_Utils_cmp( + $elm$core$Elm$JsArray$length(jsArray), + $elm$core$Array$branchFactor) < 0) { + return A2( + $elm$core$Array$builderToArray, + true, + {nodeList: nodeList, nodeListSize: nodeListSize, tail: jsArray}); + } else { + var $temp$list = remainingItems, + $temp$nodeList = A2( + $elm$core$List$cons, + $elm$core$Array$Leaf(jsArray), + nodeList), + $temp$nodeListSize = nodeListSize + 1; + list = $temp$list; + nodeList = $temp$nodeList; + nodeListSize = $temp$nodeListSize; + continue fromListHelp; + } + } + }); +var $elm$core$Array$fromList = function (list) { + if (!list.b) { + return $elm$core$Array$empty; + } else { + return A3($elm$core$Array$fromListHelp, list, _List_Nil, 0); + } +}; +var $elm$core$Bitwise$and = _Bitwise_and; +var $elm$core$Bitwise$shiftRightZfBy = _Bitwise_shiftRightZfBy; +var $elm$core$Array$bitMask = 4294967295 >>> (32 - $elm$core$Array$shiftStep); +var $elm$core$Elm$JsArray$unsafeGet = _JsArray_unsafeGet; +var $elm$core$Array$getHelp = F3( + function (shift, index, tree) { + getHelp: + while (true) { + var pos = $elm$core$Array$bitMask & (index >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (_v0.$ === 'SubTree') { + var subTree = _v0.a; + var $temp$shift = shift - $elm$core$Array$shiftStep, + $temp$index = index, + $temp$tree = subTree; + shift = $temp$shift; + index = $temp$index; + tree = $temp$tree; + continue getHelp; + } else { + var values = _v0.a; + return A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, values); + } + } + }); +var $elm$core$Bitwise$shiftLeftBy = _Bitwise_shiftLeftBy; +var $elm$core$Array$tailIndex = function (len) { + return (len >>> 5) << 5; +}; +var $elm$core$Array$get = F2( + function (index, _v0) { + var len = _v0.a; + var startShift = _v0.b; + var tree = _v0.c; + var tail = _v0.d; + return ((index < 0) || (_Utils_cmp(index, len) > -1)) ? $elm$core$Maybe$Nothing : ((_Utils_cmp( + index, + $elm$core$Array$tailIndex(len)) > -1) ? $elm$core$Maybe$Just( + A2($elm$core$Elm$JsArray$unsafeGet, $elm$core$Array$bitMask & index, tail)) : $elm$core$Maybe$Just( + A3($elm$core$Array$getHelp, startShift, index, tree))); + }); +var $elm$core$Elm$JsArray$appendN = _JsArray_appendN; +var $elm$core$Elm$JsArray$slice = _JsArray_slice; +var $elm$core$Array$appendHelpBuilder = F2( + function (tail, builder) { + var tailLen = $elm$core$Elm$JsArray$length(tail); + var notAppended = ($elm$core$Array$branchFactor - $elm$core$Elm$JsArray$length(builder.tail)) - tailLen; + var appended = A3($elm$core$Elm$JsArray$appendN, $elm$core$Array$branchFactor, builder.tail, tail); + return (notAppended < 0) ? { + nodeList: A2( + $elm$core$List$cons, + $elm$core$Array$Leaf(appended), + builder.nodeList), + nodeListSize: builder.nodeListSize + 1, + tail: A3($elm$core$Elm$JsArray$slice, notAppended, tailLen, tail) + } : ((!notAppended) ? { + nodeList: A2( + $elm$core$List$cons, + $elm$core$Array$Leaf(appended), + builder.nodeList), + nodeListSize: builder.nodeListSize + 1, + tail: $elm$core$Elm$JsArray$empty + } : {nodeList: builder.nodeList, nodeListSize: builder.nodeListSize, tail: appended}); + }); +var $elm$core$List$drop = F2( + function (n, list) { + drop: + while (true) { + if (n <= 0) { + return list; + } else { + if (!list.b) { + return list; + } else { + var x = list.a; + var xs = list.b; + var $temp$n = n - 1, + $temp$list = xs; + n = $temp$n; + list = $temp$list; + continue drop; + } + } + } + }); +var $elm$core$Array$sliceLeft = F2( + function (from, array) { + var len = array.a; + var tree = array.c; + var tail = array.d; + if (!from) { + return array; + } else { + if (_Utils_cmp( + from, + $elm$core$Array$tailIndex(len)) > -1) { + return A4( + $elm$core$Array$Array_elm_builtin, + len - from, + $elm$core$Array$shiftStep, + $elm$core$Elm$JsArray$empty, + A3( + $elm$core$Elm$JsArray$slice, + from - $elm$core$Array$tailIndex(len), + $elm$core$Elm$JsArray$length(tail), + tail)); + } else { + var skipNodes = (from / $elm$core$Array$branchFactor) | 0; + var helper = F2( + function (node, acc) { + if (node.$ === 'SubTree') { + var subTree = node.a; + return A3($elm$core$Elm$JsArray$foldr, helper, acc, subTree); + } else { + var leaf = node.a; + return A2($elm$core$List$cons, leaf, acc); + } + }); + var leafNodes = A3( + $elm$core$Elm$JsArray$foldr, + helper, + _List_fromArray( + [tail]), + tree); + var nodesToInsert = A2($elm$core$List$drop, skipNodes, leafNodes); + if (!nodesToInsert.b) { + return $elm$core$Array$empty; + } else { + var head = nodesToInsert.a; + var rest = nodesToInsert.b; + var firstSlice = from - (skipNodes * $elm$core$Array$branchFactor); + var initialBuilder = { + nodeList: _List_Nil, + nodeListSize: 0, + tail: A3( + $elm$core$Elm$JsArray$slice, + firstSlice, + $elm$core$Elm$JsArray$length(head), + head) + }; + return A2( + $elm$core$Array$builderToArray, + true, + A3($elm$core$List$foldl, $elm$core$Array$appendHelpBuilder, initialBuilder, rest)); + } + } + } + }); +var $elm$core$Array$fetchNewTail = F4( + function (shift, end, treeEnd, tree) { + fetchNewTail: + while (true) { + var pos = $elm$core$Array$bitMask & (treeEnd >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (_v0.$ === 'SubTree') { + var sub = _v0.a; + var $temp$shift = shift - $elm$core$Array$shiftStep, + $temp$end = end, + $temp$treeEnd = treeEnd, + $temp$tree = sub; + shift = $temp$shift; + end = $temp$end; + treeEnd = $temp$treeEnd; + tree = $temp$tree; + continue fetchNewTail; + } else { + var values = _v0.a; + return A3($elm$core$Elm$JsArray$slice, 0, $elm$core$Array$bitMask & end, values); + } + } + }); +var $elm$core$Array$hoistTree = F3( + function (oldShift, newShift, tree) { + hoistTree: + while (true) { + if ((_Utils_cmp(oldShift, newShift) < 1) || (!$elm$core$Elm$JsArray$length(tree))) { + return tree; + } else { + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, 0, tree); + if (_v0.$ === 'SubTree') { + var sub = _v0.a; + var $temp$oldShift = oldShift - $elm$core$Array$shiftStep, + $temp$newShift = newShift, + $temp$tree = sub; + oldShift = $temp$oldShift; + newShift = $temp$newShift; + tree = $temp$tree; + continue hoistTree; + } else { + return tree; + } + } + } + }); +var $elm$core$Elm$JsArray$unsafeSet = _JsArray_unsafeSet; +var $elm$core$Array$sliceTree = F3( + function (shift, endIdx, tree) { + var lastPos = $elm$core$Array$bitMask & (endIdx >>> shift); + var _v0 = A2($elm$core$Elm$JsArray$unsafeGet, lastPos, tree); + if (_v0.$ === 'SubTree') { + var sub = _v0.a; + var newSub = A3($elm$core$Array$sliceTree, shift - $elm$core$Array$shiftStep, endIdx, sub); + return (!$elm$core$Elm$JsArray$length(newSub)) ? A3($elm$core$Elm$JsArray$slice, 0, lastPos, tree) : A3( + $elm$core$Elm$JsArray$unsafeSet, + lastPos, + $elm$core$Array$SubTree(newSub), + A3($elm$core$Elm$JsArray$slice, 0, lastPos + 1, tree)); + } else { + return A3($elm$core$Elm$JsArray$slice, 0, lastPos, tree); + } + }); +var $elm$core$Array$sliceRight = F2( + function (end, array) { + var len = array.a; + var startShift = array.b; + var tree = array.c; + var tail = array.d; + if (_Utils_eq(end, len)) { + return array; + } else { + if (_Utils_cmp( + end, + $elm$core$Array$tailIndex(len)) > -1) { + return A4( + $elm$core$Array$Array_elm_builtin, + end, + startShift, + tree, + A3($elm$core$Elm$JsArray$slice, 0, $elm$core$Array$bitMask & end, tail)); + } else { + var endIdx = $elm$core$Array$tailIndex(end); + var depth = $elm$core$Basics$floor( + A2( + $elm$core$Basics$logBase, + $elm$core$Array$branchFactor, + A2($elm$core$Basics$max, 1, endIdx - 1))); + var newShift = A2($elm$core$Basics$max, 5, depth * $elm$core$Array$shiftStep); + return A4( + $elm$core$Array$Array_elm_builtin, + end, + newShift, + A3( + $elm$core$Array$hoistTree, + startShift, + newShift, + A3($elm$core$Array$sliceTree, startShift, endIdx, tree)), + A4($elm$core$Array$fetchNewTail, startShift, end, endIdx, tree)); + } + } + }); +var $elm$core$Array$translateIndex = F2( + function (index, _v0) { + var len = _v0.a; + var posIndex = (index < 0) ? (len + index) : index; + return (posIndex < 0) ? 0 : ((_Utils_cmp(posIndex, len) > 0) ? len : posIndex); + }); +var $elm$core$Array$slice = F3( + function (from, to, array) { + var correctTo = A2($elm$core$Array$translateIndex, to, array); + var correctFrom = A2($elm$core$Array$translateIndex, from, array); + return (_Utils_cmp(correctFrom, correctTo) > 0) ? $elm$core$Array$empty : A2( + $elm$core$Array$sliceLeft, + correctFrom, + A2($elm$core$Array$sliceRight, correctTo, array)); + }); +var $elm$browser$Debugger$History$viewRecentSnapshots = F3( + function (selectedIndex, recentMessagesNum, snapshots) { + var messagesToFill = $elm$browser$Debugger$History$maxSnapshotSize - recentMessagesNum; + var arrayLength = $elm$core$Array$length(snapshots); + var snapshotsToRender = function () { + var _v0 = _Utils_Tuple2( + A2($elm$core$Array$get, arrayLength - 2, snapshots), + A2($elm$core$Array$get, arrayLength - 1, snapshots)); + if ((_v0.a.$ === 'Just') && (_v0.b.$ === 'Just')) { + var fillerSnapshot = _v0.a.a; + var recentSnapshot = _v0.b.a; + return $elm$core$Array$fromList( + _List_fromArray( + [ + { + messages: A3($elm$core$Array$slice, 0, messagesToFill, fillerSnapshot.messages), + model: fillerSnapshot.model + }, + recentSnapshot + ])); + } else { + return snapshots; + } + }(); + var startingIndex = ((arrayLength * $elm$browser$Debugger$History$maxSnapshotSize) - $elm$browser$Debugger$History$maxSnapshotSize) - messagesToFill; + return A3($elm$browser$Debugger$History$viewAllSnapshots, selectedIndex, startingIndex, snapshotsToRender); + }); +var $elm$browser$Debugger$History$view = F2( + function (maybeIndex, _v0) { + var numMessages = _v0.numMessages; + var recent = _v0.recent; + var snapshots = _v0.snapshots; + var recentMessageStartIndex = numMessages - recent.numMessages; + var index = A2($elm$core$Maybe$withDefault, -1, maybeIndex); + var newStuff = A3( + $elm$html$Html$Keyed$node, + 'div', + _List_Nil, + A3( + $elm$core$List$foldr, + $elm$browser$Debugger$History$consMsg(index), + _Utils_Tuple2(recentMessageStartIndex, _List_Nil), + recent.messages).b); + var onlyRenderRecentMessages = (!_Utils_eq(index, -1)) || ($elm$core$Array$length(snapshots) < 2); + var oldStuff = onlyRenderRecentMessages ? A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewAllSnapshots, index, 0, snapshots) : A4($elm$html$Html$Lazy$lazy3, $elm$browser$Debugger$History$viewRecentSnapshots, index, recent.numMessages, snapshots); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('elm-debugger-sidebar'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'overflow-y', 'auto'), + A2($elm$html$Html$Attributes$style, 'height', 'calc(100% - 72px)') + ]), + A2( + $elm$core$List$cons, + $elm$browser$Debugger$History$styles, + A2( + $elm$core$List$cons, + newStuff, + A2( + $elm$core$List$cons, + oldStuff, + onlyRenderRecentMessages ? _List_Nil : _List_fromArray( + [ + $elm$browser$Debugger$History$showMoreButton(numMessages) + ]))))); + }); +var $elm$browser$Debugger$Main$SwapLayout = {$: 'SwapLayout'}; +var $elm$browser$Debugger$Main$toHistoryIcon = function (layout) { + if (layout.$ === 'Horizontal') { + return 'M13 1a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M13 3h-10a1 1 0 0 0-1 1v5h12v-5a1 1 0 0 0-1-1z M14 10h-12v2a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1z'; + } else { + return 'M0 4a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3z M2 4v8a1 1 0 0 0 1 1h2v-10h-2a1 1 0 0 0-1 1z M6 3v10h7a1 1 0 0 0 1-1v-8a1 1 0 0 0-1-1z'; + } +}; +var $elm$browser$Debugger$Main$icon = function (path) { + return A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'svg', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'viewBox', '0 0 16 16'), + A2($elm$virtual_dom$VirtualDom$attribute, 'xmlns', 'http://www.w3.org/2000/svg'), + A2($elm$virtual_dom$VirtualDom$attribute, 'fill', 'currentColor'), + A2($elm$virtual_dom$VirtualDom$attribute, 'width', '16px'), + A2($elm$virtual_dom$VirtualDom$attribute, 'height', '16px') + ]), + _List_fromArray( + [ + A4( + $elm$virtual_dom$VirtualDom$nodeNS, + 'http://www.w3.org/2000/svg', + 'path', + _List_fromArray( + [ + A2($elm$virtual_dom$VirtualDom$attribute, 'd', path) + ]), + _List_Nil) + ])); +}; +var $elm$browser$Debugger$Main$viewHistoryButton = F3( + function (label, msg, path) { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'background', 'none'), + A2($elm$html$Html$Attributes$style, 'border', 'none'), + A2($elm$html$Html$Attributes$style, 'color', 'inherit'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + $elm$html$Html$Events$onClick(msg) + ]), + _List_fromArray( + [ + $elm$browser$Debugger$Main$icon(path), + A2( + $elm$html$Html$span, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'padding-left', '6px') + ]), + _List_fromArray( + [ + $elm$html$Html$text(label) + ])) + ])); + }); +var $elm$browser$Debugger$Main$viewHistoryOptions = function (layout) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'space-between'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') + ]), + _List_fromArray( + [ + A3( + $elm$browser$Debugger$Main$viewHistoryButton, + 'Swap Layout', + $elm$browser$Debugger$Main$SwapLayout, + $elm$browser$Debugger$Main$toHistoryIcon(layout)), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'justify-content', 'space-between') + ]), + _List_fromArray( + [ + A3($elm$browser$Debugger$Main$viewHistoryButton, 'Import', $elm$browser$Debugger$Main$Import, 'M5 1a1 1 0 0 1 0 2h-2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1a1 1 0 0 1 2 0a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M10 2a1 1 0 0 0 -2 0v6a1 1 0 0 0 1 1h6a1 1 0 0 0 0-2h-3.586l4.293-4.293a1 1 0 0 0-1.414-1.414l-4.293 4.293z'), + A3($elm$browser$Debugger$Main$viewHistoryButton, 'Export', $elm$browser$Debugger$Main$Export, 'M5 1a1 1 0 0 1 0 2h-2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1 a1 1 0 0 1 2 0a3 3 0 0 1-3 3h-10a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3z M9 3a1 1 0 1 1 0-2h6a1 1 0 0 1 1 1v6a1 1 0 1 1-2 0v-3.586l-5.293 5.293 a1 1 0 0 1-1.414-1.414l5.293 -5.293z') + ])) + ])); +}; +var $elm$browser$Debugger$Main$SliderJump = function (a) { + return {$: 'SliderJump', a: a}; +}; +var $elm$core$Basics$composeR = F3( + function (f, g, x) { + return g( + f(x)); + }); +var $elm$html$Html$input = _VirtualDom_node('input'); +var $elm$browser$Debugger$Main$isPlaying = function (maybeIndex) { + if (maybeIndex.$ === 'Nothing') { + return true; + } else { + return false; + } +}; +var $elm$html$Html$Attributes$max = $elm$html$Html$Attributes$stringProperty('max'); +var $elm$html$Html$Attributes$min = $elm$html$Html$Attributes$stringProperty('min'); +var $elm$html$Html$Events$alwaysStop = function (x) { + return _Utils_Tuple2(x, true); +}; +var $elm$virtual_dom$VirtualDom$MayStopPropagation = function (a) { + return {$: 'MayStopPropagation', a: a}; +}; +var $elm$html$Html$Events$stopPropagationOn = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$MayStopPropagation(decoder)); + }); +var $elm$json$Json$Decode$string = _Json_decodeString; +var $elm$html$Html$Events$targetValue = A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['target', 'value']), + $elm$json$Json$Decode$string); +var $elm$html$Html$Events$onInput = function (tagger) { + return A2( + $elm$html$Html$Events$stopPropagationOn, + 'input', + A2( + $elm$json$Json$Decode$map, + $elm$html$Html$Events$alwaysStop, + A2($elm$json$Json$Decode$map, tagger, $elm$html$Html$Events$targetValue))); +}; +var $elm$core$String$toInt = _String_toInt; +var $elm$html$Html$Attributes$type_ = $elm$html$Html$Attributes$stringProperty('type'); +var $elm$html$Html$Attributes$value = $elm$html$Html$Attributes$stringProperty('value'); +var $elm$browser$Debugger$Main$viewPlayButton = function (playing) { + return A2( + $elm$html$Html$button, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'background', '#1293D8'), + A2($elm$html$Html$Attributes$style, 'border', 'none'), + A2($elm$html$Html$Attributes$style, 'color', 'white'), + A2($elm$html$Html$Attributes$style, 'cursor', 'pointer'), + A2($elm$html$Html$Attributes$style, 'width', '36px'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + $elm$html$Html$Events$onClick($elm$browser$Debugger$Main$Resume) + ]), + _List_fromArray( + [ + playing ? $elm$browser$Debugger$Main$icon('M2 2h4v12h-4v-12z M10 2h4v12h-4v-12z') : $elm$browser$Debugger$Main$icon('M2 2l12 7l-12 7z') + ])); +}; +var $elm$browser$Debugger$Main$viewHistorySlider = F2( + function (history, maybeIndex) { + var lastIndex = $elm$browser$Debugger$History$size(history) - 1; + var selectedIndex = A2($elm$core$Maybe$withDefault, lastIndex, maybeIndex); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'row'), + A2($elm$html$Html$Attributes$style, 'align-items', 'center'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(50, 50, 50)') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$Lazy$lazy, + $elm$browser$Debugger$Main$viewPlayButton, + $elm$browser$Debugger$Main$isPlaying(maybeIndex)), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$type_('range'), + A2($elm$html$Html$Attributes$style, 'width', 'calc(100% - 56px)'), + A2($elm$html$Html$Attributes$style, 'height', '36px'), + A2($elm$html$Html$Attributes$style, 'margin', '0 10px'), + $elm$html$Html$Attributes$min('0'), + $elm$html$Html$Attributes$max( + $elm$core$String$fromInt(lastIndex)), + $elm$html$Html$Attributes$value( + $elm$core$String$fromInt(selectedIndex)), + $elm$html$Html$Events$onInput( + A2( + $elm$core$Basics$composeR, + $elm$core$String$toInt, + A2( + $elm$core$Basics$composeR, + $elm$core$Maybe$withDefault(lastIndex), + $elm$browser$Debugger$Main$SliderJump))) + ]), + _List_Nil) + ])); + }); +var $elm$browser$Debugger$Main$viewHistory = F3( + function (maybeIndex, history, layout) { + var block = $elm$browser$Debugger$Main$toMouseBlocker(layout); + var _v0 = $elm$browser$Debugger$Main$toHistoryPercents(layout); + var w = _v0.a; + var h = _v0.b; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'width', w), + A2($elm$html$Html$Attributes$style, 'height', h), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2($elm$html$Html$Attributes$style, 'flex-direction', 'column'), + A2($elm$html$Html$Attributes$style, 'color', '#DDDDDD'), + A2($elm$html$Html$Attributes$style, 'background-color', 'rgb(61, 61, 61)'), + A2($elm$html$Html$Attributes$style, 'pointer-events', block), + A2($elm$html$Html$Attributes$style, 'user-select', block) + ]), + _List_fromArray( + [ + A2($elm$browser$Debugger$Main$viewHistorySlider, history, maybeIndex), + A2( + $elm$html$Html$map, + $elm$browser$Debugger$Main$Jump, + A2($elm$browser$Debugger$History$view, maybeIndex, history)), + A2($elm$html$Html$Lazy$lazy, $elm$browser$Debugger$Main$viewHistoryOptions, layout) + ])); + }); +var $elm$browser$Debugger$Main$popoutView = function (model) { + var maybeIndex = function () { + var _v0 = model.state; + if (_v0.$ === 'Running') { + return $elm$core$Maybe$Nothing; + } else { + var index = _v0.a; + return $elm$core$Maybe$Just(index); + } + }(); + var historyToRender = $elm$browser$Debugger$Main$cachedHistory(model); + return A3( + $elm$html$Html$node, + 'body', + _Utils_ap( + $elm$browser$Debugger$Main$toDragListeners(model.layout), + _List_fromArray( + [ + A2($elm$html$Html$Attributes$style, 'margin', '0'), + A2($elm$html$Html$Attributes$style, 'padding', '0'), + A2($elm$html$Html$Attributes$style, 'width', '100%'), + A2($elm$html$Html$Attributes$style, 'height', '100%'), + A2($elm$html$Html$Attributes$style, 'font-family', 'monospace'), + A2($elm$html$Html$Attributes$style, 'display', 'flex'), + A2( + $elm$html$Html$Attributes$style, + 'flex-direction', + $elm$browser$Debugger$Main$toFlexDirection(model.layout)) + ])), + _List_fromArray( + [ + A3($elm$browser$Debugger$Main$viewHistory, maybeIndex, historyToRender, model.layout), + $elm$browser$Debugger$Main$viewDragZone(model.layout), + A3($elm$browser$Debugger$Main$viewExpando, model.expandoMsg, model.expandoModel, model.layout) + ])); +}; +var $elm$browser$Debugger$Overlay$BlockAll = {$: 'BlockAll'}; +var $elm$browser$Debugger$Overlay$toBlockerType = F2( + function (isPaused, state) { + switch (state.$) { + case 'None': + return isPaused ? $elm$browser$Debugger$Overlay$BlockAll : $elm$browser$Debugger$Overlay$BlockNone; + case 'BadMetadata': + return $elm$browser$Debugger$Overlay$BlockMost; + case 'BadImport': + return $elm$browser$Debugger$Overlay$BlockMost; + default: + return $elm$browser$Debugger$Overlay$BlockMost; + } + }); +var $elm$browser$Debugger$Main$toBlockerType = function (model) { + return A2( + $elm$browser$Debugger$Overlay$toBlockerType, + $elm$browser$Debugger$Main$isPaused(model.state), + model.overlay); +}; +var $elm$browser$Debugger$Main$Horizontal = F3( + function (a, b, c) { + return {$: 'Horizontal', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Main$Running = function (a) { + return {$: 'Running', a: a}; +}; +var $elm$browser$Debugger$Main$Static = {$: 'Static'}; +var $elm$browser$Debugger$Metadata$Error = F2( + function (message, problems) { + return {message: message, problems: problems}; + }); +var $elm$json$Json$Decode$decodeValue = _Json_run; +var $elm$browser$Debugger$Metadata$Metadata = F2( + function (versions, types) { + return {types: types, versions: versions}; + }); +var $elm$browser$Debugger$Metadata$Types = F3( + function (message, aliases, unions) { + return {aliases: aliases, message: message, unions: unions}; + }); +var $elm$browser$Debugger$Metadata$Alias = F2( + function (args, tipe) { + return {args: args, tipe: tipe}; + }); +var $elm$json$Json$Decode$list = _Json_decodeList; +var $elm$browser$Debugger$Metadata$decodeAlias = A3( + $elm$json$Json$Decode$map2, + $elm$browser$Debugger$Metadata$Alias, + A2( + $elm$json$Json$Decode$field, + 'args', + $elm$json$Json$Decode$list($elm$json$Json$Decode$string)), + A2($elm$json$Json$Decode$field, 'type', $elm$json$Json$Decode$string)); +var $elm$browser$Debugger$Metadata$Union = F2( + function (args, tags) { + return {args: args, tags: tags}; + }); +var $elm$core$Dict$fromList = function (assocs) { + return A3( + $elm$core$List$foldl, + F2( + function (_v0, dict) { + var key = _v0.a; + var value = _v0.b; + return A3($elm$core$Dict$insert, key, value, dict); + }), + $elm$core$Dict$empty, + assocs); +}; +var $elm$json$Json$Decode$keyValuePairs = _Json_decodeKeyValuePairs; +var $elm$json$Json$Decode$dict = function (decoder) { + return A2( + $elm$json$Json$Decode$map, + $elm$core$Dict$fromList, + $elm$json$Json$Decode$keyValuePairs(decoder)); +}; +var $elm$browser$Debugger$Metadata$decodeUnion = A3( + $elm$json$Json$Decode$map2, + $elm$browser$Debugger$Metadata$Union, + A2( + $elm$json$Json$Decode$field, + 'args', + $elm$json$Json$Decode$list($elm$json$Json$Decode$string)), + A2( + $elm$json$Json$Decode$field, + 'tags', + $elm$json$Json$Decode$dict( + $elm$json$Json$Decode$list($elm$json$Json$Decode$string)))); +var $elm$json$Json$Decode$map3 = _Json_map3; +var $elm$browser$Debugger$Metadata$decodeTypes = A4( + $elm$json$Json$Decode$map3, + $elm$browser$Debugger$Metadata$Types, + A2($elm$json$Json$Decode$field, 'message', $elm$json$Json$Decode$string), + A2( + $elm$json$Json$Decode$field, + 'aliases', + $elm$json$Json$Decode$dict($elm$browser$Debugger$Metadata$decodeAlias)), + A2( + $elm$json$Json$Decode$field, + 'unions', + $elm$json$Json$Decode$dict($elm$browser$Debugger$Metadata$decodeUnion))); +var $elm$browser$Debugger$Metadata$Versions = function (elm) { + return {elm: elm}; +}; +var $elm$browser$Debugger$Metadata$decodeVersions = A2( + $elm$json$Json$Decode$map, + $elm$browser$Debugger$Metadata$Versions, + A2($elm$json$Json$Decode$field, 'elm', $elm$json$Json$Decode$string)); +var $elm$browser$Debugger$Metadata$decoder = A3( + $elm$json$Json$Decode$map2, + $elm$browser$Debugger$Metadata$Metadata, + A2($elm$json$Json$Decode$field, 'versions', $elm$browser$Debugger$Metadata$decodeVersions), + A2($elm$json$Json$Decode$field, 'types', $elm$browser$Debugger$Metadata$decodeTypes)); +var $elm$browser$Debugger$Metadata$ProblemType = F2( + function (name, problems) { + return {name: name, problems: problems}; + }); +var $elm$core$List$maybeCons = F3( + function (f, mx, xs) { + var _v0 = f(mx); + if (_v0.$ === 'Just') { + var x = _v0.a; + return A2($elm$core$List$cons, x, xs); + } else { + return xs; + } + }); +var $elm$core$List$filterMap = F2( + function (f, xs) { + return A3( + $elm$core$List$foldr, + $elm$core$List$maybeCons(f), + _List_Nil, + xs); + }); +var $elm$core$String$contains = _String_contains; +var $elm$browser$Debugger$Metadata$hasProblem = F2( + function (tipe, _v0) { + var problem = _v0.a; + var token = _v0.b; + return A2($elm$core$String$contains, token, tipe) ? $elm$core$Maybe$Just(problem) : $elm$core$Maybe$Nothing; + }); +var $elm$browser$Debugger$Metadata$Decoder = {$: 'Decoder'}; +var $elm$browser$Debugger$Metadata$Function = {$: 'Function'}; +var $elm$browser$Debugger$Metadata$Process = {$: 'Process'}; +var $elm$browser$Debugger$Metadata$Program = {$: 'Program'}; +var $elm$browser$Debugger$Metadata$Request = {$: 'Request'}; +var $elm$browser$Debugger$Metadata$Socket = {$: 'Socket'}; +var $elm$browser$Debugger$Metadata$Task = {$: 'Task'}; +var $elm$browser$Debugger$Metadata$VirtualDom = {$: 'VirtualDom'}; +var $elm$browser$Debugger$Metadata$problemTable = _List_fromArray( + [ + _Utils_Tuple2($elm$browser$Debugger$Metadata$Function, '->'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Decoder, 'Json.Decode.Decoder'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Task, 'Task.Task'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Process, 'Process.Id'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Socket, 'WebSocket.LowLevel.WebSocket'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Request, 'Http.Request'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$Program, 'Platform.Program'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$VirtualDom, 'VirtualDom.Node'), + _Utils_Tuple2($elm$browser$Debugger$Metadata$VirtualDom, 'VirtualDom.Attribute') + ]); +var $elm$browser$Debugger$Metadata$findProblems = function (tipe) { + return A2( + $elm$core$List$filterMap, + $elm$browser$Debugger$Metadata$hasProblem(tipe), + $elm$browser$Debugger$Metadata$problemTable); +}; +var $elm$browser$Debugger$Metadata$collectBadAliases = F3( + function (name, _v0, list) { + var tipe = _v0.tipe; + var _v1 = $elm$browser$Debugger$Metadata$findProblems(tipe); + if (!_v1.b) { + return list; + } else { + var problems = _v1; + return A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Metadata$ProblemType, name, problems), + list); + } + }); +var $elm$core$List$append = F2( + function (xs, ys) { + if (!ys.b) { + return xs; + } else { + return A3($elm$core$List$foldr, $elm$core$List$cons, ys, xs); + } + }); +var $elm$core$List$concat = function (lists) { + return A3($elm$core$List$foldr, $elm$core$List$append, _List_Nil, lists); +}; +var $elm$core$List$concatMap = F2( + function (f, list) { + return $elm$core$List$concat( + A2($elm$core$List$map, f, list)); + }); +var $elm$core$Dict$values = function (dict) { + return A3( + $elm$core$Dict$foldr, + F3( + function (key, value, valueList) { + return A2($elm$core$List$cons, value, valueList); + }), + _List_Nil, + dict); +}; +var $elm$browser$Debugger$Metadata$collectBadUnions = F3( + function (name, _v0, list) { + var tags = _v0.tags; + var _v1 = A2( + $elm$core$List$concatMap, + $elm$browser$Debugger$Metadata$findProblems, + $elm$core$List$concat( + $elm$core$Dict$values(tags))); + if (!_v1.b) { + return list; + } else { + var problems = _v1; + return A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Metadata$ProblemType, name, problems), + list); + } + }); +var $elm$core$Dict$foldl = F3( + function (func, acc, dict) { + foldl: + while (true) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return acc; + } else { + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + var $temp$func = func, + $temp$acc = A3( + func, + key, + value, + A3($elm$core$Dict$foldl, func, acc, left)), + $temp$dict = right; + func = $temp$func; + acc = $temp$acc; + dict = $temp$dict; + continue foldl; + } + } + }); +var $elm$browser$Debugger$Metadata$isPortable = function (_v0) { + var types = _v0.types; + var badAliases = A3($elm$core$Dict$foldl, $elm$browser$Debugger$Metadata$collectBadAliases, _List_Nil, types.aliases); + var _v1 = A3($elm$core$Dict$foldl, $elm$browser$Debugger$Metadata$collectBadUnions, badAliases, types.unions); + if (!_v1.b) { + return $elm$core$Maybe$Nothing; + } else { + var problems = _v1; + return $elm$core$Maybe$Just( + A2($elm$browser$Debugger$Metadata$Error, types.message, problems)); + } +}; +var $elm$browser$Debugger$Metadata$decode = function (value) { + var _v0 = A2($elm$json$Json$Decode$decodeValue, $elm$browser$Debugger$Metadata$decoder, value); + if (_v0.$ === 'Err') { + return $elm$core$Result$Err( + A2($elm$browser$Debugger$Metadata$Error, 'The compiler is generating bad metadata. This is a compiler bug!', _List_Nil)); + } else { + var metadata = _v0.a; + var _v1 = $elm$browser$Debugger$Metadata$isPortable(metadata); + if (_v1.$ === 'Nothing') { + return $elm$core$Result$Ok(metadata); + } else { + var error = _v1.a; + return $elm$core$Result$Err(error); + } + } +}; +var $elm$browser$Debugger$History$History = F3( + function (snapshots, recent, numMessages) { + return {numMessages: numMessages, recent: recent, snapshots: snapshots}; + }); +var $elm$browser$Debugger$History$RecentHistory = F3( + function (model, messages, numMessages) { + return {messages: messages, model: model, numMessages: numMessages}; + }); +var $elm$browser$Debugger$History$empty = function (model) { + return A3( + $elm$browser$Debugger$History$History, + $elm$core$Array$empty, + A3($elm$browser$Debugger$History$RecentHistory, model, _List_Nil, 0), + 0); +}; +var $elm$core$Dict$map = F2( + function (func, dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return $elm$core$Dict$RBEmpty_elm_builtin; + } else { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + A2(func, key, value), + A2($elm$core$Dict$map, func, left), + A2($elm$core$Dict$map, func, right)); + } + }); +var $elm$core$Dict$sizeHelp = F2( + function (n, dict) { + sizeHelp: + while (true) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return n; + } else { + var left = dict.d; + var right = dict.e; + var $temp$n = A2($elm$core$Dict$sizeHelp, n + 1, right), + $temp$dict = left; + n = $temp$n; + dict = $temp$dict; + continue sizeHelp; + } + } + }); +var $elm$core$Dict$size = function (dict) { + return A2($elm$core$Dict$sizeHelp, 0, dict); +}; +var $elm$browser$Debugger$Expando$initHelp = F2( + function (isOuter, expando) { + switch (expando.$) { + case 'S': + return expando; + case 'Primitive': + return expando; + case 'Sequence': + var seqType = expando.a; + var isClosed = expando.b; + var items = expando.c; + return isOuter ? A3( + $elm$browser$Debugger$Expando$Sequence, + seqType, + false, + A2( + $elm$core$List$map, + $elm$browser$Debugger$Expando$initHelp(false), + items)) : (($elm$core$List$length(items) <= 8) ? A3($elm$browser$Debugger$Expando$Sequence, seqType, false, items) : expando); + case 'Dictionary': + var isClosed = expando.a; + var keyValuePairs = expando.b; + return isOuter ? A2( + $elm$browser$Debugger$Expando$Dictionary, + false, + A2( + $elm$core$List$map, + function (_v1) { + var k = _v1.a; + var v = _v1.b; + return _Utils_Tuple2( + k, + A2($elm$browser$Debugger$Expando$initHelp, false, v)); + }, + keyValuePairs)) : (($elm$core$List$length(keyValuePairs) <= 8) ? A2($elm$browser$Debugger$Expando$Dictionary, false, keyValuePairs) : expando); + case 'Record': + var isClosed = expando.a; + var entries = expando.b; + return isOuter ? A2( + $elm$browser$Debugger$Expando$Record, + false, + A2( + $elm$core$Dict$map, + F2( + function (_v2, v) { + return A2($elm$browser$Debugger$Expando$initHelp, false, v); + }), + entries)) : (($elm$core$Dict$size(entries) <= 4) ? A2($elm$browser$Debugger$Expando$Record, false, entries) : expando); + default: + var maybeName = expando.a; + var isClosed = expando.b; + var args = expando.c; + return isOuter ? A3( + $elm$browser$Debugger$Expando$Constructor, + maybeName, + false, + A2( + $elm$core$List$map, + $elm$browser$Debugger$Expando$initHelp(false), + args)) : (($elm$core$List$length(args) <= 4) ? A3($elm$browser$Debugger$Expando$Constructor, maybeName, false, args) : expando); + } + }); +var $elm$browser$Debugger$Expando$init = function (value) { + return A2( + $elm$browser$Debugger$Expando$initHelp, + true, + _Debugger_init(value)); +}; +var $elm$core$Platform$Cmd$map = _Platform_map; +var $elm$browser$Debugger$Overlay$None = {$: 'None'}; +var $elm$browser$Debugger$Overlay$none = $elm$browser$Debugger$Overlay$None; +var $elm$browser$Debugger$Main$wrapInit = F4( + function (metadata, popout, init, flags) { + var _v0 = init(flags); + var userModel = _v0.a; + var userCommands = _v0.b; + return _Utils_Tuple2( + { + expandoModel: $elm$browser$Debugger$Expando$init(userModel), + expandoMsg: $elm$browser$Debugger$Expando$init(_Utils_Tuple0), + history: $elm$browser$Debugger$History$empty(userModel), + layout: A3($elm$browser$Debugger$Main$Horizontal, $elm$browser$Debugger$Main$Static, 0.3, 0.5), + metadata: $elm$browser$Debugger$Metadata$decode(metadata), + overlay: $elm$browser$Debugger$Overlay$none, + popout: popout, + state: $elm$browser$Debugger$Main$Running(userModel) + }, + A2($elm$core$Platform$Cmd$map, $elm$browser$Debugger$Main$UserMsg, userCommands)); + }); +var $elm$browser$Debugger$Main$getLatestModel = function (state) { + if (state.$ === 'Running') { + var model = state.a; + return model; + } else { + var model = state.c; + return model; + } +}; +var $elm$core$Platform$Sub$map = _Platform_map; +var $elm$browser$Debugger$Main$wrapSubs = F2( + function (subscriptions, model) { + return A2( + $elm$core$Platform$Sub$map, + $elm$browser$Debugger$Main$UserMsg, + subscriptions( + $elm$browser$Debugger$Main$getLatestModel(model.state))); + }); +var $elm$browser$Debugger$Main$Moving = {$: 'Moving'}; +var $elm$browser$Debugger$Main$Paused = F5( + function (a, b, c, d, e) { + return {$: 'Paused', a: a, b: b, c: c, d: d, e: e}; + }); +var $elm$browser$Debugger$History$Snapshot = F2( + function (model, messages) { + return {messages: messages, model: model}; + }); +var $elm$browser$Debugger$History$addRecent = F3( + function (msg, newModel, _v0) { + var numMessages = _v0.numMessages; + var messages = _v0.messages; + var model = _v0.model; + return _Utils_eq(numMessages, $elm$browser$Debugger$History$maxSnapshotSize) ? _Utils_Tuple2( + $elm$core$Maybe$Just( + A2( + $elm$browser$Debugger$History$Snapshot, + model, + $elm$core$Array$fromList(messages))), + A3( + $elm$browser$Debugger$History$RecentHistory, + newModel, + _List_fromArray( + [msg]), + 1)) : _Utils_Tuple2( + $elm$core$Maybe$Nothing, + A3( + $elm$browser$Debugger$History$RecentHistory, + model, + A2($elm$core$List$cons, msg, messages), + numMessages + 1)); + }); +var $elm$core$Elm$JsArray$push = _JsArray_push; +var $elm$core$Elm$JsArray$singleton = _JsArray_singleton; +var $elm$core$Array$insertTailInTree = F4( + function (shift, index, tail, tree) { + var pos = $elm$core$Array$bitMask & (index >>> shift); + if (_Utils_cmp( + pos, + $elm$core$Elm$JsArray$length(tree)) > -1) { + if (shift === 5) { + return A2( + $elm$core$Elm$JsArray$push, + $elm$core$Array$Leaf(tail), + tree); + } else { + var newSub = $elm$core$Array$SubTree( + A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, $elm$core$Elm$JsArray$empty)); + return A2($elm$core$Elm$JsArray$push, newSub, tree); + } + } else { + var value = A2($elm$core$Elm$JsArray$unsafeGet, pos, tree); + if (value.$ === 'SubTree') { + var subTree = value.a; + var newSub = $elm$core$Array$SubTree( + A4($elm$core$Array$insertTailInTree, shift - $elm$core$Array$shiftStep, index, tail, subTree)); + return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); + } else { + var newSub = $elm$core$Array$SubTree( + A4( + $elm$core$Array$insertTailInTree, + shift - $elm$core$Array$shiftStep, + index, + tail, + $elm$core$Elm$JsArray$singleton(value))); + return A3($elm$core$Elm$JsArray$unsafeSet, pos, newSub, tree); + } + } + }); +var $elm$core$Array$unsafeReplaceTail = F2( + function (newTail, _v0) { + var len = _v0.a; + var startShift = _v0.b; + var tree = _v0.c; + var tail = _v0.d; + var originalTailLen = $elm$core$Elm$JsArray$length(tail); + var newTailLen = $elm$core$Elm$JsArray$length(newTail); + var newArrayLen = len + (newTailLen - originalTailLen); + if (_Utils_eq(newTailLen, $elm$core$Array$branchFactor)) { + var overflow = _Utils_cmp(newArrayLen >>> $elm$core$Array$shiftStep, 1 << startShift) > 0; + if (overflow) { + var newShift = startShift + $elm$core$Array$shiftStep; + var newTree = A4( + $elm$core$Array$insertTailInTree, + newShift, + len, + newTail, + $elm$core$Elm$JsArray$singleton( + $elm$core$Array$SubTree(tree))); + return A4($elm$core$Array$Array_elm_builtin, newArrayLen, newShift, newTree, $elm$core$Elm$JsArray$empty); + } else { + return A4( + $elm$core$Array$Array_elm_builtin, + newArrayLen, + startShift, + A4($elm$core$Array$insertTailInTree, startShift, len, newTail, tree), + $elm$core$Elm$JsArray$empty); + } + } else { + return A4($elm$core$Array$Array_elm_builtin, newArrayLen, startShift, tree, newTail); + } + }); +var $elm$core$Array$push = F2( + function (a, array) { + var tail = array.d; + return A2( + $elm$core$Array$unsafeReplaceTail, + A2($elm$core$Elm$JsArray$push, a, tail), + array); + }); +var $elm$browser$Debugger$History$add = F3( + function (msg, model, _v0) { + var numMessages = _v0.numMessages; + var recent = _v0.recent; + var snapshots = _v0.snapshots; + var _v1 = A3($elm$browser$Debugger$History$addRecent, msg, model, recent); + if (_v1.a.$ === 'Just') { + var snapshot = _v1.a.a; + var newRecent = _v1.b; + return A3( + $elm$browser$Debugger$History$History, + A2($elm$core$Array$push, snapshot, snapshots), + newRecent, + numMessages + 1); + } else { + var _v2 = _v1.a; + var newRecent = _v1.b; + return A3($elm$browser$Debugger$History$History, snapshots, newRecent, numMessages + 1); + } + }); +var $elm$core$Basics$always = F2( + function (a, _v0) { + return a; + }); +var $elm$browser$Debugger$Overlay$BadImport = function (a) { + return {$: 'BadImport', a: a}; +}; +var $elm$browser$Debugger$Overlay$RiskyImport = F2( + function (a, b) { + return {$: 'RiskyImport', a: a, b: b}; + }); +var $elm$browser$Debugger$Report$VersionChanged = F2( + function (a, b) { + return {$: 'VersionChanged', a: a, b: b}; + }); +var $elm$browser$Debugger$Report$MessageChanged = F2( + function (a, b) { + return {$: 'MessageChanged', a: a, b: b}; + }); +var $elm$browser$Debugger$Report$SomethingChanged = function (a) { + return {$: 'SomethingChanged', a: a}; +}; +var $elm$browser$Debugger$Report$AliasChange = function (a) { + return {$: 'AliasChange', a: a}; +}; +var $elm$browser$Debugger$Metadata$checkAlias = F4( + function (name, old, _new, changes) { + return (_Utils_eq(old.tipe, _new.tipe) && _Utils_eq(old.args, _new.args)) ? changes : A2( + $elm$core$List$cons, + $elm$browser$Debugger$Report$AliasChange(name), + changes); + }); +var $elm$browser$Debugger$Report$UnionChange = F2( + function (a, b) { + return {$: 'UnionChange', a: a, b: b}; + }); +var $elm$browser$Debugger$Metadata$addTag = F3( + function (tag, _v0, changes) { + return _Utils_update( + changes, + { + added: A2($elm$core$List$cons, tag, changes.added) + }); + }); +var $elm$browser$Debugger$Metadata$checkTag = F4( + function (tag, old, _new, changes) { + return _Utils_eq(old, _new) ? changes : _Utils_update( + changes, + { + changed: A2($elm$core$List$cons, tag, changes.changed) + }); + }); +var $elm$browser$Debugger$Report$TagChanges = F4( + function (removed, changed, added, argsMatch) { + return {added: added, argsMatch: argsMatch, changed: changed, removed: removed}; + }); +var $elm$browser$Debugger$Report$emptyTagChanges = function (argsMatch) { + return A4($elm$browser$Debugger$Report$TagChanges, _List_Nil, _List_Nil, _List_Nil, argsMatch); +}; +var $elm$browser$Debugger$Report$hasTagChanges = function (tagChanges) { + return _Utils_eq( + tagChanges, + A4($elm$browser$Debugger$Report$TagChanges, _List_Nil, _List_Nil, _List_Nil, true)); +}; +var $elm$core$Dict$merge = F6( + function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { + var stepState = F3( + function (rKey, rValue, _v0) { + stepState: + while (true) { + var list = _v0.a; + var result = _v0.b; + if (!list.b) { + return _Utils_Tuple2( + list, + A3(rightStep, rKey, rValue, result)); + } else { + var _v2 = list.a; + var lKey = _v2.a; + var lValue = _v2.b; + var rest = list.b; + if (_Utils_cmp(lKey, rKey) < 0) { + var $temp$rKey = rKey, + $temp$rValue = rValue, + $temp$_v0 = _Utils_Tuple2( + rest, + A3(leftStep, lKey, lValue, result)); + rKey = $temp$rKey; + rValue = $temp$rValue; + _v0 = $temp$_v0; + continue stepState; + } else { + if (_Utils_cmp(lKey, rKey) > 0) { + return _Utils_Tuple2( + list, + A3(rightStep, rKey, rValue, result)); + } else { + return _Utils_Tuple2( + rest, + A4(bothStep, lKey, lValue, rValue, result)); + } + } + } + } + }); + var _v3 = A3( + $elm$core$Dict$foldl, + stepState, + _Utils_Tuple2( + $elm$core$Dict$toList(leftDict), + initialResult), + rightDict); + var leftovers = _v3.a; + var intermediateResult = _v3.b; + return A3( + $elm$core$List$foldl, + F2( + function (_v4, result) { + var k = _v4.a; + var v = _v4.b; + return A3(leftStep, k, v, result); + }), + intermediateResult, + leftovers); + }); +var $elm$browser$Debugger$Metadata$removeTag = F3( + function (tag, _v0, changes) { + return _Utils_update( + changes, + { + removed: A2($elm$core$List$cons, tag, changes.removed) + }); + }); +var $elm$browser$Debugger$Metadata$checkUnion = F4( + function (name, old, _new, changes) { + var tagChanges = A6( + $elm$core$Dict$merge, + $elm$browser$Debugger$Metadata$removeTag, + $elm$browser$Debugger$Metadata$checkTag, + $elm$browser$Debugger$Metadata$addTag, + old.tags, + _new.tags, + $elm$browser$Debugger$Report$emptyTagChanges( + _Utils_eq(old.args, _new.args))); + return $elm$browser$Debugger$Report$hasTagChanges(tagChanges) ? changes : A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Report$UnionChange, name, tagChanges), + changes); + }); +var $elm$browser$Debugger$Metadata$ignore = F3( + function (key, value, report) { + return report; + }); +var $elm$browser$Debugger$Metadata$checkTypes = F2( + function (old, _new) { + return (!_Utils_eq(old.message, _new.message)) ? A2($elm$browser$Debugger$Report$MessageChanged, old.message, _new.message) : $elm$browser$Debugger$Report$SomethingChanged( + A6( + $elm$core$Dict$merge, + $elm$browser$Debugger$Metadata$ignore, + $elm$browser$Debugger$Metadata$checkUnion, + $elm$browser$Debugger$Metadata$ignore, + old.unions, + _new.unions, + A6($elm$core$Dict$merge, $elm$browser$Debugger$Metadata$ignore, $elm$browser$Debugger$Metadata$checkAlias, $elm$browser$Debugger$Metadata$ignore, old.aliases, _new.aliases, _List_Nil))); + }); +var $elm$browser$Debugger$Metadata$check = F2( + function (old, _new) { + return (!_Utils_eq(old.versions.elm, _new.versions.elm)) ? A2($elm$browser$Debugger$Report$VersionChanged, old.versions.elm, _new.versions.elm) : A2($elm$browser$Debugger$Metadata$checkTypes, old.types, _new.types); + }); +var $elm$browser$Debugger$Report$CorruptHistory = {$: 'CorruptHistory'}; +var $elm$browser$Debugger$Overlay$corruptImport = $elm$browser$Debugger$Overlay$BadImport($elm$browser$Debugger$Report$CorruptHistory); +var $elm$json$Json$Decode$decodeString = _Json_runOnString; +var $elm$browser$Debugger$Report$Fine = {$: 'Fine'}; +var $elm$browser$Debugger$Report$Impossible = {$: 'Impossible'}; +var $elm$browser$Debugger$Report$Risky = {$: 'Risky'}; +var $elm$core$Basics$not = _Basics_not; +var $elm$core$List$isEmpty = function (xs) { + if (!xs.b) { + return true; + } else { + return false; + } +}; +var $elm$browser$Debugger$Report$some = function (list) { + return !$elm$core$List$isEmpty(list); +}; +var $elm$browser$Debugger$Report$evaluateChange = function (change) { + if (change.$ === 'AliasChange') { + return $elm$browser$Debugger$Report$Impossible; + } else { + var argsMatch = change.b.argsMatch; + var added = change.b.added; + var changed = change.b.changed; + var removed = change.b.removed; + return ((!argsMatch) || ($elm$browser$Debugger$Report$some(changed) || $elm$browser$Debugger$Report$some(removed))) ? $elm$browser$Debugger$Report$Impossible : ($elm$browser$Debugger$Report$some(added) ? $elm$browser$Debugger$Report$Risky : $elm$browser$Debugger$Report$Fine); + } +}; +var $elm$browser$Debugger$Report$worstCase = F2( + function (status, statusList) { + worstCase: + while (true) { + if (!statusList.b) { + return status; + } else { + switch (statusList.a.$) { + case 'Impossible': + var _v1 = statusList.a; + return $elm$browser$Debugger$Report$Impossible; + case 'Risky': + var _v2 = statusList.a; + var rest = statusList.b; + var $temp$status = $elm$browser$Debugger$Report$Risky, + $temp$statusList = rest; + status = $temp$status; + statusList = $temp$statusList; + continue worstCase; + default: + var _v3 = statusList.a; + var rest = statusList.b; + var $temp$status = status, + $temp$statusList = rest; + status = $temp$status; + statusList = $temp$statusList; + continue worstCase; + } + } + } + }); +var $elm$browser$Debugger$Report$evaluate = function (report) { + switch (report.$) { + case 'CorruptHistory': + return $elm$browser$Debugger$Report$Impossible; + case 'VersionChanged': + return $elm$browser$Debugger$Report$Impossible; + case 'MessageChanged': + return $elm$browser$Debugger$Report$Impossible; + default: + var changes = report.a; + return A2( + $elm$browser$Debugger$Report$worstCase, + $elm$browser$Debugger$Report$Fine, + A2($elm$core$List$map, $elm$browser$Debugger$Report$evaluateChange, changes)); + } +}; +var $elm$json$Json$Decode$value = _Json_decodeValue; +var $elm$browser$Debugger$Overlay$uploadDecoder = A3( + $elm$json$Json$Decode$map2, + F2( + function (x, y) { + return _Utils_Tuple2(x, y); + }), + A2($elm$json$Json$Decode$field, 'metadata', $elm$browser$Debugger$Metadata$decoder), + A2($elm$json$Json$Decode$field, 'history', $elm$json$Json$Decode$value)); +var $elm$browser$Debugger$Overlay$assessImport = F2( + function (metadata, jsonString) { + var _v0 = A2($elm$json$Json$Decode$decodeString, $elm$browser$Debugger$Overlay$uploadDecoder, jsonString); + if (_v0.$ === 'Err') { + return $elm$core$Result$Err($elm$browser$Debugger$Overlay$corruptImport); + } else { + var _v1 = _v0.a; + var foreignMetadata = _v1.a; + var rawHistory = _v1.b; + var report = A2($elm$browser$Debugger$Metadata$check, foreignMetadata, metadata); + var _v2 = $elm$browser$Debugger$Report$evaluate(report); + switch (_v2.$) { + case 'Impossible': + return $elm$core$Result$Err( + $elm$browser$Debugger$Overlay$BadImport(report)); + case 'Risky': + return $elm$core$Result$Err( + A2($elm$browser$Debugger$Overlay$RiskyImport, report, rawHistory)); + default: + return $elm$core$Result$Ok(rawHistory); + } + } + }); +var $elm$core$Platform$Cmd$batch = _Platform_batch; +var $elm$browser$Debugger$Overlay$close = F2( + function (msg, state) { + switch (state.$) { + case 'None': + return $elm$core$Maybe$Nothing; + case 'BadMetadata': + return $elm$core$Maybe$Nothing; + case 'BadImport': + return $elm$core$Maybe$Nothing; + default: + var rawHistory = state.b; + if (msg.$ === 'Cancel') { + return $elm$core$Maybe$Nothing; + } else { + return $elm$core$Maybe$Just(rawHistory); + } + } + }); +var $elm$browser$Debugger$History$elmToJs = A2($elm$core$Basics$composeR, _Json_wrap, _Debugger_unsafeCoerce); +var $elm$browser$Debugger$History$encodeHelp = F2( + function (snapshot, allMessages) { + return A3($elm$core$Array$foldl, $elm$core$List$cons, allMessages, snapshot.messages); + }); +var $elm$json$Json$Encode$list = F2( + function (func, entries) { + return _Json_wrap( + A3( + $elm$core$List$foldl, + _Json_addEntry(func), + _Json_emptyArray(_Utils_Tuple0), + entries)); + }); +var $elm$browser$Debugger$History$encode = function (_v0) { + var recent = _v0.recent; + var snapshots = _v0.snapshots; + return A2( + $elm$json$Json$Encode$list, + $elm$browser$Debugger$History$elmToJs, + A3( + $elm$core$Array$foldr, + $elm$browser$Debugger$History$encodeHelp, + $elm$core$List$reverse(recent.messages), + snapshots)); +}; +var $elm$json$Json$Encode$object = function (pairs) { + return _Json_wrap( + A3( + $elm$core$List$foldl, + F2( + function (_v0, obj) { + var k = _v0.a; + var v = _v0.b; + return A3(_Json_addField, k, v, obj); + }), + _Json_emptyObject(_Utils_Tuple0), + pairs)); +}; +var $elm$browser$Debugger$Metadata$encodeAlias = function (_v0) { + var tipe = _v0.tipe; + var args = _v0.args; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'args', + A2($elm$json$Json$Encode$list, $elm$json$Json$Encode$string, args)), + _Utils_Tuple2( + 'type', + $elm$json$Json$Encode$string(tipe)) + ])); +}; +var $elm$browser$Debugger$Metadata$encodeDict = F2( + function (f, dict) { + return $elm$json$Json$Encode$object( + $elm$core$Dict$toList( + A2( + $elm$core$Dict$map, + F2( + function (key, value) { + return f(value); + }), + dict))); + }); +var $elm$browser$Debugger$Metadata$encodeUnion = function (_v0) { + var tags = _v0.tags; + var args = _v0.args; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'args', + A2($elm$json$Json$Encode$list, $elm$json$Json$Encode$string, args)), + _Utils_Tuple2( + 'tags', + A2( + $elm$browser$Debugger$Metadata$encodeDict, + $elm$json$Json$Encode$list($elm$json$Json$Encode$string), + tags)) + ])); +}; +var $elm$browser$Debugger$Metadata$encodeTypes = function (_v0) { + var aliases = _v0.aliases; + var unions = _v0.unions; + var message = _v0.message; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'message', + $elm$json$Json$Encode$string(message)), + _Utils_Tuple2( + 'aliases', + A2($elm$browser$Debugger$Metadata$encodeDict, $elm$browser$Debugger$Metadata$encodeAlias, aliases)), + _Utils_Tuple2( + 'unions', + A2($elm$browser$Debugger$Metadata$encodeDict, $elm$browser$Debugger$Metadata$encodeUnion, unions)) + ])); +}; +var $elm$browser$Debugger$Metadata$encodeVersions = function (_v0) { + var elm = _v0.elm; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'elm', + $elm$json$Json$Encode$string(elm)) + ])); +}; +var $elm$browser$Debugger$Metadata$encode = function (_v0) { + var types = _v0.types; + var versions = _v0.versions; + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'versions', + $elm$browser$Debugger$Metadata$encodeVersions(versions)), + _Utils_Tuple2( + 'types', + $elm$browser$Debugger$Metadata$encodeTypes(types)) + ])); +}; +var $elm$core$Basics$identity = function (x) { + return x; +}; +var $elm$core$Task$Perform = function (a) { + return {$: 'Perform', a: a}; +}; +var $elm$core$Task$succeed = _Scheduler_succeed; +var $elm$core$Task$init = $elm$core$Task$succeed(_Utils_Tuple0); +var $elm$core$Task$andThen = _Scheduler_andThen; +var $elm$core$Task$map = F2( + function (func, taskA) { + return A2( + $elm$core$Task$andThen, + function (a) { + return $elm$core$Task$succeed( + func(a)); + }, + taskA); + }); +var $elm$core$Task$map2 = F3( + function (func, taskA, taskB) { + return A2( + $elm$core$Task$andThen, + function (a) { + return A2( + $elm$core$Task$andThen, + function (b) { + return $elm$core$Task$succeed( + A2(func, a, b)); + }, + taskB); + }, + taskA); + }); +var $elm$core$Task$sequence = function (tasks) { + return A3( + $elm$core$List$foldr, + $elm$core$Task$map2($elm$core$List$cons), + $elm$core$Task$succeed(_List_Nil), + tasks); +}; +var $elm$core$Platform$sendToApp = _Platform_sendToApp; +var $elm$core$Task$spawnCmd = F2( + function (router, _v0) { + var task = _v0.a; + return _Scheduler_spawn( + A2( + $elm$core$Task$andThen, + $elm$core$Platform$sendToApp(router), + task)); + }); +var $elm$core$Task$onEffects = F3( + function (router, commands, state) { + return A2( + $elm$core$Task$map, + function (_v0) { + return _Utils_Tuple0; + }, + $elm$core$Task$sequence( + A2( + $elm$core$List$map, + $elm$core$Task$spawnCmd(router), + commands))); + }); +var $elm$core$Task$onSelfMsg = F3( + function (_v0, _v1, _v2) { + return $elm$core$Task$succeed(_Utils_Tuple0); + }); +var $elm$core$Task$cmdMap = F2( + function (tagger, _v0) { + var task = _v0.a; + return $elm$core$Task$Perform( + A2($elm$core$Task$map, tagger, task)); + }); +_Platform_effectManagers['Task'] = _Platform_createManager($elm$core$Task$init, $elm$core$Task$onEffects, $elm$core$Task$onSelfMsg, $elm$core$Task$cmdMap); +var $elm$core$Task$command = _Platform_leaf('Task'); +var $elm$core$Task$perform = F2( + function (toMessage, task) { + return $elm$core$Task$command( + $elm$core$Task$Perform( + A2($elm$core$Task$map, toMessage, task))); + }); +var $elm$browser$Debugger$Main$download = F2( + function (metadata, history) { + var historyLength = $elm$browser$Debugger$History$size(history); + return A2( + $elm$core$Task$perform, + function (_v0) { + return $elm$browser$Debugger$Main$NoOp; + }, + A2( + _Debugger_download, + historyLength, + _Json_unwrap( + $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'metadata', + $elm$browser$Debugger$Metadata$encode(metadata)), + _Utils_Tuple2( + 'history', + $elm$browser$Debugger$History$encode(history)) + ]))))); + }); +var $elm$browser$Debugger$Main$Vertical = F3( + function (a, b, c) { + return {$: 'Vertical', a: a, b: b, c: c}; + }); +var $elm$browser$Debugger$Main$drag = F2( + function (info, layout) { + if (layout.$ === 'Horizontal') { + var status = layout.a; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Horizontal, status, info.x / info.width, y); + } else { + var status = layout.a; + var x = layout.b; + return A3($elm$browser$Debugger$Main$Vertical, status, x, info.y / info.height); + } + }); +var $elm$browser$Debugger$History$Stepping = F2( + function (a, b) { + return {$: 'Stepping', a: a, b: b}; + }); +var $elm$browser$Debugger$History$Done = F2( + function (a, b) { + return {$: 'Done', a: a, b: b}; + }); +var $elm$browser$Debugger$History$getHelp = F3( + function (update, msg, getResult) { + if (getResult.$ === 'Done') { + return getResult; + } else { + var n = getResult.a; + var model = getResult.b; + return (!n) ? A2( + $elm$browser$Debugger$History$Done, + msg, + A2(update, msg, model).a) : A2( + $elm$browser$Debugger$History$Stepping, + n - 1, + A2(update, msg, model).a); + } + }); +var $elm$browser$Debugger$History$undone = function (getResult) { + undone: + while (true) { + if (getResult.$ === 'Done') { + var msg = getResult.a; + var model = getResult.b; + return _Utils_Tuple2(model, msg); + } else { + var $temp$getResult = getResult; + getResult = $temp$getResult; + continue undone; + } + } +}; +var $elm$browser$Debugger$History$get = F3( + function (update, index, history) { + get: + while (true) { + var recent = history.recent; + var snapshotMax = history.numMessages - recent.numMessages; + if (_Utils_cmp(index, snapshotMax) > -1) { + return $elm$browser$Debugger$History$undone( + A3( + $elm$core$List$foldr, + $elm$browser$Debugger$History$getHelp(update), + A2($elm$browser$Debugger$History$Stepping, index - snapshotMax, recent.model), + recent.messages)); + } else { + var _v0 = A2($elm$core$Array$get, (index / $elm$browser$Debugger$History$maxSnapshotSize) | 0, history.snapshots); + if (_v0.$ === 'Nothing') { + var $temp$update = update, + $temp$index = index, + $temp$history = history; + update = $temp$update; + index = $temp$index; + history = $temp$history; + continue get; + } else { + var messages = _v0.a.messages; + var model = _v0.a.model; + return $elm$browser$Debugger$History$undone( + A3( + $elm$core$Array$foldr, + $elm$browser$Debugger$History$getHelp(update), + A2($elm$browser$Debugger$History$Stepping, index % $elm$browser$Debugger$History$maxSnapshotSize, model), + messages)); + } + } + } + }); +var $elm$browser$Debugger$History$getRecentMsg = function (history) { + getRecentMsg: + while (true) { + var _v0 = history.recent.messages; + if (!_v0.b) { + var $temp$history = history; + history = $temp$history; + continue getRecentMsg; + } else { + var first = _v0.a; + return first; + } + } +}; +var $elm$core$Dict$get = F2( + function (targetKey, dict) { + get: + while (true) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return $elm$core$Maybe$Nothing; + } else { + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + var _v1 = A2($elm$core$Basics$compare, targetKey, key); + switch (_v1.$) { + case 'LT': + var $temp$targetKey = targetKey, + $temp$dict = left; + targetKey = $temp$targetKey; + dict = $temp$dict; + continue get; + case 'EQ': + return $elm$core$Maybe$Just(value); + default: + var $temp$targetKey = targetKey, + $temp$dict = right; + targetKey = $temp$targetKey; + dict = $temp$dict; + continue get; + } + } + } + }); +var $elm$browser$Debugger$Expando$mergeDictHelp = F3( + function (oldDict, key, value) { + var _v12 = A2($elm$core$Dict$get, key, oldDict); + if (_v12.$ === 'Nothing') { + return value; + } else { + var oldValue = _v12.a; + return A2($elm$browser$Debugger$Expando$mergeHelp, oldValue, value); + } + }); +var $elm$browser$Debugger$Expando$mergeHelp = F2( + function (old, _new) { + var _v3 = _Utils_Tuple2(old, _new); + _v3$6: + while (true) { + switch (_v3.b.$) { + case 'S': + return _new; + case 'Primitive': + return _new; + case 'Sequence': + if (_v3.a.$ === 'Sequence') { + var _v4 = _v3.a; + var isClosed = _v4.b; + var oldValues = _v4.c; + var _v5 = _v3.b; + var seqType = _v5.a; + var newValues = _v5.c; + return A3( + $elm$browser$Debugger$Expando$Sequence, + seqType, + isClosed, + A2($elm$browser$Debugger$Expando$mergeListHelp, oldValues, newValues)); + } else { + break _v3$6; + } + case 'Dictionary': + if (_v3.a.$ === 'Dictionary') { + var _v6 = _v3.a; + var isClosed = _v6.a; + var _v7 = _v3.b; + var keyValuePairs = _v7.b; + return A2($elm$browser$Debugger$Expando$Dictionary, isClosed, keyValuePairs); + } else { + break _v3$6; + } + case 'Record': + if (_v3.a.$ === 'Record') { + var _v8 = _v3.a; + var isClosed = _v8.a; + var oldDict = _v8.b; + var _v9 = _v3.b; + var newDict = _v9.b; + return A2( + $elm$browser$Debugger$Expando$Record, + isClosed, + A2( + $elm$core$Dict$map, + $elm$browser$Debugger$Expando$mergeDictHelp(oldDict), + newDict)); + } else { + break _v3$6; + } + default: + if (_v3.a.$ === 'Constructor') { + var _v10 = _v3.a; + var isClosed = _v10.b; + var oldValues = _v10.c; + var _v11 = _v3.b; + var maybeName = _v11.a; + var newValues = _v11.c; + return A3( + $elm$browser$Debugger$Expando$Constructor, + maybeName, + isClosed, + A2($elm$browser$Debugger$Expando$mergeListHelp, oldValues, newValues)); + } else { + break _v3$6; + } + } + } + return _new; + }); +var $elm$browser$Debugger$Expando$mergeListHelp = F2( + function (olds, news) { + var _v0 = _Utils_Tuple2(olds, news); + if (!_v0.a.b) { + return news; + } else { + if (!_v0.b.b) { + return news; + } else { + var _v1 = _v0.a; + var x = _v1.a; + var xs = _v1.b; + var _v2 = _v0.b; + var y = _v2.a; + var ys = _v2.b; + return A2( + $elm$core$List$cons, + A2($elm$browser$Debugger$Expando$mergeHelp, x, y), + A2($elm$browser$Debugger$Expando$mergeListHelp, xs, ys)); + } + } + }); +var $elm$browser$Debugger$Expando$merge = F2( + function (value, expando) { + return A2( + $elm$browser$Debugger$Expando$mergeHelp, + expando, + _Debugger_init(value)); + }); +var $elm$browser$Debugger$Main$jumpUpdate = F3( + function (update, index, model) { + var history = $elm$browser$Debugger$Main$cachedHistory(model); + var currentMsg = $elm$browser$Debugger$History$getRecentMsg(history); + var currentModel = $elm$browser$Debugger$Main$getLatestModel(model.state); + var _v0 = A3($elm$browser$Debugger$History$get, update, index, history); + var indexModel = _v0.a; + var indexMsg = _v0.b; + return _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$merge, indexModel, model.expandoModel), + expandoMsg: A2($elm$browser$Debugger$Expando$merge, indexMsg, model.expandoMsg), + state: A5($elm$browser$Debugger$Main$Paused, index, indexModel, currentModel, currentMsg, history) + }); + }); +var $elm$browser$Debugger$History$jsToElm = A2($elm$core$Basics$composeR, _Json_unwrap, _Debugger_unsafeCoerce); +var $elm$browser$Debugger$History$decoder = F2( + function (initialModel, update) { + var addMessage = F2( + function (rawMsg, _v0) { + var model = _v0.a; + var history = _v0.b; + var msg = $elm$browser$Debugger$History$jsToElm(rawMsg); + return _Utils_Tuple2( + A2(update, msg, model), + A3($elm$browser$Debugger$History$add, msg, model, history)); + }); + var updateModel = function (rawMsgs) { + return A3( + $elm$core$List$foldl, + addMessage, + _Utils_Tuple2( + initialModel, + $elm$browser$Debugger$History$empty(initialModel)), + rawMsgs); + }; + return A2( + $elm$json$Json$Decode$map, + updateModel, + $elm$json$Json$Decode$list($elm$json$Json$Decode$value)); + }); +var $elm$browser$Debugger$History$getInitialModel = function (_v0) { + var recent = _v0.recent; + var snapshots = _v0.snapshots; + var _v1 = A2($elm$core$Array$get, 0, snapshots); + if (_v1.$ === 'Just') { + var model = _v1.a.model; + return model; + } else { + return recent.model; + } +}; +var $elm$core$Platform$Cmd$none = $elm$core$Platform$Cmd$batch(_List_Nil); +var $elm$browser$Debugger$Main$loadNewHistory = F3( + function (rawHistory, update, model) { + var pureUserUpdate = F2( + function (msg, userModel) { + return A2(update, msg, userModel).a; + }); + var initialUserModel = $elm$browser$Debugger$History$getInitialModel(model.history); + var decoder = A2($elm$browser$Debugger$History$decoder, initialUserModel, pureUserUpdate); + var _v0 = A2($elm$json$Json$Decode$decodeValue, decoder, rawHistory); + if (_v0.$ === 'Err') { + return _Utils_Tuple2( + _Utils_update( + model, + {overlay: $elm$browser$Debugger$Overlay$corruptImport}), + $elm$core$Platform$Cmd$none); + } else { + var _v1 = _v0.a; + var latestUserModel = _v1.a; + var newHistory = _v1.b; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: $elm$browser$Debugger$Expando$init(latestUserModel), + expandoMsg: $elm$browser$Debugger$Expando$init( + $elm$browser$Debugger$History$getRecentMsg(newHistory)), + history: newHistory, + overlay: $elm$browser$Debugger$Overlay$none, + state: $elm$browser$Debugger$Main$Running(latestUserModel) + }), + $elm$core$Platform$Cmd$none); + } + }); +var $elm$browser$Debugger$Main$scroll = function (popout) { + return A2( + $elm$core$Task$perform, + $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), + _Debugger_scroll(popout)); +}; +var $elm$browser$Debugger$Main$scrollTo = F2( + function (id, popout) { + return A2( + $elm$core$Task$perform, + $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), + A2(_Debugger_scrollTo, id, popout)); + }); +var $elm$browser$Debugger$Main$setDragStatus = F2( + function (status, layout) { + if (layout.$ === 'Horizontal') { + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Horizontal, status, x, y); + } else { + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Vertical, status, x, y); + } + }); +var $elm$browser$Debugger$Main$swapLayout = function (layout) { + if (layout.$ === 'Horizontal') { + var s = layout.a; + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Vertical, s, x, y); + } else { + var s = layout.a; + var x = layout.b; + var y = layout.c; + return A3($elm$browser$Debugger$Main$Horizontal, s, x, y); + } +}; +var $elm$core$Dict$getMin = function (dict) { + getMin: + while (true) { + if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) { + var left = dict.d; + var $temp$dict = left; + dict = $temp$dict; + continue getMin; + } else { + return dict; + } + } +}; +var $elm$core$Dict$moveRedLeft = function (dict) { + if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) { + if ((dict.e.d.$ === 'RBNode_elm_builtin') && (dict.e.d.a.$ === 'Red')) { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v1 = dict.d; + var lClr = _v1.a; + var lK = _v1.b; + var lV = _v1.c; + var lLeft = _v1.d; + var lRight = _v1.e; + var _v2 = dict.e; + var rClr = _v2.a; + var rK = _v2.b; + var rV = _v2.c; + var rLeft = _v2.d; + var _v3 = rLeft.a; + var rlK = rLeft.b; + var rlV = rLeft.c; + var rlL = rLeft.d; + var rlR = rLeft.e; + var rRight = _v2.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + rlK, + rlV, + A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + rlL), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, rK, rV, rlR, rRight)); + } else { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v4 = dict.d; + var lClr = _v4.a; + var lK = _v4.b; + var lV = _v4.c; + var lLeft = _v4.d; + var lRight = _v4.e; + var _v5 = dict.e; + var rClr = _v5.a; + var rK = _v5.b; + var rV = _v5.c; + var rLeft = _v5.d; + var rRight = _v5.e; + if (clr.$ === 'Black') { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } + } + } else { + return dict; + } +}; +var $elm$core$Dict$moveRedRight = function (dict) { + if (((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) && (dict.e.$ === 'RBNode_elm_builtin')) { + if ((dict.d.d.$ === 'RBNode_elm_builtin') && (dict.d.d.a.$ === 'Red')) { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v1 = dict.d; + var lClr = _v1.a; + var lK = _v1.b; + var lV = _v1.c; + var _v2 = _v1.d; + var _v3 = _v2.a; + var llK = _v2.b; + var llV = _v2.c; + var llLeft = _v2.d; + var llRight = _v2.e; + var lRight = _v1.e; + var _v4 = dict.e; + var rClr = _v4.a; + var rK = _v4.b; + var rV = _v4.c; + var rLeft = _v4.d; + var rRight = _v4.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Red, + lK, + lV, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, llK, llV, llLeft, llRight), + A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + lRight, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight))); + } else { + var clr = dict.a; + var k = dict.b; + var v = dict.c; + var _v5 = dict.d; + var lClr = _v5.a; + var lK = _v5.b; + var lV = _v5.c; + var lLeft = _v5.d; + var lRight = _v5.e; + var _v6 = dict.e; + var rClr = _v6.a; + var rK = _v6.b; + var rV = _v6.c; + var rLeft = _v6.d; + var rRight = _v6.e; + if (clr.$ === 'Black') { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + $elm$core$Dict$Black, + k, + v, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, lK, lV, lLeft, lRight), + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, rK, rV, rLeft, rRight)); + } + } + } else { + return dict; + } +}; +var $elm$core$Dict$removeHelpPrepEQGT = F7( + function (targetKey, dict, color, key, value, left, right) { + if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Red')) { + var _v1 = left.a; + var lK = left.b; + var lV = left.c; + var lLeft = left.d; + var lRight = left.e; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + lK, + lV, + lLeft, + A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Red, key, value, lRight, right)); + } else { + _v2$2: + while (true) { + if ((right.$ === 'RBNode_elm_builtin') && (right.a.$ === 'Black')) { + if (right.d.$ === 'RBNode_elm_builtin') { + if (right.d.a.$ === 'Black') { + var _v3 = right.a; + var _v4 = right.d; + var _v5 = _v4.a; + return $elm$core$Dict$moveRedRight(dict); + } else { + break _v2$2; + } + } else { + var _v6 = right.a; + var _v7 = right.d; + return $elm$core$Dict$moveRedRight(dict); + } + } else { + break _v2$2; + } + } + return dict; + } + }); +var $elm$core$Dict$removeMin = function (dict) { + if ((dict.$ === 'RBNode_elm_builtin') && (dict.d.$ === 'RBNode_elm_builtin')) { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var lColor = left.a; + var lLeft = left.d; + var right = dict.e; + if (lColor.$ === 'Black') { + if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) { + var _v3 = lLeft.a; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + $elm$core$Dict$removeMin(left), + right); + } else { + var _v4 = $elm$core$Dict$moveRedLeft(dict); + if (_v4.$ === 'RBNode_elm_builtin') { + var nColor = _v4.a; + var nKey = _v4.b; + var nValue = _v4.c; + var nLeft = _v4.d; + var nRight = _v4.e; + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + $elm$core$Dict$removeMin(nLeft), + nRight); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + $elm$core$Dict$removeMin(left), + right); + } + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } +}; +var $elm$core$Dict$removeHelp = F2( + function (targetKey, dict) { + if (dict.$ === 'RBEmpty_elm_builtin') { + return $elm$core$Dict$RBEmpty_elm_builtin; + } else { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + if (_Utils_cmp(targetKey, key) < 0) { + if ((left.$ === 'RBNode_elm_builtin') && (left.a.$ === 'Black')) { + var _v4 = left.a; + var lLeft = left.d; + if ((lLeft.$ === 'RBNode_elm_builtin') && (lLeft.a.$ === 'Red')) { + var _v6 = lLeft.a; + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + A2($elm$core$Dict$removeHelp, targetKey, left), + right); + } else { + var _v7 = $elm$core$Dict$moveRedLeft(dict); + if (_v7.$ === 'RBNode_elm_builtin') { + var nColor = _v7.a; + var nKey = _v7.b; + var nValue = _v7.c; + var nLeft = _v7.d; + var nRight = _v7.e; + return A5( + $elm$core$Dict$balance, + nColor, + nKey, + nValue, + A2($elm$core$Dict$removeHelp, targetKey, nLeft), + nRight); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } + } else { + return A5( + $elm$core$Dict$RBNode_elm_builtin, + color, + key, + value, + A2($elm$core$Dict$removeHelp, targetKey, left), + right); + } + } else { + return A2( + $elm$core$Dict$removeHelpEQGT, + targetKey, + A7($elm$core$Dict$removeHelpPrepEQGT, targetKey, dict, color, key, value, left, right)); + } + } + }); +var $elm$core$Dict$removeHelpEQGT = F2( + function (targetKey, dict) { + if (dict.$ === 'RBNode_elm_builtin') { + var color = dict.a; + var key = dict.b; + var value = dict.c; + var left = dict.d; + var right = dict.e; + if (_Utils_eq(targetKey, key)) { + var _v1 = $elm$core$Dict$getMin(right); + if (_v1.$ === 'RBNode_elm_builtin') { + var minKey = _v1.b; + var minValue = _v1.c; + return A5( + $elm$core$Dict$balance, + color, + minKey, + minValue, + left, + $elm$core$Dict$removeMin(right)); + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + } else { + return A5( + $elm$core$Dict$balance, + color, + key, + value, + left, + A2($elm$core$Dict$removeHelp, targetKey, right)); + } + } else { + return $elm$core$Dict$RBEmpty_elm_builtin; + } + }); +var $elm$core$Dict$remove = F2( + function (key, dict) { + var _v0 = A2($elm$core$Dict$removeHelp, key, dict); + if ((_v0.$ === 'RBNode_elm_builtin') && (_v0.a.$ === 'Red')) { + var _v1 = _v0.a; + var k = _v0.b; + var v = _v0.c; + var l = _v0.d; + var r = _v0.e; + return A5($elm$core$Dict$RBNode_elm_builtin, $elm$core$Dict$Black, k, v, l, r); + } else { + var x = _v0; + return x; + } + }); +var $elm$core$Dict$update = F3( + function (targetKey, alter, dictionary) { + var _v0 = alter( + A2($elm$core$Dict$get, targetKey, dictionary)); + if (_v0.$ === 'Just') { + var value = _v0.a; + return A3($elm$core$Dict$insert, targetKey, value, dictionary); + } else { + return A2($elm$core$Dict$remove, targetKey, dictionary); + } + }); +var $elm$browser$Debugger$Expando$updateIndex = F3( + function (n, func, list) { + if (!list.b) { + return _List_Nil; + } else { + var x = list.a; + var xs = list.b; + return (n <= 0) ? A2( + $elm$core$List$cons, + func(x), + xs) : A2( + $elm$core$List$cons, + x, + A3($elm$browser$Debugger$Expando$updateIndex, n - 1, func, xs)); + } + }); +var $elm$browser$Debugger$Expando$update = F2( + function (msg, value) { + switch (value.$) { + case 'S': + return value; + case 'Primitive': + return value; + case 'Sequence': + var seqType = value.a; + var isClosed = value.b; + var valueList = value.c; + switch (msg.$) { + case 'Toggle': + return A3($elm$browser$Debugger$Expando$Sequence, seqType, !isClosed, valueList); + case 'Index': + if (msg.a.$ === 'None') { + var _v3 = msg.a; + var index = msg.b; + var subMsg = msg.c; + return A3( + $elm$browser$Debugger$Expando$Sequence, + seqType, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + $elm$browser$Debugger$Expando$update(subMsg), + valueList)); + } else { + return value; + } + default: + return value; + } + case 'Dictionary': + var isClosed = value.a; + var keyValuePairs = value.b; + switch (msg.$) { + case 'Toggle': + return A2($elm$browser$Debugger$Expando$Dictionary, !isClosed, keyValuePairs); + case 'Index': + var redirect = msg.a; + var index = msg.b; + var subMsg = msg.c; + switch (redirect.$) { + case 'None': + return value; + case 'Key': + return A2( + $elm$browser$Debugger$Expando$Dictionary, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + function (_v6) { + var k = _v6.a; + var v = _v6.b; + return _Utils_Tuple2( + A2($elm$browser$Debugger$Expando$update, subMsg, k), + v); + }, + keyValuePairs)); + default: + return A2( + $elm$browser$Debugger$Expando$Dictionary, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + function (_v7) { + var k = _v7.a; + var v = _v7.b; + return _Utils_Tuple2( + k, + A2($elm$browser$Debugger$Expando$update, subMsg, v)); + }, + keyValuePairs)); + } + default: + return value; + } + case 'Record': + var isClosed = value.a; + var valueDict = value.b; + switch (msg.$) { + case 'Toggle': + return A2($elm$browser$Debugger$Expando$Record, !isClosed, valueDict); + case 'Index': + return value; + default: + var field = msg.a; + var subMsg = msg.b; + return A2( + $elm$browser$Debugger$Expando$Record, + isClosed, + A3( + $elm$core$Dict$update, + field, + $elm$browser$Debugger$Expando$updateField(subMsg), + valueDict)); + } + default: + var maybeName = value.a; + var isClosed = value.b; + var valueList = value.c; + switch (msg.$) { + case 'Toggle': + return A3($elm$browser$Debugger$Expando$Constructor, maybeName, !isClosed, valueList); + case 'Index': + if (msg.a.$ === 'None') { + var _v10 = msg.a; + var index = msg.b; + var subMsg = msg.c; + return A3( + $elm$browser$Debugger$Expando$Constructor, + maybeName, + isClosed, + A3( + $elm$browser$Debugger$Expando$updateIndex, + index, + $elm$browser$Debugger$Expando$update(subMsg), + valueList)); + } else { + return value; + } + default: + return value; + } + } + }); +var $elm$browser$Debugger$Expando$updateField = F2( + function (msg, maybeExpando) { + if (maybeExpando.$ === 'Nothing') { + return maybeExpando; + } else { + var expando = maybeExpando.a; + return $elm$core$Maybe$Just( + A2($elm$browser$Debugger$Expando$update, msg, expando)); + } + }); +var $elm$browser$Debugger$Main$Upload = function (a) { + return {$: 'Upload', a: a}; +}; +var $elm$browser$Debugger$Main$upload = function (popout) { + return A2( + $elm$core$Task$perform, + $elm$browser$Debugger$Main$Upload, + _Debugger_upload(popout)); +}; +var $elm$browser$Debugger$Overlay$BadMetadata = function (a) { + return {$: 'BadMetadata', a: a}; +}; +var $elm$browser$Debugger$Overlay$badMetadata = $elm$browser$Debugger$Overlay$BadMetadata; +var $elm$browser$Debugger$Main$withGoodMetadata = F2( + function (model, func) { + var _v0 = model.metadata; + if (_v0.$ === 'Ok') { + var metadata = _v0.a; + return func(metadata); + } else { + var error = _v0.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + overlay: $elm$browser$Debugger$Overlay$badMetadata(error) + }), + $elm$core$Platform$Cmd$none); + } + }); +var $elm$browser$Debugger$Main$wrapUpdate = F3( + function (update, msg, model) { + wrapUpdate: + while (true) { + switch (msg.$) { + case 'NoOp': + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + case 'UserMsg': + var userMsg = msg.a; + var userModel = $elm$browser$Debugger$Main$getLatestModel(model.state); + var newHistory = A3($elm$browser$Debugger$History$add, userMsg, userModel, model.history); + var _v1 = A2(update, userMsg, userModel); + var newUserModel = _v1.a; + var userCmds = _v1.b; + var commands = A2($elm$core$Platform$Cmd$map, $elm$browser$Debugger$Main$UserMsg, userCmds); + var _v2 = model.state; + if (_v2.$ === 'Running') { + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$merge, newUserModel, model.expandoModel), + expandoMsg: A2($elm$browser$Debugger$Expando$merge, userMsg, model.expandoMsg), + history: newHistory, + state: $elm$browser$Debugger$Main$Running(newUserModel) + }), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + commands, + $elm$browser$Debugger$Main$scroll(model.popout) + ]))); + } else { + var index = _v2.a; + var indexModel = _v2.b; + var history = _v2.e; + return _Utils_Tuple2( + _Utils_update( + model, + { + history: newHistory, + state: A5($elm$browser$Debugger$Main$Paused, index, indexModel, newUserModel, userMsg, history) + }), + commands); + } + case 'TweakExpandoMsg': + var eMsg = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoMsg: A2($elm$browser$Debugger$Expando$update, eMsg, model.expandoMsg) + }), + $elm$core$Platform$Cmd$none); + case 'TweakExpandoModel': + var eMsg = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$update, eMsg, model.expandoModel) + }), + $elm$core$Platform$Cmd$none); + case 'Resume': + var _v3 = model.state; + if (_v3.$ === 'Running') { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + var userModel = _v3.c; + var userMsg = _v3.d; + return _Utils_Tuple2( + _Utils_update( + model, + { + expandoModel: A2($elm$browser$Debugger$Expando$merge, userModel, model.expandoModel), + expandoMsg: A2($elm$browser$Debugger$Expando$merge, userMsg, model.expandoMsg), + state: $elm$browser$Debugger$Main$Running(userModel) + }), + $elm$browser$Debugger$Main$scroll(model.popout)); + } + case 'Jump': + var index = msg.a; + return _Utils_Tuple2( + A3($elm$browser$Debugger$Main$jumpUpdate, update, index, model), + $elm$core$Platform$Cmd$none); + case 'SliderJump': + var index = msg.a; + return _Utils_Tuple2( + A3($elm$browser$Debugger$Main$jumpUpdate, update, index, model), + A2( + $elm$browser$Debugger$Main$scrollTo, + $elm$browser$Debugger$History$idForMessageIndex(index), + model.popout)); + case 'Open': + return _Utils_Tuple2( + model, + A2( + $elm$core$Task$perform, + $elm$core$Basics$always($elm$browser$Debugger$Main$NoOp), + _Debugger_open(model.popout))); + case 'Up': + var _v4 = model.state; + if (_v4.$ === 'Running') { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + var i = _v4.a; + var history = _v4.e; + var targetIndex = i + 1; + if (_Utils_cmp( + targetIndex, + $elm$browser$Debugger$History$size(history)) < 0) { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$SliderJump(targetIndex), + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } else { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$Resume, + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } + } + case 'Down': + var _v5 = model.state; + if (_v5.$ === 'Running') { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$Jump( + $elm$browser$Debugger$History$size(model.history) - 1), + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } else { + var index = _v5.a; + if (index > 0) { + var $temp$update = update, + $temp$msg = $elm$browser$Debugger$Main$SliderJump(index - 1), + $temp$model = model; + update = $temp$update; + msg = $temp$msg; + model = $temp$model; + continue wrapUpdate; + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + } + case 'Import': + return A2( + $elm$browser$Debugger$Main$withGoodMetadata, + model, + function (_v6) { + return _Utils_Tuple2( + model, + $elm$browser$Debugger$Main$upload(model.popout)); + }); + case 'Export': + return A2( + $elm$browser$Debugger$Main$withGoodMetadata, + model, + function (metadata) { + return _Utils_Tuple2( + model, + A2($elm$browser$Debugger$Main$download, metadata, model.history)); + }); + case 'Upload': + var jsonString = msg.a; + return A2( + $elm$browser$Debugger$Main$withGoodMetadata, + model, + function (metadata) { + var _v7 = A2($elm$browser$Debugger$Overlay$assessImport, metadata, jsonString); + if (_v7.$ === 'Err') { + var newOverlay = _v7.a; + return _Utils_Tuple2( + _Utils_update( + model, + {overlay: newOverlay}), + $elm$core$Platform$Cmd$none); + } else { + var rawHistory = _v7.a; + return A3($elm$browser$Debugger$Main$loadNewHistory, rawHistory, update, model); + } + }); + case 'OverlayMsg': + var overlayMsg = msg.a; + var _v8 = A2($elm$browser$Debugger$Overlay$close, overlayMsg, model.overlay); + if (_v8.$ === 'Nothing') { + return _Utils_Tuple2( + _Utils_update( + model, + {overlay: $elm$browser$Debugger$Overlay$none}), + $elm$core$Platform$Cmd$none); + } else { + var rawHistory = _v8.a; + return A3($elm$browser$Debugger$Main$loadNewHistory, rawHistory, update, model); + } + case 'SwapLayout': + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: $elm$browser$Debugger$Main$swapLayout(model.layout) + }), + $elm$core$Platform$Cmd$none); + case 'DragStart': + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: A2($elm$browser$Debugger$Main$setDragStatus, $elm$browser$Debugger$Main$Moving, model.layout) + }), + $elm$core$Platform$Cmd$none); + case 'Drag': + var info = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: A2($elm$browser$Debugger$Main$drag, info, model.layout) + }), + $elm$core$Platform$Cmd$none); + default: + return _Utils_Tuple2( + _Utils_update( + model, + { + layout: A2($elm$browser$Debugger$Main$setDragStatus, $elm$browser$Debugger$Main$Static, model.layout) + }), + $elm$core$Platform$Cmd$none); + } + } + }); +var $elm$browser$Browser$External = function (a) { + return {$: 'External', a: a}; +}; +var $elm$browser$Browser$Internal = function (a) { + return {$: 'Internal', a: a}; +}; +var $elm$browser$Browser$Dom$NotFound = function (a) { + return {$: 'NotFound', a: a}; +}; +var $elm$url$Url$Http = {$: 'Http'}; +var $elm$url$Url$Https = {$: 'Https'}; +var $elm$url$Url$Url = F6( + function (protocol, host, port_, path, query, fragment) { + return {fragment: fragment, host: host, path: path, port_: port_, protocol: protocol, query: query}; + }); +var $elm$core$String$dropLeft = F2( + function (n, string) { + return (n < 1) ? string : A3( + $elm$core$String$slice, + n, + $elm$core$String$length(string), + string); + }); +var $elm$core$String$indexes = _String_indexes; +var $elm$core$String$isEmpty = function (string) { + return string === ''; +}; +var $elm$url$Url$chompBeforePath = F5( + function (protocol, path, params, frag, str) { + if ($elm$core$String$isEmpty(str) || A2($elm$core$String$contains, '@', str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, ':', str); + if (!_v0.b) { + return $elm$core$Maybe$Just( + A6($elm$url$Url$Url, protocol, str, $elm$core$Maybe$Nothing, path, params, frag)); + } else { + if (!_v0.b.b) { + var i = _v0.a; + var _v1 = $elm$core$String$toInt( + A2($elm$core$String$dropLeft, i + 1, str)); + if (_v1.$ === 'Nothing') { + return $elm$core$Maybe$Nothing; + } else { + var port_ = _v1; + return $elm$core$Maybe$Just( + A6( + $elm$url$Url$Url, + protocol, + A2($elm$core$String$left, i, str), + port_, + path, + params, + frag)); + } + } else { + return $elm$core$Maybe$Nothing; + } + } + } + }); +var $elm$url$Url$chompBeforeQuery = F4( + function (protocol, params, frag, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '/', str); + if (!_v0.b) { + return A5($elm$url$Url$chompBeforePath, protocol, '/', params, frag, str); + } else { + var i = _v0.a; + return A5( + $elm$url$Url$chompBeforePath, + protocol, + A2($elm$core$String$dropLeft, i, str), + params, + frag, + A2($elm$core$String$left, i, str)); + } + } + }); +var $elm$url$Url$chompBeforeFragment = F3( + function (protocol, frag, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '?', str); + if (!_v0.b) { + return A4($elm$url$Url$chompBeforeQuery, protocol, $elm$core$Maybe$Nothing, frag, str); + } else { + var i = _v0.a; + return A4( + $elm$url$Url$chompBeforeQuery, + protocol, + $elm$core$Maybe$Just( + A2($elm$core$String$dropLeft, i + 1, str)), + frag, + A2($elm$core$String$left, i, str)); + } + } + }); +var $elm$url$Url$chompAfterProtocol = F2( + function (protocol, str) { + if ($elm$core$String$isEmpty(str)) { + return $elm$core$Maybe$Nothing; + } else { + var _v0 = A2($elm$core$String$indexes, '#', str); + if (!_v0.b) { + return A3($elm$url$Url$chompBeforeFragment, protocol, $elm$core$Maybe$Nothing, str); + } else { + var i = _v0.a; + return A3( + $elm$url$Url$chompBeforeFragment, + protocol, + $elm$core$Maybe$Just( + A2($elm$core$String$dropLeft, i + 1, str)), + A2($elm$core$String$left, i, str)); + } + } + }); +var $elm$core$String$startsWith = _String_startsWith; +var $elm$url$Url$fromString = function (str) { + return A2($elm$core$String$startsWith, 'http://', str) ? A2( + $elm$url$Url$chompAfterProtocol, + $elm$url$Url$Http, + A2($elm$core$String$dropLeft, 7, str)) : (A2($elm$core$String$startsWith, 'https://', str) ? A2( + $elm$url$Url$chompAfterProtocol, + $elm$url$Url$Https, + A2($elm$core$String$dropLeft, 8, str)) : $elm$core$Maybe$Nothing); +}; +var $elm$core$Basics$never = function (_v0) { + never: + while (true) { + var nvr = _v0.a; + var $temp$_v0 = nvr; + _v0 = $temp$_v0; + continue never; + } +}; +var $elm$browser$Browser$element = _Browser_element; +var $author$project$Main$AdjustTimeZone = function (a) { + return {$: 'AdjustTimeZone', a: a}; +}; +var $author$project$Main$LeftSide = {$: 'LeftSide'}; +var $author$project$Main$unixPathSep = '/'; +var $elm$time$Time$Zone = F2( + function (a, b) { + return {$: 'Zone', a: a, b: b}; + }); +var $elm$time$Time$utc = A2($elm$time$Time$Zone, 0, _List_Nil); +var $author$project$Main$defaultModel = {applySourceFilterToDestinationDirectories: false, applySourceFilterToDestinationFiles: false, debug: _List_Nil, destinationDirectoryFilter: '', destinationDirectoryPath: '', destinationFiles: _List_Nil, destinationFilesFilter: '', destinationNavigationHistory: _List_Nil, destinationSubdirectories: _List_Nil, editedDirName: '', editedFile: $elm$core$Maybe$Nothing, editedFileName: '', error: $elm$core$Maybe$Nothing, filesToDelete: _List_Nil, focusedZone: $author$project$Main$LeftSide, history: _List_Nil, isControlPressed: false, isCreatingDirectory: false, isDebugVisible: false, isDestinationLoadingInProgress: true, isShiftPressed: false, isSourceLoadingInProgress: true, isUndoing: false, minSimilarity: 8, pathSeparator: $author$project$Main$unixPathSep, previousFocusedZone: $author$project$Main$LeftSide, referenceFile: $elm$core$Maybe$Nothing, sourceDirectoryPath: '.', sourceFiles: _List_Nil, sourceFilter: '', sourceNavigationHistory: _List_Nil, sourceReplace: '', sourceSearch: '', sourceSubDirectories: _List_Nil, timezone: $elm$time$Time$utc}; +var $elm$json$Json$Encode$null = _Json_encodeNull; +var $author$project$Main$getCurrentDirectoryPath = _Platform_outgoingPort( + 'getCurrentDirectoryPath', + function ($) { + return $elm$json$Json$Encode$null; + }); +var $elm$time$Time$Name = function (a) { + return {$: 'Name', a: a}; +}; +var $elm$time$Time$Offset = function (a) { + return {$: 'Offset', a: a}; +}; +var $elm$time$Time$customZone = $elm$time$Time$Zone; +var $elm$time$Time$here = _Time_here(_Utils_Tuple0); +var $author$project$Main$init = function (_v0) { + return _Utils_Tuple2( + $author$project$Main$defaultModel, + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + A2($elm$core$Task$perform, $author$project$Main$AdjustTimeZone, $elm$time$Time$here), + $author$project$Main$getCurrentDirectoryPath(_Utils_Tuple0) + ]))); +}; +var $author$project$Main$BackendReturnedCreatedDirectory = function (a) { + return {$: 'BackendReturnedCreatedDirectory', a: a}; +}; +var $author$project$Main$BackendReturnedCurrentDirPath = function (a) { + return {$: 'BackendReturnedCurrentDirPath', a: a}; +}; +var $author$project$Main$BackendReturnedDestinationDirectories = function (a) { + return {$: 'BackendReturnedDestinationDirectories', a: a}; +}; +var $author$project$Main$BackendReturnedDestinationDirectoryPath = function (a) { + return {$: 'BackendReturnedDestinationDirectoryPath', a: a}; +}; +var $author$project$Main$BackendReturnedDestinationFiles = function (a) { + return {$: 'BackendReturnedDestinationFiles', a: a}; +}; +var $author$project$Main$BackendReturnedError = function (a) { + return {$: 'BackendReturnedError', a: a}; +}; +var $author$project$Main$BackendReturnedMovedFiles = function (a) { + return {$: 'BackendReturnedMovedFiles', a: a}; +}; +var $author$project$Main$BackendReturnedRemovedFile = {$: 'BackendReturnedRemovedFile'}; +var $author$project$Main$BackendReturnedRenamedFiles = F2( + function (a, b) { + return {$: 'BackendReturnedRenamedFiles', a: a, b: b}; + }); +var $author$project$Main$BackendReturnedSourceDirectoryContent = function (a) { + return {$: 'BackendReturnedSourceDirectoryContent', a: a}; +}; +var $author$project$Main$BackendReturnedSourceDirectoryPath = function (a) { + return {$: 'BackendReturnedSourceDirectoryPath', a: a}; +}; +var $elm$core$Platform$Sub$batch = _Platform_batch; +var $author$project$File$File = F8( + function (isDir, mode, modTime, name, parentPath, satisfiesFilter, size, status) { + return {isDir: isDir, modTime: modTime, mode: mode, name: name, parentPath: parentPath, satisfiesFilter: satisfiesFilter, size: size, status: status}; + }); +var $author$project$File$Unselected = {$: 'Unselected'}; +var $elm$json$Json$Decode$bool = _Json_decodeBool; +var $elm$json$Json$Decode$andThen = _Json_andThen; +var $elm$core$String$concat = function (strings) { + return A2($elm$core$String$join, '', strings); +}; +var $rtfeldman$elm_iso8601_date_strings$DeadEnds$problemToString = function (p) { + switch (p.$) { + case 'Expecting': + var s = p.a; + return 'expecting \'' + (s + '\''); + case 'ExpectingInt': + return 'expecting int'; + case 'ExpectingHex': + return 'expecting hex'; + case 'ExpectingOctal': + return 'expecting octal'; + case 'ExpectingBinary': + return 'expecting binary'; + case 'ExpectingFloat': + return 'expecting float'; + case 'ExpectingNumber': + return 'expecting number'; + case 'ExpectingVariable': + return 'expecting variable'; + case 'ExpectingSymbol': + var s = p.a; + return 'expecting symbol \'' + (s + '\''); + case 'ExpectingKeyword': + var s = p.a; + return 'expecting keyword \'' + (s + '\''); + case 'ExpectingEnd': + return 'expecting end'; + case 'UnexpectedChar': + return 'unexpected char'; + case 'Problem': + var s = p.a; + return 'problem ' + s; + default: + return 'bad repeat'; + } +}; +var $rtfeldman$elm_iso8601_date_strings$DeadEnds$deadEndToString = function (deadend) { + return $rtfeldman$elm_iso8601_date_strings$DeadEnds$problemToString(deadend.problem) + (' at row ' + ($elm$core$String$fromInt(deadend.row) + (', col ' + $elm$core$String$fromInt(deadend.col)))); +}; +var $rtfeldman$elm_iso8601_date_strings$DeadEnds$deadEndsToString = function (deadEnds) { + return $elm$core$String$concat( + A2( + $elm$core$List$intersperse, + '; ', + A2($elm$core$List$map, $rtfeldman$elm_iso8601_date_strings$DeadEnds$deadEndToString, deadEnds))); +}; +var $elm$json$Json$Decode$fail = _Json_fail; +var $elm$parser$Parser$Advanced$Bad = F2( + function (a, b) { + return {$: 'Bad', a: a, b: b}; + }); +var $elm$parser$Parser$Advanced$Good = F3( + function (a, b, c) { + return {$: 'Good', a: a, b: b, c: c}; + }); +var $elm$parser$Parser$Advanced$Parser = function (a) { + return {$: 'Parser', a: a}; +}; +var $elm$parser$Parser$Advanced$andThen = F2( + function (callback, _v0) { + var parseA = _v0.a; + return $elm$parser$Parser$Advanced$Parser( + function (s0) { + var _v1 = parseA(s0); + if (_v1.$ === 'Bad') { + var p = _v1.a; + var x = _v1.b; + return A2($elm$parser$Parser$Advanced$Bad, p, x); + } else { + var p1 = _v1.a; + var a = _v1.b; + var s1 = _v1.c; + var _v2 = callback(a); + var parseB = _v2.a; + var _v3 = parseB(s1); + if (_v3.$ === 'Bad') { + var p2 = _v3.a; + var x = _v3.b; + return A2($elm$parser$Parser$Advanced$Bad, p1 || p2, x); + } else { + var p2 = _v3.a; + var b = _v3.b; + var s2 = _v3.c; + return A3($elm$parser$Parser$Advanced$Good, p1 || p2, b, s2); + } + } + }); + }); +var $elm$parser$Parser$andThen = $elm$parser$Parser$Advanced$andThen; +var $elm$parser$Parser$ExpectingEnd = {$: 'ExpectingEnd'}; +var $elm$parser$Parser$Advanced$AddRight = F2( + function (a, b) { + return {$: 'AddRight', a: a, b: b}; + }); +var $elm$parser$Parser$Advanced$DeadEnd = F4( + function (row, col, problem, contextStack) { + return {col: col, contextStack: contextStack, problem: problem, row: row}; + }); +var $elm$parser$Parser$Advanced$Empty = {$: 'Empty'}; +var $elm$parser$Parser$Advanced$fromState = F2( + function (s, x) { + return A2( + $elm$parser$Parser$Advanced$AddRight, + $elm$parser$Parser$Advanced$Empty, + A4($elm$parser$Parser$Advanced$DeadEnd, s.row, s.col, x, s.context)); + }); +var $elm$parser$Parser$Advanced$end = function (x) { + return $elm$parser$Parser$Advanced$Parser( + function (s) { + return _Utils_eq( + $elm$core$String$length(s.src), + s.offset) ? A3($elm$parser$Parser$Advanced$Good, false, _Utils_Tuple0, s) : A2( + $elm$parser$Parser$Advanced$Bad, + false, + A2($elm$parser$Parser$Advanced$fromState, s, x)); + }); +}; +var $elm$parser$Parser$end = $elm$parser$Parser$Advanced$end($elm$parser$Parser$ExpectingEnd); +var $elm$parser$Parser$Advanced$isSubChar = _Parser_isSubChar; +var $elm$parser$Parser$Advanced$chompWhileHelp = F5( + function (isGood, offset, row, col, s0) { + chompWhileHelp: + while (true) { + var newOffset = A3($elm$parser$Parser$Advanced$isSubChar, isGood, offset, s0.src); + if (_Utils_eq(newOffset, -1)) { + return A3( + $elm$parser$Parser$Advanced$Good, + _Utils_cmp(s0.offset, offset) < 0, + _Utils_Tuple0, + {col: col, context: s0.context, indent: s0.indent, offset: offset, row: row, src: s0.src}); + } else { + if (_Utils_eq(newOffset, -2)) { + var $temp$isGood = isGood, + $temp$offset = offset + 1, + $temp$row = row + 1, + $temp$col = 1, + $temp$s0 = s0; + isGood = $temp$isGood; + offset = $temp$offset; + row = $temp$row; + col = $temp$col; + s0 = $temp$s0; + continue chompWhileHelp; + } else { + var $temp$isGood = isGood, + $temp$offset = newOffset, + $temp$row = row, + $temp$col = col + 1, + $temp$s0 = s0; + isGood = $temp$isGood; + offset = $temp$offset; + row = $temp$row; + col = $temp$col; + s0 = $temp$s0; + continue chompWhileHelp; + } + } + } + }); +var $elm$parser$Parser$Advanced$chompWhile = function (isGood) { + return $elm$parser$Parser$Advanced$Parser( + function (s) { + return A5($elm$parser$Parser$Advanced$chompWhileHelp, isGood, s.offset, s.row, s.col, s); + }); +}; +var $elm$parser$Parser$chompWhile = $elm$parser$Parser$Advanced$chompWhile; +var $elm$parser$Parser$Advanced$mapChompedString = F2( + function (func, _v0) { + var parse = _v0.a; + return $elm$parser$Parser$Advanced$Parser( + function (s0) { + var _v1 = parse(s0); + if (_v1.$ === 'Bad') { + var p = _v1.a; + var x = _v1.b; + return A2($elm$parser$Parser$Advanced$Bad, p, x); + } else { + var p = _v1.a; + var a = _v1.b; + var s1 = _v1.c; + return A3( + $elm$parser$Parser$Advanced$Good, + p, + A2( + func, + A3($elm$core$String$slice, s0.offset, s1.offset, s0.src), + a), + s1); + } + }); + }); +var $elm$parser$Parser$Advanced$getChompedString = function (parser) { + return A2($elm$parser$Parser$Advanced$mapChompedString, $elm$core$Basics$always, parser); +}; +var $elm$parser$Parser$getChompedString = $elm$parser$Parser$Advanced$getChompedString; +var $elm$parser$Parser$Problem = function (a) { + return {$: 'Problem', a: a}; +}; +var $elm$parser$Parser$Advanced$problem = function (x) { + return $elm$parser$Parser$Advanced$Parser( + function (s) { + return A2( + $elm$parser$Parser$Advanced$Bad, + false, + A2($elm$parser$Parser$Advanced$fromState, s, x)); + }); +}; +var $elm$parser$Parser$problem = function (msg) { + return $elm$parser$Parser$Advanced$problem( + $elm$parser$Parser$Problem(msg)); +}; +var $elm$core$Basics$round = _Basics_round; +var $elm$parser$Parser$Advanced$succeed = function (a) { + return $elm$parser$Parser$Advanced$Parser( + function (s) { + return A3($elm$parser$Parser$Advanced$Good, false, a, s); + }); +}; +var $elm$parser$Parser$succeed = $elm$parser$Parser$Advanced$succeed; +var $elm$core$String$toFloat = _String_toFloat; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$fractionsOfASecondInMs = A2( + $elm$parser$Parser$andThen, + function (str) { + if ($elm$core$String$length(str) <= 9) { + var _v0 = $elm$core$String$toFloat('0.' + str); + if (_v0.$ === 'Just') { + var floatVal = _v0.a; + return $elm$parser$Parser$succeed( + $elm$core$Basics$round(floatVal * 1000)); + } else { + return $elm$parser$Parser$problem('Invalid float: \"' + (str + '\"')); + } + } else { + return $elm$parser$Parser$problem( + 'Expected at most 9 digits, but got ' + $elm$core$String$fromInt( + $elm$core$String$length(str))); + } + }, + $elm$parser$Parser$getChompedString( + $elm$parser$Parser$chompWhile($elm$core$Char$isDigit))); +var $elm$time$Time$Posix = function (a) { + return {$: 'Posix', a: a}; +}; +var $elm$time$Time$millisToPosix = $elm$time$Time$Posix; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$fromParts = F6( + function (monthYearDayMs, hour, minute, second, ms, utcOffsetMinutes) { + return $elm$time$Time$millisToPosix((((monthYearDayMs + (((hour * 60) * 60) * 1000)) + (((minute - utcOffsetMinutes) * 60) * 1000)) + (second * 1000)) + ms); + }); +var $elm$parser$Parser$Advanced$map2 = F3( + function (func, _v0, _v1) { + var parseA = _v0.a; + var parseB = _v1.a; + return $elm$parser$Parser$Advanced$Parser( + function (s0) { + var _v2 = parseA(s0); + if (_v2.$ === 'Bad') { + var p = _v2.a; + var x = _v2.b; + return A2($elm$parser$Parser$Advanced$Bad, p, x); + } else { + var p1 = _v2.a; + var a = _v2.b; + var s1 = _v2.c; + var _v3 = parseB(s1); + if (_v3.$ === 'Bad') { + var p2 = _v3.a; + var x = _v3.b; + return A2($elm$parser$Parser$Advanced$Bad, p1 || p2, x); + } else { + var p2 = _v3.a; + var b = _v3.b; + var s2 = _v3.c; + return A3( + $elm$parser$Parser$Advanced$Good, + p1 || p2, + A2(func, a, b), + s2); + } + } + }); + }); +var $elm$parser$Parser$Advanced$ignorer = F2( + function (keepParser, ignoreParser) { + return A3($elm$parser$Parser$Advanced$map2, $elm$core$Basics$always, keepParser, ignoreParser); + }); +var $elm$parser$Parser$ignorer = $elm$parser$Parser$Advanced$ignorer; +var $elm$parser$Parser$Advanced$keeper = F2( + function (parseFunc, parseArg) { + return A3($elm$parser$Parser$Advanced$map2, $elm$core$Basics$apL, parseFunc, parseArg); + }); +var $elm$parser$Parser$keeper = $elm$parser$Parser$Advanced$keeper; +var $elm$parser$Parser$Advanced$Append = F2( + function (a, b) { + return {$: 'Append', a: a, b: b}; + }); +var $elm$parser$Parser$Advanced$oneOfHelp = F3( + function (s0, bag, parsers) { + oneOfHelp: + while (true) { + if (!parsers.b) { + return A2($elm$parser$Parser$Advanced$Bad, false, bag); + } else { + var parse = parsers.a.a; + var remainingParsers = parsers.b; + var _v1 = parse(s0); + if (_v1.$ === 'Good') { + var step = _v1; + return step; + } else { + var step = _v1; + var p = step.a; + var x = step.b; + if (p) { + return step; + } else { + var $temp$s0 = s0, + $temp$bag = A2($elm$parser$Parser$Advanced$Append, bag, x), + $temp$parsers = remainingParsers; + s0 = $temp$s0; + bag = $temp$bag; + parsers = $temp$parsers; + continue oneOfHelp; + } + } + } + } + }); +var $elm$parser$Parser$Advanced$oneOf = function (parsers) { + return $elm$parser$Parser$Advanced$Parser( + function (s) { + return A3($elm$parser$Parser$Advanced$oneOfHelp, s, $elm$parser$Parser$Advanced$Empty, parsers); + }); +}; +var $elm$parser$Parser$oneOf = $elm$parser$Parser$Advanced$oneOf; +var $elm$parser$Parser$Done = function (a) { + return {$: 'Done', a: a}; +}; +var $elm$parser$Parser$Loop = function (a) { + return {$: 'Loop', a: a}; +}; +var $elm$core$String$append = _String_append; +var $elm$parser$Parser$UnexpectedChar = {$: 'UnexpectedChar'}; +var $elm$parser$Parser$Advanced$chompIf = F2( + function (isGood, expecting) { + return $elm$parser$Parser$Advanced$Parser( + function (s) { + var newOffset = A3($elm$parser$Parser$Advanced$isSubChar, isGood, s.offset, s.src); + return _Utils_eq(newOffset, -1) ? A2( + $elm$parser$Parser$Advanced$Bad, + false, + A2($elm$parser$Parser$Advanced$fromState, s, expecting)) : (_Utils_eq(newOffset, -2) ? A3( + $elm$parser$Parser$Advanced$Good, + true, + _Utils_Tuple0, + {col: 1, context: s.context, indent: s.indent, offset: s.offset + 1, row: s.row + 1, src: s.src}) : A3( + $elm$parser$Parser$Advanced$Good, + true, + _Utils_Tuple0, + {col: s.col + 1, context: s.context, indent: s.indent, offset: newOffset, row: s.row, src: s.src})); + }); + }); +var $elm$parser$Parser$chompIf = function (isGood) { + return A2($elm$parser$Parser$Advanced$chompIf, isGood, $elm$parser$Parser$UnexpectedChar); +}; +var $elm$parser$Parser$Advanced$loopHelp = F4( + function (p, state, callback, s0) { + loopHelp: + while (true) { + var _v0 = callback(state); + var parse = _v0.a; + var _v1 = parse(s0); + if (_v1.$ === 'Good') { + var p1 = _v1.a; + var step = _v1.b; + var s1 = _v1.c; + if (step.$ === 'Loop') { + var newState = step.a; + var $temp$p = p || p1, + $temp$state = newState, + $temp$callback = callback, + $temp$s0 = s1; + p = $temp$p; + state = $temp$state; + callback = $temp$callback; + s0 = $temp$s0; + continue loopHelp; + } else { + var result = step.a; + return A3($elm$parser$Parser$Advanced$Good, p || p1, result, s1); + } + } else { + var p1 = _v1.a; + var x = _v1.b; + return A2($elm$parser$Parser$Advanced$Bad, p || p1, x); + } + } + }); +var $elm$parser$Parser$Advanced$loop = F2( + function (state, callback) { + return $elm$parser$Parser$Advanced$Parser( + function (s) { + return A4($elm$parser$Parser$Advanced$loopHelp, false, state, callback, s); + }); + }); +var $elm$parser$Parser$Advanced$map = F2( + function (func, _v0) { + var parse = _v0.a; + return $elm$parser$Parser$Advanced$Parser( + function (s0) { + var _v1 = parse(s0); + if (_v1.$ === 'Good') { + var p = _v1.a; + var a = _v1.b; + var s1 = _v1.c; + return A3( + $elm$parser$Parser$Advanced$Good, + p, + func(a), + s1); + } else { + var p = _v1.a; + var x = _v1.b; + return A2($elm$parser$Parser$Advanced$Bad, p, x); + } + }); + }); +var $elm$parser$Parser$map = $elm$parser$Parser$Advanced$map; +var $elm$parser$Parser$Advanced$Done = function (a) { + return {$: 'Done', a: a}; +}; +var $elm$parser$Parser$Advanced$Loop = function (a) { + return {$: 'Loop', a: a}; +}; +var $elm$parser$Parser$toAdvancedStep = function (step) { + if (step.$ === 'Loop') { + var s = step.a; + return $elm$parser$Parser$Advanced$Loop(s); + } else { + var a = step.a; + return $elm$parser$Parser$Advanced$Done(a); + } +}; +var $elm$parser$Parser$loop = F2( + function (state, callback) { + return A2( + $elm$parser$Parser$Advanced$loop, + state, + function (s) { + return A2( + $elm$parser$Parser$map, + $elm$parser$Parser$toAdvancedStep, + callback(s)); + }); + }); +var $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt = function (quantity) { + var helper = function (str) { + if (_Utils_eq( + $elm$core$String$length(str), + quantity)) { + var _v0 = $elm$core$String$toInt(str); + if (_v0.$ === 'Just') { + var intVal = _v0.a; + return A2( + $elm$parser$Parser$map, + $elm$parser$Parser$Done, + $elm$parser$Parser$succeed(intVal)); + } else { + return $elm$parser$Parser$problem('Invalid integer: \"' + (str + '\"')); + } + } else { + return A2( + $elm$parser$Parser$map, + function (nextChar) { + return $elm$parser$Parser$Loop( + A2($elm$core$String$append, str, nextChar)); + }, + $elm$parser$Parser$getChompedString( + $elm$parser$Parser$chompIf($elm$core$Char$isDigit))); + } + }; + return A2($elm$parser$Parser$loop, '', helper); +}; +var $elm$parser$Parser$ExpectingSymbol = function (a) { + return {$: 'ExpectingSymbol', a: a}; +}; +var $elm$parser$Parser$Advanced$Token = F2( + function (a, b) { + return {$: 'Token', a: a, b: b}; + }); +var $elm$parser$Parser$Advanced$isSubString = _Parser_isSubString; +var $elm$parser$Parser$Advanced$token = function (_v0) { + var str = _v0.a; + var expecting = _v0.b; + var progress = !$elm$core$String$isEmpty(str); + return $elm$parser$Parser$Advanced$Parser( + function (s) { + var _v1 = A5($elm$parser$Parser$Advanced$isSubString, str, s.offset, s.row, s.col, s.src); + var newOffset = _v1.a; + var newRow = _v1.b; + var newCol = _v1.c; + return _Utils_eq(newOffset, -1) ? A2( + $elm$parser$Parser$Advanced$Bad, + false, + A2($elm$parser$Parser$Advanced$fromState, s, expecting)) : A3( + $elm$parser$Parser$Advanced$Good, + progress, + _Utils_Tuple0, + {col: newCol, context: s.context, indent: s.indent, offset: newOffset, row: newRow, src: s.src}); + }); +}; +var $elm$parser$Parser$Advanced$symbol = $elm$parser$Parser$Advanced$token; +var $elm$parser$Parser$symbol = function (str) { + return $elm$parser$Parser$Advanced$symbol( + A2( + $elm$parser$Parser$Advanced$Token, + str, + $elm$parser$Parser$ExpectingSymbol(str))); +}; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$epochYear = 1970; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay = function (day) { + return $elm$parser$Parser$problem( + 'Invalid day: ' + $elm$core$String$fromInt(day)); +}; +var $elm$core$Basics$modBy = _Basics_modBy; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$isLeapYear = function (year) { + return (!A2($elm$core$Basics$modBy, 4, year)) && ((!(!A2($elm$core$Basics$modBy, 100, year))) || (!A2($elm$core$Basics$modBy, 400, year))); +}; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$leapYearsBefore = function (y1) { + var y = y1 - 1; + return (((y / 4) | 0) - ((y / 100) | 0)) + ((y / 400) | 0); +}; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$msPerDay = 86400000; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$msPerYear = 31536000000; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$yearMonthDay = function (_v0) { + var year = _v0.a; + var month = _v0.b; + var dayInMonth = _v0.c; + if (dayInMonth < 0) { + return $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth); + } else { + var succeedWith = function (extraMs) { + var yearMs = $rtfeldman$elm_iso8601_date_strings$Iso8601$msPerYear * (year - $rtfeldman$elm_iso8601_date_strings$Iso8601$epochYear); + var days = ((month < 3) || (!$rtfeldman$elm_iso8601_date_strings$Iso8601$isLeapYear(year))) ? (dayInMonth - 1) : dayInMonth; + var dayMs = $rtfeldman$elm_iso8601_date_strings$Iso8601$msPerDay * (days + ($rtfeldman$elm_iso8601_date_strings$Iso8601$leapYearsBefore(year) - $rtfeldman$elm_iso8601_date_strings$Iso8601$leapYearsBefore($rtfeldman$elm_iso8601_date_strings$Iso8601$epochYear))); + return $elm$parser$Parser$succeed((extraMs + yearMs) + dayMs); + }; + switch (month) { + case 1: + return (dayInMonth > 31) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(0); + case 2: + return ((dayInMonth > 29) || ((dayInMonth === 29) && (!$rtfeldman$elm_iso8601_date_strings$Iso8601$isLeapYear(year)))) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(2678400000); + case 3: + return (dayInMonth > 31) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(5097600000); + case 4: + return (dayInMonth > 30) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(7776000000); + case 5: + return (dayInMonth > 31) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(10368000000); + case 6: + return (dayInMonth > 30) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(13046400000); + case 7: + return (dayInMonth > 31) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(15638400000); + case 8: + return (dayInMonth > 31) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(18316800000); + case 9: + return (dayInMonth > 30) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(20995200000); + case 10: + return (dayInMonth > 31) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(23587200000); + case 11: + return (dayInMonth > 30) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(26265600000); + case 12: + return (dayInMonth > 31) ? $rtfeldman$elm_iso8601_date_strings$Iso8601$invalidDay(dayInMonth) : succeedWith(28857600000); + default: + return $elm$parser$Parser$problem( + 'Invalid month: \"' + ($elm$core$String$fromInt(month) + '\"')); + } + } +}; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$monthYearDayInMs = A2( + $elm$parser$Parser$andThen, + $rtfeldman$elm_iso8601_date_strings$Iso8601$yearMonthDay, + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + $elm$parser$Parser$succeed( + F3( + function (year, month, day) { + return _Utils_Tuple3(year, month, day); + })), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(4)), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed($elm$core$Basics$identity), + $elm$parser$Parser$symbol('-')), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2)), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2) + ]))), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed($elm$core$Basics$identity), + $elm$parser$Parser$symbol('-')), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2)), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2) + ])))); +var $rtfeldman$elm_iso8601_date_strings$Iso8601$utcOffsetInMinutes = function () { + var utcOffsetMinutesFromParts = F3( + function (multiplier, hours, minutes) { + return (multiplier * (hours * 60)) + minutes; + }); + return A2( + $elm$parser$Parser$keeper, + $elm$parser$Parser$succeed($elm$core$Basics$identity), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$map, + function (_v0) { + return 0; + }, + $elm$parser$Parser$symbol('Z')), + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + $elm$parser$Parser$succeed(utcOffsetMinutesFromParts), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$map, + function (_v1) { + return 1; + }, + $elm$parser$Parser$symbol('+')), + A2( + $elm$parser$Parser$map, + function (_v2) { + return -1; + }, + $elm$parser$Parser$symbol('-')) + ]))), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2)), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed($elm$core$Basics$identity), + $elm$parser$Parser$symbol(':')), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2)), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2), + $elm$parser$Parser$succeed(0) + ]))), + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed(0), + $elm$parser$Parser$end) + ]))); +}(); +var $rtfeldman$elm_iso8601_date_strings$Iso8601$iso8601 = A2( + $elm$parser$Parser$andThen, + function (datePart) { + return $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed( + $rtfeldman$elm_iso8601_date_strings$Iso8601$fromParts(datePart)), + $elm$parser$Parser$symbol('T')), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2)), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed($elm$core$Basics$identity), + $elm$parser$Parser$symbol(':')), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2)), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2) + ]))), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed($elm$core$Basics$identity), + $elm$parser$Parser$symbol(':')), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2)), + $rtfeldman$elm_iso8601_date_strings$Iso8601$paddedInt(2), + $elm$parser$Parser$succeed(0) + ]))), + $elm$parser$Parser$oneOf( + _List_fromArray( + [ + A2( + $elm$parser$Parser$keeper, + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed($elm$core$Basics$identity), + $elm$parser$Parser$symbol('.')), + $rtfeldman$elm_iso8601_date_strings$Iso8601$fractionsOfASecondInMs), + $elm$parser$Parser$succeed(0) + ]))), + A2($elm$parser$Parser$ignorer, $rtfeldman$elm_iso8601_date_strings$Iso8601$utcOffsetInMinutes, $elm$parser$Parser$end)), + A2( + $elm$parser$Parser$ignorer, + $elm$parser$Parser$succeed( + A6($rtfeldman$elm_iso8601_date_strings$Iso8601$fromParts, datePart, 0, 0, 0, 0, 0)), + $elm$parser$Parser$end) + ])); + }, + $rtfeldman$elm_iso8601_date_strings$Iso8601$monthYearDayInMs); +var $elm$parser$Parser$DeadEnd = F3( + function (row, col, problem) { + return {col: col, problem: problem, row: row}; + }); +var $elm$parser$Parser$problemToDeadEnd = function (p) { + return A3($elm$parser$Parser$DeadEnd, p.row, p.col, p.problem); +}; +var $elm$parser$Parser$Advanced$bagToList = F2( + function (bag, list) { + bagToList: + while (true) { + switch (bag.$) { + case 'Empty': + return list; + case 'AddRight': + var bag1 = bag.a; + var x = bag.b; + var $temp$bag = bag1, + $temp$list = A2($elm$core$List$cons, x, list); + bag = $temp$bag; + list = $temp$list; + continue bagToList; + default: + var bag1 = bag.a; + var bag2 = bag.b; + var $temp$bag = bag1, + $temp$list = A2($elm$parser$Parser$Advanced$bagToList, bag2, list); + bag = $temp$bag; + list = $temp$list; + continue bagToList; + } + } + }); +var $elm$parser$Parser$Advanced$run = F2( + function (_v0, src) { + var parse = _v0.a; + var _v1 = parse( + {col: 1, context: _List_Nil, indent: 1, offset: 0, row: 1, src: src}); + if (_v1.$ === 'Good') { + var value = _v1.b; + return $elm$core$Result$Ok(value); + } else { + var bag = _v1.b; + return $elm$core$Result$Err( + A2($elm$parser$Parser$Advanced$bagToList, bag, _List_Nil)); + } + }); +var $elm$parser$Parser$run = F2( + function (parser, source) { + var _v0 = A2($elm$parser$Parser$Advanced$run, parser, source); + if (_v0.$ === 'Ok') { + var a = _v0.a; + return $elm$core$Result$Ok(a); + } else { + var problems = _v0.a; + return $elm$core$Result$Err( + A2($elm$core$List$map, $elm$parser$Parser$problemToDeadEnd, problems)); + } + }); +var $rtfeldman$elm_iso8601_date_strings$Iso8601$toTime = function (str) { + return A2($elm$parser$Parser$run, $rtfeldman$elm_iso8601_date_strings$Iso8601$iso8601, str); +}; +var $rtfeldman$elm_iso8601_date_strings$Iso8601$decoder = A2( + $elm$json$Json$Decode$andThen, + function (str) { + var _v0 = $rtfeldman$elm_iso8601_date_strings$Iso8601$toTime(str); + if (_v0.$ === 'Err') { + var deadEnds = _v0.a; + return $elm$json$Json$Decode$fail( + $rtfeldman$elm_iso8601_date_strings$DeadEnds$deadEndsToString(deadEnds)); + } else { + var time = _v0.a; + return $elm$json$Json$Decode$succeed(time); + } + }, + $elm$json$Json$Decode$string); +var $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom = $elm$json$Json$Decode$map2($elm$core$Basics$apR); +var $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$hardcoded = A2($elm$core$Basics$composeR, $elm$json$Json$Decode$succeed, $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom); +var $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required = F3( + function (key, valDecoder, decoder) { + return A2( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$custom, + A2($elm$json$Json$Decode$field, key, valDecoder), + decoder); + }); +var $author$project$File$fileDecoder = A2( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$hardcoded, + $author$project$File$Unselected, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'Size', + $elm$json$Json$Decode$int, + A2( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$hardcoded, + false, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'DirPath', + $elm$json$Json$Decode$string, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'Name', + $elm$json$Json$Decode$string, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'ModTime', + $rtfeldman$elm_iso8601_date_strings$Iso8601$decoder, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'Mode', + $elm$json$Json$Decode$int, + A3( + $NoRedInk$elm_json_decode_pipeline$Json$Decode$Pipeline$required, + 'IsDir', + $elm$json$Json$Decode$bool, + $elm$json$Json$Decode$succeed($author$project$File$File))))))))); +var $author$project$Main$decodeFile = F2( + function (msg, value) { + var decodedFile = A2($elm$json$Json$Decode$decodeValue, $author$project$File$fileDecoder, value); + if (decodedFile.$ === 'Ok') { + var file = decodedFile.a; + return msg(file); + } else { + var error = decodedFile.a; + return $author$project$Main$BackendReturnedError( + $elm$json$Json$Decode$errorToString(error)); + } + }); +var $author$project$Main$decodeFileList = F2( + function (msg, value) { + var decodedFiles = A2( + $elm$json$Json$Decode$decodeValue, + $elm$json$Json$Decode$list($author$project$File$fileDecoder), + value); + if (decodedFiles.$ === 'Ok') { + var fileList = decodedFiles.a; + return msg(fileList); + } else { + var error = decodedFiles.a; + return $author$project$Main$BackendReturnedError( + $elm$json$Json$Decode$errorToString(error)); + } + }); +var $author$project$Main$decodeFileWithPreviousName = F2( + function (msg, value) { + var decodedFile = A2($elm$json$Json$Decode$decodeValue, $author$project$File$fileDecoder, value); + if (decodedFile.$ === 'Ok') { + return msg; + } else { + var error = decodedFile.a; + return $author$project$Main$BackendReturnedError( + $elm$json$Json$Decode$errorToString(error)); + } + }); +var $author$project$Main$decodeRenamingList = F2( + function (msg, value) { + var decodedOriginalPaths = A2( + $elm$json$Json$Decode$decodeValue, + $elm$json$Json$Decode$list( + A2($elm$json$Json$Decode$field, 'PreviousName', $elm$json$Json$Decode$string)), + value); + var decodedFiles = A2( + $elm$json$Json$Decode$decodeValue, + $elm$json$Json$Decode$list($author$project$File$fileDecoder), + value); + var _v0 = _Utils_Tuple2(decodedFiles, decodedOriginalPaths); + if (_v0.a.$ === 'Ok') { + if (_v0.b.$ === 'Ok') { + var fileList = _v0.a.a; + var originalPaths = _v0.b.a; + return A2(msg, fileList, originalPaths); + } else { + var error = _v0.b.a; + return $author$project$Main$BackendReturnedError( + $elm$json$Json$Decode$errorToString(error)); + } + } else { + var error = _v0.a.a; + return $author$project$Main$BackendReturnedError( + $elm$json$Json$Decode$errorToString(error)); + } + }); +var $author$project$Main$fileRemoved = _Platform_incomingPort('fileRemoved', $elm$json$Json$Decode$value); +var $author$project$Main$filesRenamed = _Platform_incomingPort('filesRenamed', $elm$json$Json$Decode$value); +var $author$project$Main$receiveCreatedDirectory = _Platform_incomingPort('receiveCreatedDirectory', $elm$json$Json$Decode$value); +var $author$project$Main$receiveCurrentDirectoryPath = _Platform_incomingPort('receiveCurrentDirectoryPath', $elm$json$Json$Decode$string); +var $author$project$Main$receiveDestinationDirectoryFiles = _Platform_incomingPort('receiveDestinationDirectoryFiles', $elm$json$Json$Decode$value); +var $author$project$Main$receiveError = _Platform_incomingPort('receiveError', $elm$json$Json$Decode$string); +var $author$project$Main$receiveMovedFiles = _Platform_incomingPort('receiveMovedFiles', $elm$json$Json$Decode$value); +var $author$project$Main$receiveSelectedDestinationDirectory = _Platform_incomingPort('receiveSelectedDestinationDirectory', $elm$json$Json$Decode$string); +var $author$project$Main$receiveSelectedSourceDirectory = _Platform_incomingPort('receiveSelectedSourceDirectory', $elm$json$Json$Decode$string); +var $author$project$Main$receiveSourceDirectoryContent = _Platform_incomingPort('receiveSourceDirectoryContent', $elm$json$Json$Decode$value); +var $author$project$Main$receiveSubDirectories = _Platform_incomingPort('receiveSubDirectories', $elm$json$Json$Decode$value); +var $author$project$Main$subscriptions = function (_v0) { + return $elm$core$Platform$Sub$batch( + _List_fromArray( + [ + $author$project$Main$fileRemoved( + $author$project$Main$decodeFileWithPreviousName($author$project$Main$BackendReturnedRemovedFile)), + $author$project$Main$filesRenamed( + $author$project$Main$decodeRenamingList($author$project$Main$BackendReturnedRenamedFiles)), + $author$project$Main$receiveCreatedDirectory( + $author$project$Main$decodeFile($author$project$Main$BackendReturnedCreatedDirectory)), + $author$project$Main$receiveCurrentDirectoryPath($author$project$Main$BackendReturnedCurrentDirPath), + $author$project$Main$receiveSourceDirectoryContent( + $author$project$Main$decodeFileList($author$project$Main$BackendReturnedSourceDirectoryContent)), + $author$project$Main$receiveDestinationDirectoryFiles( + $author$project$Main$decodeFileList($author$project$Main$BackendReturnedDestinationFiles)), + $author$project$Main$receiveError($author$project$Main$BackendReturnedError), + $author$project$Main$receiveMovedFiles( + $author$project$Main$decodeFileList($author$project$Main$BackendReturnedMovedFiles)), + $author$project$Main$receiveSelectedDestinationDirectory($author$project$Main$BackendReturnedDestinationDirectoryPath), + $author$project$Main$receiveSelectedSourceDirectory($author$project$Main$BackendReturnedSourceDirectoryPath), + $author$project$Main$receiveSubDirectories( + $author$project$Main$decodeFileList($author$project$Main$BackendReturnedDestinationDirectories)) + ])); +}; +var $author$project$Main$Destination = {$: 'Destination'}; +var $author$project$File$Edited = {$: 'Edited'}; +var $author$project$Main$ErrorMessage = {$: 'ErrorMessage'}; +var $author$project$Main$Move = {$: 'Move'}; +var $author$project$Main$NoOp = {$: 'NoOp'}; +var $author$project$Main$Rename = {$: 'Rename'}; +var $author$project$Main$RightSide = {$: 'RightSide'}; +var $author$project$File$Selected = {$: 'Selected'}; +var $author$project$File$SelectedForDeletion = {$: 'SelectedForDeletion'}; +var $author$project$Main$Source = {$: 'Source'}; +var $elm$core$List$any = F2( + function (isOkay, list) { + any: + while (true) { + if (!list.b) { + return false; + } else { + var x = list.a; + var xs = list.b; + if (isOkay(x)) { + return true; + } else { + var $temp$isOkay = isOkay, + $temp$list = xs; + isOkay = $temp$isOkay; + list = $temp$list; + continue any; + } + } + } + }); +var $author$project$Main$renameFiles = _Platform_outgoingPort( + 'renameFiles', + $elm$json$Json$Encode$list($elm$core$Basics$identity)); +var $author$project$Main$applyRenaming = F2( + function (model, renamings) { + var encodedRenamings = A2( + $elm$core$List$map, + function (renaming) { + return $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'oldName', + $elm$json$Json$Encode$string( + _Utils_ap( + renaming.file.parentPath, + _Utils_ap(model.pathSeparator, renaming.originalPath)))), + _Utils_Tuple2( + 'newName', + $elm$json$Json$Encode$string( + _Utils_ap( + renaming.file.parentPath, + _Utils_ap(model.pathSeparator, renaming.file.name)))) + ])); + }, + renamings); + return $author$project$Main$renameFiles(encodedRenamings); + }); +var $author$project$Main$changeDestinationDirectory = F2( + function (path, model) { + return _Utils_update( + model, + { + destinationDirectoryPath: path, + destinationNavigationHistory: A2($elm$core$List$cons, model.destinationDirectoryPath, model.destinationNavigationHistory), + isDestinationLoadingInProgress: true, + isSourceLoadingInProgress: true + }); + }); +var $author$project$Main$changeSourceDirectory = F2( + function (path, model) { + return _Utils_update( + model, + { + isSourceLoadingInProgress: true, + sourceDirectoryPath: path, + sourceNavigationHistory: A2($elm$core$List$cons, model.sourceDirectoryPath, model.sourceNavigationHistory) + }); + }); +var $author$project$Main$createDirectory = _Platform_outgoingPort('createDirectory', $elm$json$Json$Encode$string); +var $author$project$Main$createNewDirectory = function (model) { + var dirPath = _Utils_ap( + model.destinationDirectoryPath, + _Utils_ap(model.pathSeparator, model.editedDirName)); + return _Utils_Tuple2( + model, + $author$project$Main$createDirectory(dirPath)); +}; +var $elm$core$List$all = F2( + function (isOkay, list) { + return !A2( + $elm$core$List$any, + A2($elm$core$Basics$composeL, $elm$core$Basics$not, isOkay), + list); + }); +var $elm$core$String$toLower = _String_toLower; +var $author$project$Main$filterByName = F2( + function (filters, file) { + if (file.name === '..') { + return true; + } else { + var lowerCaseFilename = $elm$core$String$toLower(file.name); + return A2( + $elm$core$List$all, + function (word) { + return A2( + $elm$core$String$contains, + $elm$core$String$toLower(word), + lowerCaseFilename); + }, + filters); + } + }); +var $author$project$Main$filterByParentPath = F2( + function (filters, file) { + if (file.name === '..') { + return true; + } else { + var lowerCaseParentPath = $elm$core$String$toLower(file.parentPath); + return A2( + $elm$core$List$all, + function (word) { + return A2( + $elm$core$String$contains, + $elm$core$String$toLower(word), + lowerCaseParentPath); + }, + filters); + } + }); +var $elm$core$String$words = _String_words; +var $author$project$Main$filterDestinationDirectories = function (model) { + var words = $elm$core$String$words(model.destinationDirectoryFilter); + if (!words.b) { + return _Utils_update( + model, + { + destinationSubdirectories: A2( + $elm$core$List$map, + function (f) { + return _Utils_update( + f, + {satisfiesFilter: true}); + }, + model.destinationSubdirectories) + }); + } else { + return _Utils_update( + model, + { + destinationSubdirectories: A2( + $elm$core$List$map, + function (f) { + return _Utils_update( + f, + { + satisfiesFilter: A2($author$project$Main$filterByName, words, f) || A2($author$project$Main$filterByParentPath, words, f) + }); + }, + model.destinationSubdirectories) + }); + } +}; +var $author$project$Main$filterDestinationFiles = function (model) { + var words = $elm$core$String$words(model.destinationFilesFilter); + if (!words.b) { + return _Utils_update( + model, + { + destinationFiles: A2( + $elm$core$List$map, + function (f) { + return _Utils_update( + f, + {satisfiesFilter: true}); + }, + model.destinationFiles) + }); + } else { + return _Utils_update( + model, + { + destinationFiles: A2( + $elm$core$List$map, + function (f) { + return _Utils_update( + f, + { + satisfiesFilter: A2($author$project$Main$filterByName, words, f) + }); + }, + model.destinationFiles) + }); + } +}; +var $author$project$Main$filterSourceFiles = function (model) { + var words = $elm$core$String$words(model.sourceFilter); + if (!words.b) { + return _Utils_update( + model, + { + sourceFiles: A2( + $elm$core$List$map, + function (f) { + return _Utils_update( + f, + {satisfiesFilter: true}); + }, + model.sourceFiles) + }); + } else { + return _Utils_update( + model, + { + sourceFiles: A2( + $elm$core$List$map, + function (f) { + return _Utils_update( + f, + { + satisfiesFilter: A2($author$project$Main$filterByName, words, f) + }); + }, + model.sourceFiles) + }); + } +}; +var $elm$core$Task$onError = _Scheduler_onError; +var $elm$core$Task$attempt = F2( + function (resultToMessage, task) { + return $elm$core$Task$command( + $elm$core$Task$Perform( + A2( + $elm$core$Task$onError, + A2( + $elm$core$Basics$composeL, + A2($elm$core$Basics$composeL, $elm$core$Task$succeed, resultToMessage), + $elm$core$Result$Err), + A2( + $elm$core$Task$andThen, + A2( + $elm$core$Basics$composeL, + A2($elm$core$Basics$composeL, $elm$core$Task$succeed, resultToMessage), + $elm$core$Result$Ok), + task)))); + }); +var $elm$browser$Browser$Dom$focus = _Browser_call('focus'); +var $author$project$Main$focusOn = F2( + function (elementId, msg) { + return A2( + $elm$core$Task$attempt, + function (_v0) { + return msg; + }, + $elm$browser$Browser$Dom$focus(elementId)); + }); +var $author$project$Main$getDestinationDirectoryFiles = _Platform_outgoingPort('getDestinationDirectoryFiles', $elm$json$Json$Encode$string); +var $author$project$Main$getDestinationSubdirectories = _Platform_outgoingPort('getDestinationSubdirectories', $elm$json$Json$Encode$string); +var $author$project$Main$getSourceDirectoryContent = _Platform_outgoingPort('getSourceDirectoryContent', $elm$json$Json$Encode$string); +var $elm$core$List$head = function (list) { + if (list.b) { + var x = list.a; + var xs = list.b; + return $elm$core$Maybe$Just(x); + } else { + return $elm$core$Maybe$Nothing; + } +}; +var $author$project$Main$goBack = F2( + function (model, target) { + if (target.$ === 'Source') { + var previousDir = A2( + $elm$core$Maybe$withDefault, + '', + $elm$core$List$head(model.sourceNavigationHistory)); + if ($elm$core$String$isEmpty(previousDir)) { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + var history = A2($elm$core$List$drop, 1, model.sourceNavigationHistory); + return _Utils_Tuple2( + _Utils_update( + model, + {sourceDirectoryPath: previousDir, sourceNavigationHistory: history}), + $author$project$Main$getSourceDirectoryContent(previousDir)); + } + } else { + var previousDir = A2( + $elm$core$Maybe$withDefault, + '', + $elm$core$List$head(model.destinationNavigationHistory)); + if ($elm$core$String$isEmpty(previousDir)) { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + var history = A2($elm$core$List$drop, 1, model.destinationNavigationHistory); + return _Utils_Tuple2( + _Utils_update( + model, + {destinationDirectoryPath: previousDir, destinationNavigationHistory: history}), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getDestinationSubdirectories(previousDir), + $author$project$Main$getDestinationDirectoryFiles(previousDir) + ]))); + } + } + }); +var $author$project$Main$isFileNotFoundError = F3( + function (model, target, errorMsg) { + var dir = function () { + if (target.$ === 'Source') { + return model.sourceDirectoryPath; + } else { + return model.destinationDirectoryPath; + } + }(); + return _Utils_eq(errorMsg, 'open ' + (dir + ': no such file or directory')); + }); +var $elm$core$Debug$log = _Debug_log; +var $author$project$Pattern$Joker = {$: 'Joker'}; +var $author$project$Pattern$RawString = function (a) { + return {$: 'RawString', a: a}; +}; +var $elm$core$String$replace = F3( + function (before, after, string) { + return A2( + $elm$core$String$join, + after, + A2($elm$core$String$split, before, string)); + }); +var $author$project$Pattern$escapeSpecialChars = function (string) { + return A3( + $elm$core$String$replace, + ')', + '\\)', + A3( + $elm$core$String$replace, + '(', + '\\(', + A3( + $elm$core$String$replace, + ']', + '\\]', + A3( + $elm$core$String$replace, + '[', + '\\[', + A3($elm$core$String$replace, '.', '\\.', string))))); +}; +var $elm$core$List$filter = F2( + function (isGood, list) { + return A3( + $elm$core$List$foldr, + F2( + function (x, xs) { + return isGood(x) ? A2($elm$core$List$cons, x, xs) : xs; + }), + _List_Nil, + list); + }); +var $author$project$Pattern$fromString = function (string) { + return A2( + $elm$core$List$filter, + function (t) { + return !_Utils_eq( + t, + $author$project$Pattern$RawString('')); + }, + A2( + $elm$core$List$intersperse, + $author$project$Pattern$Joker, + A2( + $elm$core$List$map, + $author$project$Pattern$RawString, + A2( + $elm$core$List$map, + $author$project$Pattern$escapeSpecialChars, + A2($elm$core$String$split, '*', string))))); +}; +var $elm$regex$Regex$Match = F4( + function (match, index, number, submatches) { + return {index: index, match: match, number: number, submatches: submatches}; + }); +var $elm$regex$Regex$replace = _Regex_replaceAtMost(_Regex_infinity); +var $elm$regex$Regex$fromStringWith = _Regex_fromStringWith; +var $elm$regex$Regex$fromString = function (string) { + return A2( + $elm$regex$Regex$fromStringWith, + {caseInsensitive: false, multiline: false}, + string); +}; +var $author$project$Pattern$toRegexp = function (pattern) { + return $elm$regex$Regex$fromString( + $elm$core$String$concat( + A2( + $elm$core$List$map, + function (token) { + if (token.$ === 'RawString') { + var string = token.a; + return '(' + (string + ')'); + } else { + return '(.*?)'; + } + }, + pattern))); +}; +var $author$project$Main$replace = F2( + function (model, originalString) { + var maybeRegex = $author$project$Pattern$toRegexp( + $author$project$Pattern$fromString(model.sourceSearch)); + if (maybeRegex.$ === 'Just') { + var regex = maybeRegex.a; + return A3( + $elm$regex$Regex$replace, + regex, + function (_v1) { + return model.sourceReplace; + }, + originalString); + } else { + return originalString; + } + }); +var $author$project$Main$nameReplacement = F2( + function (model, file) { + var newName = A2($author$project$Main$replace, model, file.name); + return (file.satisfiesFilter && (!_Utils_eq(newName, file.name))) ? $elm$core$Maybe$Just( + { + file: _Utils_update( + file, + {name: newName}), + originalPath: file.name + }) : $elm$core$Maybe$Nothing; + }); +var $elm_community$list_extra$List$Extra$last = function (items) { + last: + while (true) { + if (!items.b) { + return $elm$core$Maybe$Nothing; + } else { + if (!items.b.b) { + var x = items.a; + return $elm$core$Maybe$Just(x); + } else { + var rest = items.b; + var $temp$items = rest; + items = $temp$items; + continue last; + } + } + } +}; +var $author$project$Main$parentDir = F2( + function (model, path) { + var index = A2( + $elm$core$Maybe$withDefault, + $elm$core$String$length(path), + $elm_community$list_extra$List$Extra$last( + A2($elm$core$String$indexes, model.pathSeparator, path))); + return A3($elm$core$String$slice, 0, index, path); + }); +var $elm$core$List$partition = F2( + function (pred, list) { + var step = F2( + function (x, _v0) { + var trues = _v0.a; + var falses = _v0.b; + return pred(x) ? _Utils_Tuple2( + A2($elm$core$List$cons, x, trues), + falses) : _Utils_Tuple2( + trues, + A2($elm$core$List$cons, x, falses)); + }); + return A3( + $elm$core$List$foldr, + step, + _Utils_Tuple2(_List_Nil, _List_Nil), + list); + }); +var $author$project$Main$removeFile = _Platform_outgoingPort('removeFile', $elm$core$Basics$identity); +var $author$project$Main$removeSelectedFiles = function (model) { + var commands = A2( + $elm$core$List$map, + function (file) { + return $author$project$Main$removeFile( + $elm$json$Json$Encode$string( + _Utils_ap( + file.parentPath, + _Utils_ap(model.pathSeparator, file.name)))); + }, + model.filesToDelete); + return _Utils_Tuple2( + _Utils_update( + model, + {filesToDelete: _List_Nil, focusedZone: $author$project$Main$LeftSide}), + $elm$core$Platform$Cmd$batch( + A2( + $elm$core$List$cons, + A2($author$project$Main$focusOn, 'container-left', $author$project$Main$NoOp), + commands))); +}; +var $author$project$Main$changeStatusOfDestinationFiles = F3( + function (fromStatus, toStatus, model) { + return _Utils_update( + model, + { + destinationFiles: A2( + $elm$core$List$map, + function (file) { + return _Utils_eq(file.status, fromStatus) ? _Utils_update( + file, + {status: toStatus}) : file; + }, + model.destinationFiles) + }); + }); +var $author$project$Main$changeStatusOfSourceFiles = F3( + function (fromStatus, toStatus, model) { + return $author$project$Main$filterSourceFiles( + _Utils_update( + model, + { + sourceFiles: A2( + $elm$core$List$map, + function (file) { + return (file.satisfiesFilter && _Utils_eq(file.status, fromStatus)) ? _Utils_update( + file, + {status: toStatus}) : file; + }, + model.sourceFiles) + })); + }); +var $author$project$Main$unmarkFilesForDeletion = function (model) { + return A3( + $author$project$Main$changeStatusOfSourceFiles, + $author$project$File$SelectedForDeletion, + $author$project$File$Selected, + A3($author$project$Main$changeStatusOfDestinationFiles, $author$project$File$SelectedForDeletion, $author$project$File$Selected, model)); +}; +var $author$project$Main$processConfirmationShortcuts = F2( + function (model, event) { + var _v0 = _Utils_Tuple3(event.keyCode, event.ctrlKey, event.metaKey); + _v0$2: + while (true) { + if ((!_v0.b) && (!_v0.c)) { + switch (_v0.a.$) { + case 'Escape': + var _v1 = _v0.a; + return _Utils_Tuple2( + $author$project$Main$unmarkFilesForDeletion( + _Utils_update( + model, + {filesToDelete: _List_Nil, focusedZone: $author$project$Main$LeftSide})), + A2($author$project$Main$focusOn, 'container-left', $author$project$Main$NoOp)); + case 'Enter': + var _v2 = _v0.a; + return $author$project$Main$removeSelectedFiles(model); + default: + break _v0$2; + } + } else { + break _v0$2; + } + } + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + }); +var $author$project$Main$changeAllFileStatus = F3( + function (model, target, status) { + if (target.$ === 'Source') { + var updatedFiles = A2( + $elm$core$List$map, + function (f) { + return f.satisfiesFilter ? _Utils_update( + f, + {status: status}) : f; + }, + model.sourceFiles); + return _Utils_Tuple2( + $author$project$Main$filterSourceFiles( + _Utils_update( + model, + {sourceFiles: updatedFiles})), + $elm$core$Platform$Cmd$none); + } else { + var updatedFiles = A2( + $elm$core$List$map, + function (f) { + return _Utils_update( + f, + {status: status}); + }, + model.destinationFiles); + return _Utils_Tuple2( + _Utils_update( + model, + {destinationFiles: updatedFiles}), + $elm$core$Platform$Cmd$none); + } + }); +var $author$project$File$extendSelection = F2( + function (visit, files) { + var initialAccumulator = {isPreviousSelected: false, selectedCount: 0}; + var _v0 = A3( + visit, + F2( + function (acc, file) { + var newAcc = _Utils_update( + acc, + { + isPreviousSelected: _Utils_eq(file.status, $author$project$File$Selected) + }); + return acc.isPreviousSelected ? _Utils_Tuple2( + _Utils_update( + newAcc, + {selectedCount: acc.selectedCount + 1}), + _Utils_update( + file, + {status: $author$project$File$Selected})) : _Utils_Tuple2(newAcc, file); + }), + initialAccumulator, + files); + var finalAccumulator = _v0.a; + var updatedFiles = _v0.b; + var isAtLeastOneFileSelected = finalAccumulator.selectedCount > 0; + return _Utils_Tuple2(isAtLeastOneFileSelected, updatedFiles); + }); +var $elm_community$list_extra$List$Extra$mapAccuml = F3( + function (f, acc0, list) { + var _v0 = A3( + $elm$core$List$foldl, + F2( + function (x, _v1) { + var acc1 = _v1.a; + var ys = _v1.b; + var _v2 = A2(f, acc1, x); + var acc2 = _v2.a; + var y = _v2.b; + return _Utils_Tuple2( + acc2, + A2($elm$core$List$cons, y, ys)); + }), + _Utils_Tuple2(acc0, _List_Nil), + list); + var accFinal = _v0.a; + var generatedList = _v0.b; + return _Utils_Tuple2( + accFinal, + $elm$core$List$reverse(generatedList)); + }); +var $elm$core$List$takeReverse = F3( + function (n, list, kept) { + takeReverse: + while (true) { + if (n <= 0) { + return kept; + } else { + if (!list.b) { + return kept; + } else { + var x = list.a; + var xs = list.b; + var $temp$n = n - 1, + $temp$list = xs, + $temp$kept = A2($elm$core$List$cons, x, kept); + n = $temp$n; + list = $temp$list; + kept = $temp$kept; + continue takeReverse; + } + } + } + }); +var $elm$core$List$takeTailRec = F2( + function (n, list) { + return $elm$core$List$reverse( + A3($elm$core$List$takeReverse, n, list, _List_Nil)); + }); +var $elm$core$List$takeFast = F3( + function (ctr, n, list) { + if (n <= 0) { + return _List_Nil; + } else { + var _v0 = _Utils_Tuple2(n, list); + _v0$1: + while (true) { + _v0$5: + while (true) { + if (!_v0.b.b) { + return list; + } else { + if (_v0.b.b.b) { + switch (_v0.a) { + case 1: + break _v0$1; + case 2: + var _v2 = _v0.b; + var x = _v2.a; + var _v3 = _v2.b; + var y = _v3.a; + return _List_fromArray( + [x, y]); + case 3: + if (_v0.b.b.b.b) { + var _v4 = _v0.b; + var x = _v4.a; + var _v5 = _v4.b; + var y = _v5.a; + var _v6 = _v5.b; + var z = _v6.a; + return _List_fromArray( + [x, y, z]); + } else { + break _v0$5; + } + default: + if (_v0.b.b.b.b && _v0.b.b.b.b.b) { + var _v7 = _v0.b; + var x = _v7.a; + var _v8 = _v7.b; + var y = _v8.a; + var _v9 = _v8.b; + var z = _v9.a; + var _v10 = _v9.b; + var w = _v10.a; + var tl = _v10.b; + return (ctr > 1000) ? A2( + $elm$core$List$cons, + x, + A2( + $elm$core$List$cons, + y, + A2( + $elm$core$List$cons, + z, + A2( + $elm$core$List$cons, + w, + A2($elm$core$List$takeTailRec, n - 4, tl))))) : A2( + $elm$core$List$cons, + x, + A2( + $elm$core$List$cons, + y, + A2( + $elm$core$List$cons, + z, + A2( + $elm$core$List$cons, + w, + A3($elm$core$List$takeFast, ctr + 1, n - 4, tl))))); + } else { + break _v0$5; + } + } + } else { + if (_v0.a === 1) { + break _v0$1; + } else { + break _v0$5; + } + } + } + } + return list; + } + var _v1 = _v0.b; + var x = _v1.a; + return _List_fromArray( + [x]); + } + }); +var $elm$core$List$take = F2( + function (n, list) { + return A3($elm$core$List$takeFast, 0, n, list); + }); +var $elm_community$list_extra$List$Extra$updateAt = F3( + function (index, fn, list) { + if (index < 0) { + return list; + } else { + var tail = A2($elm$core$List$drop, index, list); + if (tail.b) { + var x = tail.a; + var xs = tail.b; + return _Utils_ap( + A2($elm$core$List$take, index, list), + A2( + $elm$core$List$cons, + fn(x), + xs)); + } else { + return list; + } + } + }); +var $author$project$File$selectLast = function (files) { + return A3( + $elm_community$list_extra$List$Extra$updateAt, + $elm$core$List$length(files) - 1, + function (f) { + return _Utils_update( + f, + {status: $author$project$File$Selected}); + }, + files); +}; +var $author$project$File$extendSelectionToNext = function (files) { + var _v0 = A2($author$project$File$extendSelection, $elm_community$list_extra$List$Extra$mapAccuml, files); + var isAtLeastOneFileSelected = _v0.a; + var updatedFiles = _v0.b; + return isAtLeastOneFileSelected ? updatedFiles : $author$project$File$selectLast(updatedFiles); +}; +var $elm_community$list_extra$List$Extra$mapAccumr = F3( + function (f, acc0, list) { + return A3( + $elm$core$List$foldr, + F2( + function (x, _v0) { + var acc1 = _v0.a; + var ys = _v0.b; + var _v1 = A2(f, acc1, x); + var acc2 = _v1.a; + var y = _v1.b; + return _Utils_Tuple2( + acc2, + A2($elm$core$List$cons, y, ys)); + }), + _Utils_Tuple2(acc0, _List_Nil), + list); + }); +var $author$project$File$extendSelectionToPrevious = function (files) { + var _v0 = A2($author$project$File$extendSelection, $elm_community$list_extra$List$Extra$mapAccumr, files); + var isAtLeastOneFileSelected = _v0.a; + var updatedFiles = _v0.b; + return isAtLeastOneFileSelected ? updatedFiles : $author$project$File$selectLast(updatedFiles); +}; +var $elm_community$list_extra$List$Extra$find = F2( + function (predicate, list) { + find: + while (true) { + if (!list.b) { + return $elm$core$Maybe$Nothing; + } else { + var first = list.a; + var rest = list.b; + if (predicate(first)) { + return $elm$core$Maybe$Just(first); + } else { + var $temp$predicate = predicate, + $temp$list = rest; + predicate = $temp$predicate; + list = $temp$list; + continue find; + } + } + } + }); +var $author$project$Main$maxSimilarity = 30; +var $elm$core$Basics$min = F2( + function (x, y) { + return (_Utils_cmp(x, y) < 0) ? x : y; + }); +var $author$project$Main$filterSelectedFiles = function (files) { + return A2( + $elm$core$List$filter, + function (f) { + return f.satisfiesFilter && _Utils_eq(f.status, $author$project$File$Selected); + }, + files); +}; +var $author$project$Main$moveFiles = _Platform_outgoingPort( + 'moveFiles', + function ($) { + var a = $.a; + var b = $.b; + return A2( + $elm$json$Json$Encode$list, + $elm$core$Basics$identity, + _List_fromArray( + [ + $elm$json$Json$Encode$list($elm$json$Json$Encode$string)(a), + $elm$json$Json$Encode$string(b) + ])); + }); +var $author$project$Main$moveSelectedFiles = function (model) { + var _v0 = function () { + var _v1 = model.focusedZone; + if (_v1.$ === 'RightSide') { + return _Utils_Tuple2( + A2( + $elm$core$List$map, + function (file) { + return _Utils_ap( + file.parentPath, + _Utils_ap(model.pathSeparator, file.name)); + }, + A2( + $elm$core$List$filter, + function (f) { + return _Utils_eq(f.status, $author$project$File$Selected); + }, + model.destinationFiles)), + model.sourceDirectoryPath); + } else { + return _Utils_Tuple2( + A2( + $elm$core$List$map, + function (file) { + return _Utils_ap( + file.parentPath, + _Utils_ap(model.pathSeparator, file.name)); + }, + $author$project$Main$filterSelectedFiles(model.sourceFiles)), + model.destinationDirectoryPath); + } + }(); + var filesToMove = _v0.a; + var destination = _v0.b; + return _Utils_Tuple2( + model, + $author$project$Main$moveFiles( + _Utils_Tuple2(filesToMove, destination))); +}; +var $author$project$Main$openFile = _Platform_outgoingPort('openFile', $elm$json$Json$Encode$string); +var $author$project$Main$openSelectedFile = F2( + function (model, target) { + var fileToOpen = function () { + if (target.$ === 'Source') { + return A2( + $elm_community$list_extra$List$Extra$find, + function (f) { + return f.satisfiesFilter && _Utils_eq(f.status, $author$project$File$Selected); + }, + model.sourceFiles); + } else { + return A2( + $elm_community$list_extra$List$Extra$find, + function (f) { + return _Utils_eq(f.status, $author$project$File$Selected); + }, + model.destinationFiles); + } + }(); + if (fileToOpen.$ === 'Just') { + var file = fileToOpen.a; + return _Utils_Tuple2( + model, + $author$project$Main$openFile( + _Utils_ap( + file.parentPath, + _Utils_ap(model.pathSeparator, file.name)))); + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + }); +var $author$project$Main$openSelectedFolder = F2( + function (model, target) { + var folderToOpen = function () { + if (target.$ === 'Source') { + return model.sourceDirectoryPath; + } else { + return model.destinationDirectoryPath; + } + }(); + return _Utils_Tuple2( + model, + $author$project$Main$openFile(folderToOpen)); + }); +var $author$project$Main$Confirmation = {$: 'Confirmation'}; +var $author$project$Main$prepareSelectedFilesForRemoval = function (model) { + var _v0 = model.focusedZone; + switch (_v0.$) { + case 'LeftSide': + return _Utils_Tuple2( + A3( + $author$project$Main$changeStatusOfSourceFiles, + $author$project$File$Selected, + $author$project$File$SelectedForDeletion, + _Utils_update( + model, + { + filesToDelete: $author$project$Main$filterSelectedFiles(model.sourceFiles), + focusedZone: $author$project$Main$Confirmation, + previousFocusedZone: model.focusedZone + })), + A2($author$project$Main$focusOn, 'delete-button', $author$project$Main$NoOp)); + case 'RightSide': + return _Utils_Tuple2( + A3( + $author$project$Main$changeStatusOfDestinationFiles, + $author$project$File$Selected, + $author$project$File$SelectedForDeletion, + _Utils_update( + model, + { + filesToDelete: A2( + $elm$core$List$filter, + function (f) { + return _Utils_eq(f.status, $author$project$File$Selected); + }, + model.destinationFiles), + focusedZone: $author$project$Main$Confirmation, + previousFocusedZone: model.focusedZone + })), + A2($author$project$Main$focusOn, 'delete-button', $author$project$Main$NoOp)); + default: + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } +}; +var $author$project$Main$quit = _Platform_outgoingPort( + 'quit', + function ($) { + return $elm$json$Json$Encode$null; + }); +var $author$project$Main$reload = F2( + function (model, target) { + if (target.$ === 'Source') { + return _Utils_Tuple2( + model, + $author$project$Main$getSourceDirectoryContent(model.sourceDirectoryPath)); + } else { + return _Utils_Tuple2( + model, + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getDestinationSubdirectories(model.destinationDirectoryPath), + $author$project$Main$getDestinationDirectoryFiles(model.destinationDirectoryPath) + ]))); + } + }); +var $elm_community$list_extra$List$Extra$updateIf = F3( + function (predicate, update, list) { + return A2( + $elm$core$List$map, + function (item) { + return predicate(item) ? update(item) : item; + }, + list); + }); +var $author$project$Main$renameSelectedSourceFile = function (model) { + var fileToEdit = A2( + $elm_community$list_extra$List$Extra$find, + function (f) { + return f.satisfiesFilter && _Utils_eq(f.status, $author$project$File$Selected); + }, + model.sourceFiles); + if (fileToEdit.$ === 'Just') { + var file = fileToEdit.a; + var sourceDirectoryFiles = A3( + $elm_community$list_extra$List$Extra$updateIf, + function (f) { + return _Utils_eq(f, file); + }, + function (f) { + return _Utils_update( + f, + {status: $author$project$File$Edited}); + }, + model.sourceFiles); + return _Utils_Tuple2( + _Utils_update( + model, + { + editedFile: $elm$core$Maybe$Just(file), + editedFileName: file.name, + sourceFiles: sourceDirectoryFiles + }), + A2($author$project$Main$focusOn, 'filename-input', $author$project$Main$NoOp)); + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } +}; +var $author$project$File$selectNextOrPrevious = F2( + function (visit, files) { + var initialAccumulator = {isPreviousSelected: false, selectedCount: 0}; + var _v0 = A3( + visit, + F2( + function (acc, file) { + var newAcc = _Utils_update( + acc, + { + isPreviousSelected: _Utils_eq(file.status, $author$project$File$Selected) + }); + return acc.isPreviousSelected ? _Utils_Tuple2( + _Utils_update( + newAcc, + {selectedCount: acc.selectedCount + 1}), + _Utils_update( + file, + {status: $author$project$File$Selected})) : _Utils_Tuple2( + newAcc, + _Utils_update( + file, + {status: $author$project$File$Unselected})); + }), + initialAccumulator, + files); + var finalAccumulator = _v0.a; + var updatedFiles = _v0.b; + var isAtLeastOneFileSelected = finalAccumulator.selectedCount > 0; + return _Utils_Tuple2(isAtLeastOneFileSelected, updatedFiles); + }); +var $author$project$File$selectNext = function (files) { + var _v0 = A2($author$project$File$selectNextOrPrevious, $elm_community$list_extra$List$Extra$mapAccuml, files); + var isAtLeastOneFileSelected = _v0.a; + var updatedFiles = _v0.b; + return isAtLeastOneFileSelected ? updatedFiles : $author$project$File$selectLast(updatedFiles); +}; +var $author$project$File$selectFirst = function (files) { + return A3( + $elm_community$list_extra$List$Extra$updateAt, + 0, + function (f) { + return _Utils_update( + f, + {status: $author$project$File$Selected}); + }, + files); +}; +var $author$project$File$selectPrevious = function (files) { + var _v0 = A2($author$project$File$selectNextOrPrevious, $elm_community$list_extra$List$Extra$mapAccumr, files); + var isAtLeastOneFileSelected = _v0.a; + var updatedFiles = _v0.b; + return isAtLeastOneFileSelected ? updatedFiles : $author$project$File$selectFirst(updatedFiles); +}; +var $author$project$StringComparison$compareChars = F2( + function (_v0, currentLevel) { + var char1 = _v0.a; + var char2 = _v0.b; + return _Utils_eq(char1, char2) ? (currentLevel + 1) : currentLevel; + }); +var $elm$core$String$cons = _String_cons; +var $elm$core$String$fromChar = function (_char) { + return A2($elm$core$String$cons, _char, ''); +}; +var $elm$core$Bitwise$shiftRightBy = _Bitwise_shiftRightBy; +var $elm$core$String$repeatHelp = F3( + function (n, chunk, result) { + return (n <= 0) ? result : A3( + $elm$core$String$repeatHelp, + n >> 1, + _Utils_ap(chunk, chunk), + (!(n & 1)) ? result : _Utils_ap(result, chunk)); + }); +var $elm$core$String$repeat = F2( + function (n, chunk) { + return A3($elm$core$String$repeatHelp, n, chunk, ''); + }); +var $elm$core$String$padRight = F3( + function (n, _char, string) { + return _Utils_ap( + string, + A2( + $elm$core$String$repeat, + n - $elm$core$String$length(string), + $elm$core$String$fromChar(_char))); + }); +var $elm$core$String$foldr = _String_foldr; +var $elm$core$String$toList = function (string) { + return A3($elm$core$String$foldr, $elm$core$List$cons, _List_Nil, string); +}; +var $elm$core$Tuple$pair = F2( + function (a, b) { + return _Utils_Tuple2(a, b); + }); +var $elm_community$list_extra$List$Extra$zip = $elm$core$List$map2($elm$core$Tuple$pair); +var $author$project$StringComparison$isSimilarityLevelGreaterThan = F3( + function (string1, string2, threshold) { + var len2 = $elm$core$String$length(string2); + var len1 = $elm$core$String$length(string1); + var chars2 = $elm$core$String$toList( + A3( + $elm$core$String$padRight, + len1 - len2, + _Utils_chr(' '), + string2)); + var chars1 = $elm$core$String$toList( + A3( + $elm$core$String$padRight, + len2 - len1, + _Utils_chr(' '), + string1)); + var charList = A2($elm_community$list_extra$List$Extra$zip, chars1, chars2); + var similarCharCount = A3($elm$core$List$foldl, $author$project$StringComparison$compareChars, 0, charList); + return _Utils_cmp(similarCharCount, threshold) > -1; + }); +var $author$project$File$selectIfSimilar = F3( + function (referenceFile, minSimilarity, file) { + return (_Utils_eq(file, referenceFile) || A3($author$project$StringComparison$isSimilarityLevelGreaterThan, referenceFile.name, file.name, minSimilarity)) ? _Utils_update( + file, + {status: $author$project$File$Selected}) : _Utils_update( + file, + {status: $author$project$File$Unselected}); + }); +var $author$project$File$selectSimilar = F3( + function (referenceFile, minSimilarity, files) { + return A2( + $elm$core$List$map, + A2($author$project$File$selectIfSimilar, referenceFile, minSimilarity), + files); + }); +var $author$project$Main$selectSimilarFiles = F2( + function (model, target) { + var _v0 = _Utils_Tuple2(model.referenceFile, target); + if (_v0.a.$ === 'Just') { + if (_v0.b.$ === 'Source') { + var file = _v0.a.a; + var _v1 = _v0.b; + return _Utils_Tuple2( + _Utils_update( + model, + { + sourceFiles: A3($author$project$File$selectSimilar, file, model.minSimilarity, model.sourceFiles) + }), + $elm$core$Platform$Cmd$none); + } else { + var file = _v0.a.a; + var _v2 = _v0.b; + return _Utils_Tuple2( + _Utils_update( + model, + { + destinationFiles: A3($author$project$File$selectSimilar, file, model.minSimilarity, model.destinationFiles) + }), + $elm$core$Platform$Cmd$none); + } + } else { + var _v3 = _v0.a; + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + }); +var $author$project$Main$showDirNameEditor = F2( + function (model, target) { + if (target.$ === 'Source') { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + {isCreatingDirectory: true}), + A2($author$project$Main$focusOn, 'dirname-input', $author$project$Main$NoOp)); + } + }); +var $author$project$Main$undoMove = F3( + function (model, cmds, command) { + var source = A2($elm$core$Maybe$withDefault, '', command.destination); + var filesToMove = A2( + $elm$core$List$map, + function (f) { + return _Utils_ap( + source, + _Utils_ap(model.pathSeparator, f.name)); + }, + command.files); + var destination = A2($elm$core$Maybe$withDefault, '', command.source); + return _Utils_Tuple2( + _Utils_update( + model, + {isUndoing: true}), + A2( + $elm$core$List$cons, + $author$project$Main$moveFiles( + _Utils_Tuple2(filesToMove, destination)), + cmds)); + }); +var $author$project$Main$undoRenaming = F3( + function (model, cmds, command) { + var oldName = A2($elm$core$Maybe$withDefault, '', command.destination); + var newName = A2($elm$core$Maybe$withDefault, '', command.source); + var encodedValue = $elm$json$Json$Encode$object( + _List_fromArray( + [ + _Utils_Tuple2( + 'oldName', + $elm$json$Json$Encode$string(oldName)), + _Utils_Tuple2( + 'newName', + $elm$json$Json$Encode$string(newName)) + ])); + return _Utils_Tuple2( + _Utils_update( + model, + {isUndoing: true}), + A2( + $elm$core$List$cons, + $author$project$Main$renameFiles( + _List_fromArray( + [encodedValue])), + cmds)); + }); +var $author$project$Main$undo = function (model) { + var _v0 = $elm$core$List$head(model.history); + if (_v0.$ === 'Just') { + var commands = _v0.a; + var _v1 = A3( + $elm$core$List$foldl, + F2( + function (command, _v2) { + var modelAcc = _v2.a; + var cmdAcc = _v2.b; + var _v3 = command.operation; + if (_v3.$ === 'Move') { + return A3($author$project$Main$undoMove, modelAcc, cmdAcc, command); + } else { + return A3($author$project$Main$undoRenaming, modelAcc, cmdAcc, command); + } + }), + _Utils_Tuple2(model, _List_Nil), + commands); + var updatedModel = _v1.a; + var cmds = _v1.b; + return _Utils_Tuple2( + _Utils_update( + updatedModel, + { + history: A2($elm$core$List$drop, 1, model.history) + }), + $elm$core$Platform$Cmd$batch(cmds)); + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } +}; +var $author$project$Main$processMainShortcuts = F3( + function (model, target, event) { + if (event.ctrlKey || event.metaKey) { + var _v0 = _Utils_Tuple2(event.keyCode, event.shiftKey); + _v0$5: + while (true) { + if (_v0.b) { + if (_v0.a.$ === 'A') { + var _v1 = _v0.a; + return A3($author$project$Main$changeAllFileStatus, model, target, $author$project$File$Unselected); + } else { + break _v0$5; + } + } else { + switch (_v0.a.$) { + case 'A': + var _v2 = _v0.a; + return A3($author$project$Main$changeAllFileStatus, model, target, $author$project$File$Selected); + case 'R': + var _v3 = _v0.a; + return A2($author$project$Main$reload, model, target); + case 'Z': + var _v4 = _v0.a; + return $author$project$Main$undo(model); + case 'Backspace': + var _v5 = _v0.a; + return $author$project$Main$prepareSelectedFilesForRemoval(model); + default: + break _v0$5; + } + } + } + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } else { + if (event.altKey) { + var _v6 = event.keyCode; + if (_v6.$ === 'F4') { + return _Utils_Tuple2( + model, + $author$project$Main$quit(_Utils_Tuple0)); + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + } else { + var _v7 = _Utils_Tuple2(event.keyCode, event.shiftKey); + _v7$19: + while (true) { + switch (_v7.a.$) { + case 'D': + if (!_v7.b) { + var _v8 = _v7.a; + return _Utils_Tuple2( + _Utils_update( + model, + {isDebugVisible: !model.isDebugVisible}), + $elm$core$Platform$Cmd$none); + } else { + break _v7$19; + } + case 'F': + if (!_v7.b) { + var _v9 = _v7.a; + return A2($author$project$Main$openSelectedFolder, model, target); + } else { + break _v7$19; + } + case 'M': + if (!_v7.b) { + var _v10 = _v7.a; + return $author$project$Main$moveSelectedFiles(model); + } else { + break _v7$19; + } + case 'N': + if (!_v7.b) { + var _v11 = _v7.a; + return A2($author$project$Main$showDirNameEditor, model, target); + } else { + break _v7$19; + } + case 'O': + if (!_v7.b) { + var _v12 = _v7.a; + return A2($author$project$Main$openSelectedFile, model, target); + } else { + break _v7$19; + } + case 'R': + if (!_v7.b) { + var _v13 = _v7.a; + return $author$project$Main$renameSelectedSourceFile(model); + } else { + break _v7$19; + } + case 'U': + if (!_v7.b) { + var _v14 = _v7.a; + return $author$project$Main$undo(model); + } else { + break _v7$19; + } + case 'W': + if (!_v7.b) { + var _v15 = _v7.a; + var files = function () { + if (target.$ === 'Source') { + return model.sourceFiles; + } else { + return model.destinationFiles; + } + }(); + var firstSelectedFile = A2( + $elm_community$list_extra$List$Extra$find, + function (f) { + return _Utils_eq(f.status, $author$project$File$Selected); + }, + files); + return A2( + $author$project$Main$selectSimilarFiles, + _Utils_update( + model, + {referenceFile: firstSelectedFile}), + target); + } else { + break _v7$19; + } + case 'Left': + var _v17 = _v7.a; + return A2($author$project$Main$goBack, model, target); + case 'Up': + if (_v7.b) { + var _v18 = _v7.a; + if (target.$ === 'Source') { + return _Utils_Tuple2( + _Utils_update( + model, + { + sourceFiles: $author$project$File$extendSelectionToPrevious(model.sourceFiles) + }), + $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + { + destinationFiles: $author$project$File$extendSelectionToPrevious(model.destinationFiles) + }), + $elm$core$Platform$Cmd$none); + } + } else { + var _v20 = _v7.a; + if (target.$ === 'Source') { + return _Utils_Tuple2( + _Utils_update( + model, + { + sourceFiles: $author$project$File$selectPrevious(model.sourceFiles) + }), + $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + { + destinationFiles: $author$project$File$selectPrevious(model.destinationFiles) + }), + $elm$core$Platform$Cmd$none); + } + } + case 'Down': + if (_v7.b) { + var _v22 = _v7.a; + if (target.$ === 'Source') { + return _Utils_Tuple2( + _Utils_update( + model, + { + sourceFiles: $author$project$File$extendSelectionToNext(model.sourceFiles) + }), + $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + { + destinationFiles: $author$project$File$extendSelectionToNext(model.destinationFiles) + }), + $elm$core$Platform$Cmd$none); + } + } else { + var _v24 = _v7.a; + if (target.$ === 'Source') { + return _Utils_Tuple2( + _Utils_update( + model, + { + sourceFiles: $author$project$File$selectNext(model.sourceFiles) + }), + $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + { + destinationFiles: $author$project$File$selectNext(model.destinationFiles) + }), + $elm$core$Platform$Cmd$none); + } + } + case 'Delete': + if (!_v7.b) { + var _v26 = _v7.a; + return $author$project$Main$prepareSelectedFilesForRemoval(model); + } else { + break _v7$19; + } + case 'Add': + var _v27 = _v7.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + minSimilarity: A2($elm$core$Basics$min, model.minSimilarity + 1, $author$project$Main$maxSimilarity) + }), + $elm$core$Platform$Cmd$none); + case 'Subtract': + var _v28 = _v7.a; + return _Utils_Tuple2( + _Utils_update( + model, + { + minSimilarity: A2($elm$core$Basics$max, model.minSimilarity + 1, 0) + }), + $elm$core$Platform$Cmd$none); + case 'F2': + if (!_v7.b) { + var _v29 = _v7.a; + return $author$project$Main$renameSelectedSourceFile(model); + } else { + break _v7$19; + } + case 'F5': + if (!_v7.b) { + var _v30 = _v7.a; + return A2($author$project$Main$reload, model, target); + } else { + break _v7$19; + } + case 'Unknown': + var _v31 = event.key; + _v31$2: + while (true) { + if (_v31.$ === 'Just') { + switch (_v31.a) { + case '+': + return _Utils_Tuple2( + _Utils_update( + model, + { + minSimilarity: A2($elm$core$Basics$min, model.minSimilarity + 1, $author$project$Main$maxSimilarity) + }), + $elm$core$Platform$Cmd$none); + case '-': + return _Utils_Tuple2( + _Utils_update( + model, + { + minSimilarity: A2($elm$core$Basics$max, model.minSimilarity - 1, 0) + }), + $elm$core$Platform$Cmd$none); + default: + break _v31$2; + } + } else { + break _v31$2; + } + } + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + default: + break _v7$19; + } + } + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + } + }); +var $author$project$Main$restoreFocus = function (model) { + return _Utils_Tuple2( + _Utils_update( + model, + {focusedZone: model.previousFocusedZone}), + A2( + $author$project$Main$focusOn, + function () { + var _v0 = model.previousFocusedZone; + switch (_v0.$) { + case 'Confirmation': + return 'delete-button'; + case 'ErrorMessage': + return 'close-error'; + case 'Filtering': + return 'filtering-left'; + case 'LeftSide': + return 'container-left'; + case 'FileNameEditor': + return 'filename-input'; + case 'DirNameEditor': + return 'dirname-input'; + case 'RightSide': + return 'container-right'; + case 'SimilarityLevel': + return 'similarity-level'; + default: + return 'search-left'; + } + }(), + $author$project$Main$NoOp)); +}; +var $author$project$Main$processKeyboardShortcut = F3( + function (model, target, event) { + var _v0 = model.focusedZone; + switch (_v0.$) { + case 'Confirmation': + return A2($author$project$Main$processConfirmationShortcuts, model, event); + case 'LeftSide': + return A3($author$project$Main$processMainShortcuts, model, target, event); + case 'FileNameEditor': + var _v1 = event.keyCode; + if (_v1.$ === 'Escape') { + var sourceDirectoryFiles = A3( + $elm_community$list_extra$List$Extra$updateIf, + function (f) { + return _Utils_eq(f.status, $author$project$File$Edited); + }, + function (f) { + return _Utils_update( + f, + {status: $author$project$File$Selected}); + }, + model.sourceFiles); + return $author$project$Main$restoreFocus( + _Utils_update( + model, + {editedFile: $elm$core$Maybe$Nothing, editedFileName: '', sourceFiles: sourceDirectoryFiles})); + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + case 'DirNameEditor': + var _v2 = event.keyCode; + if (_v2.$ === 'Escape') { + return $author$project$Main$restoreFocus( + _Utils_update( + model, + {editedDirName: '', isCreatingDirectory: false})); + } else { + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + case 'RightSide': + return A3($author$project$Main$processMainShortcuts, model, target, event); + default: + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + } + }); +var $elm_community$list_extra$List$Extra$findIndexHelp = F3( + function (index, predicate, list) { + findIndexHelp: + while (true) { + if (!list.b) { + return $elm$core$Maybe$Nothing; + } else { + var x = list.a; + var xs = list.b; + if (predicate(x)) { + return $elm$core$Maybe$Just(index); + } else { + var $temp$index = index + 1, + $temp$predicate = predicate, + $temp$list = xs; + index = $temp$index; + predicate = $temp$predicate; + list = $temp$list; + continue findIndexHelp; + } + } + } + }); +var $elm_community$list_extra$List$Extra$findIndex = $elm_community$list_extra$List$Extra$findIndexHelp(0); +var $elm_community$list_extra$List$Extra$elemIndex = function (x) { + return $elm_community$list_extra$List$Extra$findIndex( + $elm$core$Basics$eq(x)); +}; +var $elm_community$list_extra$List$Extra$indexedFoldr = F3( + function (func, acc, list) { + var step = F2( + function (x, _v0) { + var i = _v0.a; + var thisAcc = _v0.b; + return _Utils_Tuple2( + i - 1, + A3(func, i, x, thisAcc)); + }); + return A3( + $elm$core$List$foldr, + step, + _Utils_Tuple2( + $elm$core$List$length(list) - 1, + acc), + list).b; + }); +var $elm_community$list_extra$List$Extra$findIndices = function (predicate) { + var consIndexIf = F3( + function (index, x, acc) { + return predicate(x) ? A2($elm$core$List$cons, index, acc) : acc; + }); + return A2($elm_community$list_extra$List$Extra$indexedFoldr, consIndexIf, _List_Nil); +}; +var $elm$core$List$maximum = function (list) { + if (list.b) { + var x = list.a; + var xs = list.b; + return $elm$core$Maybe$Just( + A3($elm$core$List$foldl, $elm$core$Basics$max, x, xs)); + } else { + return $elm$core$Maybe$Nothing; + } +}; +var $elm$core$List$minimum = function (list) { + if (list.b) { + var x = list.a; + var xs = list.b; + return $elm$core$Maybe$Just( + A3($elm$core$List$foldl, $elm$core$Basics$min, x, xs)); + } else { + return $elm$core$Maybe$Nothing; + } +}; +var $author$project$File$toggleSelectionStatus = function (file) { + var _v0 = file.status; + switch (_v0.$) { + case 'Unselected': + return _Utils_update( + file, + {status: $author$project$File$Selected}); + case 'Edited': + return _Utils_update( + file, + {status: $author$project$File$Selected}); + case 'Selected': + return _Utils_update( + file, + {status: $author$project$File$Unselected}); + default: + return _Utils_update( + file, + {status: $author$project$File$Selected}); + } +}; +var $elm_community$list_extra$List$Extra$updateIfIndex = F3( + function (predicate, update, list) { + return A2( + $elm$core$List$indexedMap, + F2( + function (i, x) { + return predicate(i) ? update(x) : x; + }), + list); + }); +var $author$project$File$withStatus = F2( + function (fileStatus, file) { + return _Utils_update( + file, + {status: fileStatus}); + }); +var $author$project$Main$select = F3( + function (model, files, clickedFile) { + if (model.isShiftPressed) { + var selectedItemsIndices = A2( + $elm_community$list_extra$List$Extra$findIndices, + function (f) { + return _Utils_eq(f.status, $author$project$File$Selected); + }, + files); + var indexOfLastSelectedElement = A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$List$maximum(selectedItemsIndices)); + var indexOfFirstSelectedElement = A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$List$minimum(selectedItemsIndices)); + var indexOfClickedElement = A2( + $elm$core$Maybe$withDefault, + 0, + A2($elm_community$list_extra$List$Extra$elemIndex, clickedFile, files)); + return A3( + $elm_community$list_extra$List$Extra$updateIfIndex, + function (index) { + var isInRangeBetweenFirstSelectedFileAndClickedFile = (_Utils_cmp(indexOfClickedElement, indexOfFirstSelectedElement) > 0) && ((_Utils_cmp(index, indexOfFirstSelectedElement) > -1) && (_Utils_cmp(index, indexOfClickedElement) < 1)); + var isInRangeBetweenClickedFileAndLastSelectedFile = (_Utils_cmp(indexOfClickedElement, indexOfLastSelectedElement) < 0) && ((_Utils_cmp(index, indexOfClickedElement) > -1) && (_Utils_cmp(index, indexOfLastSelectedElement) < 1)); + return isInRangeBetweenFirstSelectedFileAndClickedFile || ((!isInRangeBetweenFirstSelectedFileAndClickedFile) && isInRangeBetweenClickedFileAndLastSelectedFile); + }, + function (f) { + return f.satisfiesFilter ? _Utils_update( + f, + {status: $author$project$File$Selected}) : f; + }, + files); + } else { + return A2( + $elm$core$List$map, + function (f) { + return _Utils_eq(f, clickedFile) ? $author$project$File$toggleSelectionStatus(f) : (model.isControlPressed ? f : A2($author$project$File$withStatus, $author$project$File$Unselected, f)); + }, + files); + } + }); +var $author$project$Main$selectDestinationDirectory = _Platform_outgoingPort('selectDestinationDirectory', $elm$json$Json$Encode$string); +var $author$project$Main$selectSourceDirectory = _Platform_outgoingPort('selectSourceDirectory', $elm$json$Json$Encode$string); +var $elm$core$List$sortBy = _List_sortBy; +var $author$project$Main$sortByName = $elm$core$List$sortBy( + A2( + $elm$core$Basics$composeR, + function ($) { + return $.name; + }, + $elm$core$String$toLower)); +var $elm$core$Debug$toString = _Debug_toString; +var $author$project$Main$windowsPathSep = '\\'; +var $author$project$Main$update = F2( + function (msg, mymodel) { + var model = _Utils_update( + mymodel, + { + debug: A2( + $elm$core$List$take, + 9, + A2( + $elm$core$List$cons, + $elm$core$Debug$toString(msg), + mymodel.debug)) + }); + switch (msg.$) { + case 'AdjustTimeZone': + var newZone = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {timezone: newZone}), + $elm$core$Platform$Cmd$none); + case 'BackendReturnedCreatedDirectory': + var dir = msg.a; + var newDirPath = _Utils_ap( + model.destinationDirectoryPath, + _Utils_ap(model.pathSeparator, dir.name)); + return _Utils_Tuple2( + A2( + $author$project$Main$changeDestinationDirectory, + newDirPath, + _Utils_update( + model, + {editedDirName: '', focusedZone: $author$project$Main$RightSide, isCreatingDirectory: false, previousFocusedZone: model.focusedZone})), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getDestinationSubdirectories(newDirPath), + $author$project$Main$getDestinationDirectoryFiles(newDirPath), + A2($author$project$Main$focusOn, 'container-right', $author$project$Main$NoOp) + ]))); + case 'BackendReturnedCurrentDirPath': + var path = msg.a; + var pathSeparator = A2($elm$core$String$contains, $author$project$Main$windowsPathSep, path) ? $author$project$Main$windowsPathSep : $author$project$Main$unixPathSep; + return _Utils_Tuple2( + _Utils_update( + model, + {destinationDirectoryPath: path, pathSeparator: pathSeparator, sourceDirectoryPath: path}), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getSourceDirectoryContent(path), + $author$project$Main$getDestinationSubdirectories(path), + $author$project$Main$getDestinationDirectoryFiles(path) + ]))); + case 'BackendReturnedDestinationDirectories': + var files = msg.a; + return _Utils_Tuple2( + $author$project$Main$filterDestinationDirectories( + _Utils_update( + model, + { + destinationSubdirectories: $author$project$Main$sortByName(files), + isDestinationLoadingInProgress: false + })), + $elm$core$Platform$Cmd$none); + case 'BackendReturnedDestinationDirectoryPath': + var path = msg.a; + return (path === '') ? _Utils_Tuple2(model, $elm$core$Platform$Cmd$none) : _Utils_Tuple2( + A2($author$project$Main$changeDestinationDirectory, path, model), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getDestinationSubdirectories(path), + $author$project$Main$getDestinationDirectoryFiles(path) + ]))); + case 'BackendReturnedDestinationFiles': + var fileList = msg.a; + return _Utils_Tuple2( + $author$project$Main$filterDestinationFiles( + _Utils_update( + model, + { + destinationFiles: $author$project$Main$sortByName(fileList) + })), + $elm$core$Platform$Cmd$none); + case 'BackendReturnedError': + var errorMsg = msg.a; + var _v1 = A3($author$project$Main$isFileNotFoundError, model, $author$project$Main$Source, errorMsg) ? A2($author$project$Main$goBack, model, $author$project$Main$Source) : (A3($author$project$Main$isFileNotFoundError, model, $author$project$Main$Destination, errorMsg) ? A2($author$project$Main$goBack, model, $author$project$Main$Destination) : _Utils_Tuple2(model, $elm$core$Platform$Cmd$none)); + var updatedModel = _v1.a; + var cmd = _v1.b; + return _Utils_Tuple2( + _Utils_update( + updatedModel, + { + error: $elm$core$Maybe$Just(errorMsg), + focusedZone: $author$project$Main$ErrorMessage, + previousFocusedZone: model.focusedZone + }), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + A2($author$project$Main$focusOn, 'close-error', $author$project$Main$NoOp), + cmd + ]))); + case 'BackendReturnedMovedFiles': + var files = msg.a; + return _Utils_Tuple2( + function () { + if (model.isUndoing) { + return _Utils_update( + model, + {isUndoing: false}); + } else { + var firstMovedFile = $elm$core$List$head(files); + var destination = function () { + if (firstMovedFile.$ === 'Just') { + var file = firstMovedFile.a; + return file.parentPath; + } else { + return ''; + } + }(); + var source = _Utils_eq(destination, model.destinationDirectoryPath) ? model.sourceDirectoryPath : model.destinationDirectoryPath; + return _Utils_update( + model, + { + history: A2( + $elm$core$List$cons, + _List_fromArray( + [ + { + destination: $elm$core$Maybe$Just(destination), + files: files, + operation: $author$project$Main$Move, + source: $elm$core$Maybe$Just(source) + } + ]), + model.history) + }); + } + }(), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getSourceDirectoryContent(model.sourceDirectoryPath), + $author$project$Main$getDestinationDirectoryFiles(model.destinationDirectoryPath) + ]))); + case 'BackendReturnedRemovedFile': + return _Utils_Tuple2( + model, + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getSourceDirectoryContent(model.sourceDirectoryPath), + $author$project$Main$getDestinationDirectoryFiles(model.destinationDirectoryPath) + ]))); + case 'BackendReturnedRenamedFiles': + var files = msg.a; + var originalPaths = msg.b; + return _Utils_Tuple2( + function () { + if (model.isUndoing) { + return _Utils_update( + model, + {isUndoing: false}); + } else { + var commands = A3( + $elm$core$List$map2, + F2( + function (file, originalPath) { + var newFile = _Utils_update( + file, + {status: $author$project$File$Selected}); + return { + destination: $elm$core$Maybe$Just( + _Utils_ap( + newFile.parentPath, + _Utils_ap(model.pathSeparator, newFile.name))), + files: _List_fromArray( + [newFile]), + operation: $author$project$Main$Rename, + source: $elm$core$Maybe$Just(originalPath) + }; + }), + files, + originalPaths); + return _Utils_update( + model, + { + editedFile: $elm$core$Maybe$Nothing, + editedFileName: '', + focusedZone: $author$project$Main$LeftSide, + history: A2($elm$core$List$cons, commands, model.history), + previousFocusedZone: model.focusedZone, + sourceFiles: A2( + $elm$core$List$map, + function (f) { + return _Utils_eq(f.status, $author$project$File$Edited) ? _Utils_update( + f, + {status: $author$project$File$Selected}) : f; + }, + model.sourceFiles) + }); + } + }(), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getSourceDirectoryContent(model.sourceDirectoryPath), + A2($author$project$Main$focusOn, 'container-left', $author$project$Main$NoOp) + ]))); + case 'BackendReturnedSourceDirectoryContent': + var directoryContent = msg.a; + var _v3 = A2( + $elm$core$List$partition, + function ($) { + return $.isDir; + }, + directoryContent); + var dirList = _v3.a; + var fileList = _v3.b; + return _Utils_Tuple2( + $author$project$Main$filterSourceFiles( + _Utils_update( + model, + { + isSourceLoadingInProgress: false, + sourceFiles: $author$project$Main$sortByName(fileList), + sourceSubDirectories: $author$project$Main$sortByName(dirList) + })), + $elm$core$Platform$Cmd$none); + case 'BackendReturnedSourceDirectoryPath': + var path = msg.a; + return (path === '') ? _Utils_Tuple2(model, $elm$core$Platform$Cmd$none) : _Utils_Tuple2( + A2($author$project$Main$changeSourceDirectory, path, model), + $author$project$Main$getSourceDirectoryContent(path)); + case 'NoOp': + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + case 'UserChangedDestinationDirectoryFilter': + var filteringString = msg.a; + return _Utils_Tuple2( + $author$project$Main$filterDestinationDirectories( + _Utils_update( + model, + {destinationDirectoryFilter: filteringString})), + $elm$core$Platform$Cmd$none); + case 'UserChangedDestinationFilesFilter': + var filteringString = msg.a; + return _Utils_Tuple2( + $author$project$Main$filterDestinationFiles( + _Utils_update( + model, + {destinationFilesFilter: filteringString})), + $elm$core$Platform$Cmd$none); + case 'UserChangedSourceFilter': + var filteringString = msg.a; + return _Utils_Tuple2( + $author$project$Main$filterSourceFiles( + _Utils_update( + model, + {sourceFilter: filteringString})), + $elm$core$Platform$Cmd$none); + case 'UserChangedSourceReplace': + var replaceString = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {sourceReplace: replaceString}), + $elm$core$Platform$Cmd$none); + case 'UserChangedSourceSearch': + var searchString = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {sourceSearch: searchString}), + $elm$core$Platform$Cmd$none); + case 'UserClickedCancel': + var unselectForDeletion = function (file) { + return _Utils_eq(file.status, $author$project$File$SelectedForDeletion) ? _Utils_update( + file, + {status: $author$project$File$Selected}) : file; + }; + return _Utils_Tuple2( + _Utils_update( + model, + { + destinationFiles: A2($elm$core$List$map, unselectForDeletion, model.destinationFiles), + filesToDelete: _List_Nil, + focusedZone: $author$project$Main$LeftSide, + previousFocusedZone: model.focusedZone, + sourceFiles: A2($elm$core$List$map, unselectForDeletion, model.sourceFiles) + }), + A2($author$project$Main$focusOn, 'container-left', $author$project$Main$NoOp)); + case 'UserClickedCopyFilterButton': + return _Utils_Tuple2( + $author$project$Main$filterDestinationDirectories( + $author$project$Main$filterDestinationFiles( + _Utils_update( + model, + {destinationDirectoryFilter: model.sourceFilter, destinationFilesFilter: model.sourceFilter}))), + $elm$core$Platform$Cmd$none); + case 'UserClickedClearSourceFilter': + return _Utils_Tuple2( + $author$project$Main$filterSourceFiles( + _Utils_update( + model, + {sourceFilter: ''})), + $elm$core$Platform$Cmd$none); + case 'UserClickedClearDestinationDirectoryFilter': + return _Utils_Tuple2( + $author$project$Main$filterDestinationDirectories( + _Utils_update( + model, + {destinationDirectoryFilter: ''})), + $elm$core$Platform$Cmd$none); + case 'UserClickedClearDestinationFilesFilter': + return _Utils_Tuple2( + $author$project$Main$filterDestinationFiles( + _Utils_update( + model, + {destinationFilesFilter: ''})), + $elm$core$Platform$Cmd$none); + case 'UserClickedCloseError': + return $author$project$Main$restoreFocus( + _Utils_update( + model, + {error: $elm$core$Maybe$Nothing})); + case 'UserClickedDelete': + return $author$project$Main$removeSelectedFiles(model); + case 'UserClickedDestinationDirectory': + var isAbsolute = msg.a; + var file = msg.b; + var newDestinationPath = function () { + var _v4 = _Utils_Tuple2( + A2($elm$core$Debug$log, 'isAbsolute', isAbsolute), + A2($elm$core$Debug$log, 'file.name', file.name)); + if (_v4.a) { + return _Utils_eq(file.parentPath, $author$project$Main$unixPathSep) ? _Utils_ap(model.pathSeparator, file.name) : _Utils_ap( + file.parentPath, + _Utils_ap(model.pathSeparator, file.name)); + } else { + if (_v4.b === '..') { + return A2($author$project$Main$parentDir, model, model.destinationDirectoryPath); + } else { + return _Utils_ap( + model.destinationDirectoryPath, + _Utils_ap(model.pathSeparator, file.name)); + } + } + }(); + return _Utils_Tuple2( + A2($author$project$Main$changeDestinationDirectory, newDestinationPath, model), + $elm$core$Platform$Cmd$batch( + _List_fromArray( + [ + $author$project$Main$getDestinationDirectoryFiles(newDestinationPath), + $author$project$Main$getDestinationSubdirectories(newDestinationPath) + ]))); + case 'UserClickedDestinationDirectoryButton': + return _Utils_Tuple2( + model, + $author$project$Main$selectDestinationDirectory(model.destinationDirectoryPath)); + case 'UserClickedDestinationFile': + var file = msg.a; + var updatedDestinationFiles = A3($author$project$Main$select, model, model.destinationFiles, file); + return _Utils_Tuple2( + _Utils_update( + model, + {destinationFiles: updatedDestinationFiles}), + $elm$core$Platform$Cmd$none); + case 'UserClickedReload': + var target = msg.a; + return A2($author$project$Main$reload, model, target); + case 'UserClickedReplaceButton': + var renamings = A2( + $elm$core$List$filterMap, + $author$project$Main$nameReplacement(model), + model.sourceFiles); + return _Utils_Tuple2( + _Utils_update( + model, + {sourceReplace: ''}), + A2($author$project$Main$applyRenaming, model, renamings)); + case 'UserClickedSourceDirectory': + var isAbsolute = msg.a; + var file = msg.b; + var newSourcePath = function () { + var _v5 = _Utils_Tuple2(isAbsolute, file.name); + if (_v5.a) { + return _Utils_eq(file.parentPath, $author$project$Main$unixPathSep) ? _Utils_ap(model.pathSeparator, file.name) : _Utils_ap( + file.parentPath, + _Utils_ap(model.pathSeparator, file.name)); + } else { + if (_v5.b === '..') { + return A2($author$project$Main$parentDir, model, model.sourceDirectoryPath); + } else { + return _Utils_ap( + model.sourceDirectoryPath, + _Utils_ap(model.pathSeparator, file.name)); + } + } + }(); + return _Utils_Tuple2( + A2($author$project$Main$changeSourceDirectory, newSourcePath, model), + $author$project$Main$getSourceDirectoryContent(newSourcePath)); + case 'UserClickedSourceDirectoryButton': + return _Utils_Tuple2( + model, + $author$project$Main$selectSourceDirectory(model.sourceDirectoryPath)); + case 'UserClickedSourceFile': + var file = msg.a; + var updatedSourceFiles = A3($author$project$Main$select, model, model.sourceFiles, file); + return _Utils_Tuple2( + $author$project$Main$filterSourceFiles( + _Utils_update( + model, + {focusedZone: $author$project$Main$LeftSide, previousFocusedZone: model.focusedZone, sourceFiles: updatedSourceFiles})), + A2($author$project$Main$focusOn, 'container-left', $author$project$Main$NoOp)); + case 'UserChangedFocusedZone': + var focus = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {focusedZone: focus, previousFocusedZone: model.focusedZone}), + $elm$core$Platform$Cmd$none); + case 'UserModifiedFileName': + var newName = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {editedFileName: newName}), + $elm$core$Platform$Cmd$none); + case 'UserModifiedDirName': + var newName = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {editedDirName: newName}), + $elm$core$Platform$Cmd$none); + case 'UserPressedKey': + var target = msg.a; + var event = msg.b; + return model.isUndoing ? _Utils_Tuple2(model, $elm$core$Platform$Cmd$none) : A3($author$project$Main$processKeyboardShortcut, model, target, event); + case 'UserPressedOrReleasedKey': + var keyboardEvent = msg.a; + return _Utils_Tuple2( + _Utils_update( + model, + {isControlPressed: keyboardEvent.ctrlKey || keyboardEvent.metaKey, isShiftPressed: keyboardEvent.shiftKey}), + $elm$core$Platform$Cmd$none); + case 'UserSubmittedDirName': + return (model.isCreatingDirectory && (model.editedDirName !== '')) ? $author$project$Main$createNewDirectory(model) : _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + case 'UserSubmittedFilename': + var isNameEmpty = $elm$core$String$isEmpty(model.editedFileName); + var isConflicting = A2( + $elm$core$List$any, + function (f) { + return _Utils_eq(f.name, model.editedFileName); + }, + model.sourceFiles); + var _v6 = _Utils_Tuple3(model.editedFile, isConflicting, isNameEmpty); + _v6$2: + while (true) { + if (_v6.a.$ === 'Just') { + if (_v6.b) { + if (!_v6.c) { + return _Utils_Tuple2( + _Utils_update( + model, + { + error: $elm$core$Maybe$Just('A file with the name ' + (model.editedFileName + ' already exists in the source directory')), + focusedZone: $author$project$Main$ErrorMessage + }), + A2($author$project$Main$focusOn, 'close-error', $author$project$Main$NoOp)); + } else { + break _v6$2; + } + } else { + if (!_v6.c) { + var file = _v6.a.a; + var renaming = { + file: _Utils_update( + file, + {name: model.editedFileName}), + originalPath: file.name + }; + return _Utils_Tuple2( + _Utils_update( + model, + {error: $elm$core$Maybe$Nothing}), + A2( + $author$project$Main$applyRenaming, + model, + _List_fromArray( + [renaming]))); + } else { + break _v6$2; + } + } + } else { + break _v6$2; + } + } + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); + default: + var maxDistance = msg.a; + return A2( + $author$project$Main$selectSimilarFiles, + _Utils_update( + model, + { + minSimilarity: $elm$core$Basics$round(maxDistance) + }), + $author$project$Main$Source); + } + }); +var $author$project$Main$UserPressedOrReleasedKey = function (a) { + return {$: 'UserPressedOrReleasedKey', a: a}; +}; +var $Gizra$elm_keyboard_event$Keyboard$Event$KeyboardEvent = F7( + function (altKey, ctrlKey, key, keyCode, metaKey, repeat, shiftKey) { + return {altKey: altKey, ctrlKey: ctrlKey, key: key, keyCode: keyCode, metaKey: metaKey, repeat: repeat, shiftKey: shiftKey}; + }); +var $elm$json$Json$Decode$oneOf = _Json_oneOf; +var $elm$json$Json$Decode$maybe = function (decoder) { + return $elm$json$Json$Decode$oneOf( + _List_fromArray( + [ + A2($elm$json$Json$Decode$map, $elm$core$Maybe$Just, decoder), + $elm$json$Json$Decode$succeed($elm$core$Maybe$Nothing) + ])); +}; +var $Gizra$elm_keyboard_event$Keyboard$Event$decodeKey = $elm$json$Json$Decode$maybe( + A2( + $elm$json$Json$Decode$andThen, + function (key) { + return $elm$core$String$isEmpty(key) ? $elm$json$Json$Decode$fail('empty key') : $elm$json$Json$Decode$succeed(key); + }, + A2($elm$json$Json$Decode$field, 'key', $elm$json$Json$Decode$string))); +var $Gizra$elm_keyboard_event$Keyboard$Event$decodeNonZero = A2( + $elm$json$Json$Decode$andThen, + function (code) { + return (!code) ? $elm$json$Json$Decode$fail('code was zero') : $elm$json$Json$Decode$succeed(code); + }, + $elm$json$Json$Decode$int); +var $Gizra$elm_keyboard_event$Keyboard$Event$decodeKeyCode = $elm$json$Json$Decode$oneOf( + _List_fromArray( + [ + A2($elm$json$Json$Decode$field, 'keyCode', $Gizra$elm_keyboard_event$Keyboard$Event$decodeNonZero), + A2($elm$json$Json$Decode$field, 'which', $Gizra$elm_keyboard_event$Keyboard$Event$decodeNonZero), + A2($elm$json$Json$Decode$field, 'charCode', $Gizra$elm_keyboard_event$Keyboard$Event$decodeNonZero), + $elm$json$Json$Decode$succeed(0) + ])); +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$A = {$: 'A'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Add = {$: 'Add'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Alt = {$: 'Alt'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Ambiguous = function (a) { + return {$: 'Ambiguous', a: a}; +}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$B = {$: 'B'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Backspace = {$: 'Backspace'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$C = {$: 'C'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$CapsLock = {$: 'CapsLock'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$ChromeSearch = {$: 'ChromeSearch'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Command = {$: 'Command'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Ctrl = function (a) { + return {$: 'Ctrl', a: a}; +}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$D = {$: 'D'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Decimal = {$: 'Decimal'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Delete = {$: 'Delete'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Divide = {$: 'Divide'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Down = {$: 'Down'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$E = {$: 'E'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Eight = {$: 'Eight'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$End = {$: 'End'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Enter = {$: 'Enter'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Escape = {$: 'Escape'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F = {$: 'F'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F1 = {$: 'F1'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F10 = {$: 'F10'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F11 = {$: 'F11'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F12 = {$: 'F12'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F2 = {$: 'F2'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F3 = {$: 'F3'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F4 = {$: 'F4'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F5 = {$: 'F5'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F6 = {$: 'F6'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F7 = {$: 'F7'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F8 = {$: 'F8'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$F9 = {$: 'F9'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Five = {$: 'Five'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Four = {$: 'Four'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$G = {$: 'G'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$H = {$: 'H'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Home = {$: 'Home'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$I = {$: 'I'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Insert = {$: 'Insert'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$J = {$: 'J'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$K = {$: 'K'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$L = {$: 'L'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Left = {$: 'Left'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$M = {$: 'M'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Multiply = {$: 'Multiply'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$N = {$: 'N'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Nine = {$: 'Nine'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumLock = {$: 'NumLock'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadEight = {$: 'NumpadEight'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadFive = {$: 'NumpadFive'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadFour = {$: 'NumpadFour'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadNine = {$: 'NumpadNine'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadOne = {$: 'NumpadOne'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadSeven = {$: 'NumpadSeven'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadSix = {$: 'NumpadSix'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadThree = {$: 'NumpadThree'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadTwo = {$: 'NumpadTwo'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadZero = {$: 'NumpadZero'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$O = {$: 'O'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$One = {$: 'One'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$P = {$: 'P'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$PageDown = {$: 'PageDown'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$PageUp = {$: 'PageUp'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$PauseBreak = {$: 'PauseBreak'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$PrintScreen = {$: 'PrintScreen'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Q = {$: 'Q'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$R = {$: 'R'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Right = {$: 'Right'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$S = {$: 'S'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$ScrollLock = {$: 'ScrollLock'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Seven = {$: 'Seven'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Shift = function (a) { + return {$: 'Shift', a: a}; +}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Six = {$: 'Six'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Spacebar = {$: 'Spacebar'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Subtract = {$: 'Subtract'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$T = {$: 'T'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Tab = {$: 'Tab'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Three = {$: 'Three'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Two = {$: 'Two'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$U = {$: 'U'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Unknown = function (a) { + return {$: 'Unknown', a: a}; +}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Up = {$: 'Up'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$V = {$: 'V'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$W = {$: 'W'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Windows = {$: 'Windows'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$X = {$: 'X'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Y = {$: 'Y'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Z = {$: 'Z'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$Zero = {$: 'Zero'}; +var $SwiftsNamesake$proper_keyboard$Keyboard$Key$fromCode = function (keyCode) { + switch (keyCode) { + case 8: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Backspace; + case 9: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Tab; + case 13: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Enter; + case 16: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Shift($elm$core$Maybe$Nothing); + case 17: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Ctrl($elm$core$Maybe$Nothing); + case 18: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Alt; + case 19: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$PauseBreak; + case 20: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$CapsLock; + case 27: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Escape; + case 32: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Spacebar; + case 33: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$PageUp; + case 34: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$PageDown; + case 35: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$End; + case 36: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Home; + case 37: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Left; + case 38: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Up; + case 39: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Right; + case 40: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Down; + case 44: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$PrintScreen; + case 45: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Insert; + case 46: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Delete; + case 48: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Zero; + case 49: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$One; + case 50: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Two; + case 51: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Three; + case 52: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Four; + case 53: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Five; + case 54: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Six; + case 55: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Seven; + case 56: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Eight; + case 57: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Nine; + case 65: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$A; + case 66: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$B; + case 67: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$C; + case 68: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$D; + case 69: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$E; + case 70: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F; + case 71: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$G; + case 72: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$H; + case 73: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$I; + case 74: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$J; + case 75: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$K; + case 76: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$L; + case 77: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$M; + case 78: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$N; + case 79: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$O; + case 80: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$P; + case 81: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Q; + case 82: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$R; + case 83: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$S; + case 84: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$T; + case 85: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$U; + case 86: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$V; + case 87: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$W; + case 88: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$X; + case 89: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Y; + case 90: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Z; + case 91: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Ambiguous( + _List_fromArray( + [$SwiftsNamesake$proper_keyboard$Keyboard$Key$Windows, $SwiftsNamesake$proper_keyboard$Keyboard$Key$Command, $SwiftsNamesake$proper_keyboard$Keyboard$Key$ChromeSearch])); + case 96: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadZero; + case 97: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadOne; + case 98: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadTwo; + case 99: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadThree; + case 100: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadFour; + case 101: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadFive; + case 102: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadSix; + case 103: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadSeven; + case 104: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadEight; + case 105: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumpadNine; + case 106: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Multiply; + case 107: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Add; + case 109: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Subtract; + case 110: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Decimal; + case 111: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Divide; + case 112: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F1; + case 113: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F2; + case 114: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F3; + case 115: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F4; + case 116: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F5; + case 117: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F6; + case 118: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F7; + case 119: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F8; + case 120: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F9; + case 121: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F10; + case 122: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F11; + case 123: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$F12; + case 144: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$NumLock; + case 145: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$ScrollLock; + default: + return $SwiftsNamesake$proper_keyboard$Keyboard$Key$Unknown(keyCode); + } +}; +var $elm$json$Json$Decode$map7 = _Json_map7; +var $Gizra$elm_keyboard_event$Keyboard$Event$decodeKeyboardEvent = A8( + $elm$json$Json$Decode$map7, + $Gizra$elm_keyboard_event$Keyboard$Event$KeyboardEvent, + A2($elm$json$Json$Decode$field, 'altKey', $elm$json$Json$Decode$bool), + A2($elm$json$Json$Decode$field, 'ctrlKey', $elm$json$Json$Decode$bool), + $Gizra$elm_keyboard_event$Keyboard$Event$decodeKey, + A2($elm$json$Json$Decode$map, $SwiftsNamesake$proper_keyboard$Keyboard$Key$fromCode, $Gizra$elm_keyboard_event$Keyboard$Event$decodeKeyCode), + A2($elm$json$Json$Decode$field, 'metaKey', $elm$json$Json$Decode$bool), + A2($elm$json$Json$Decode$field, 'repeat', $elm$json$Json$Decode$bool), + A2($elm$json$Json$Decode$field, 'shiftKey', $elm$json$Json$Decode$bool)); +var $author$project$Main$keyDecoder = A2( + $elm$json$Json$Decode$map, + function (key) { + return $author$project$Main$UserPressedOrReleasedKey(key); + }, + $Gizra$elm_keyboard_event$Keyboard$Event$decodeKeyboardEvent); +var $author$project$Main$UserChangedFocusedZone = function (a) { + return {$: 'UserChangedFocusedZone', a: a}; +}; +var $author$project$Main$UserClickedCancel = {$: 'UserClickedCancel'}; +var $author$project$Main$UserClickedCloseError = {$: 'UserClickedCloseError'}; +var $author$project$Main$UserClickedDelete = {$: 'UserClickedDelete'}; +var $elm$html$Html$footer = _VirtualDom_node('footer'); +var $author$project$Main$UserPressedKey = F2( + function (a, b) { + return {$: 'UserPressedKey', a: a, b: b}; + }); +var $author$project$Main$keyDecoderPreventingDefault = function (target) { + return A2( + $elm$json$Json$Decode$map, + function (key) { + return _Utils_Tuple2( + A2($author$project$Main$UserPressedKey, target, key), + true); + }, + $Gizra$elm_keyboard_event$Keyboard$Event$decodeKeyboardEvent); +}; +var $elm$html$Html$Events$onFocus = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'focus', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$virtual_dom$VirtualDom$MayPreventDefault = function (a) { + return {$: 'MayPreventDefault', a: a}; +}; +var $elm$html$Html$Events$preventDefaultOn = F2( + function (event, decoder) { + return A2( + $elm$virtual_dom$VirtualDom$on, + event, + $elm$virtual_dom$VirtualDom$MayPreventDefault(decoder)); + }); +var $author$project$Main$viewDebug = function (model) { + return model.isDebugVisible ? A2( + $elm$html$Html$ul, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('debug') + ]), + _Utils_ap( + _List_fromArray( + [ + A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('destinationDirectoryPath: ' + model.destinationDirectoryPath) + ])) + ]), + A2( + $elm$core$List$map, + function (msg) { + return A2( + $elm$html$Html$li, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + 'Msg: ' + A2($elm$core$String$left, 220, msg)) + ])); + }, + model.debug))) : $elm$html$Html$text(''); +}; +var $author$project$Main$viewPressedKeys = function (model) { + return $elm$html$Html$text( + model.isControlPressed ? ' CTRL ' : ('' + (model.isShiftPressed ? ' SHIFT ' : ''))); +}; +var $author$project$Main$viewFooter = function (model) { + var isWaitingForConfirmation = $elm$core$List$length(model.filesToDelete) > 0; + var conditionalAttributes = isWaitingForConfirmation ? _List_fromArray( + [ + A2( + $elm$html$Html$Events$preventDefaultOn, + 'keydown', + $author$project$Main$keyDecoderPreventingDefault($author$project$Main$Source)), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$Confirmation)) + ]) : _List_Nil; + var className = ((!_Utils_eq(model.error, $elm$core$Maybe$Nothing)) || isWaitingForConfirmation) ? 'danger' : ''; + return A2( + $elm$html$Html$footer, + A2( + $elm$core$List$cons, + $elm$html$Html$Attributes$class(className), + conditionalAttributes), + _List_fromArray( + [ + function () { + var _v0 = model.error; + if (_v0.$ === 'Just') { + var errorMsg = _v0.a; + return A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(errorMsg), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('close-error'), + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedCloseError) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Ok') + ])) + ])); + } else { + return $author$project$Main$viewPressedKeys(model); + } + }(), + function () { + var _v1 = model.filesToDelete; + if (!_v1.b) { + return $elm$html$Html$text(''); + } else { + return A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('This will permanently delete the selected files. This cannot be undone.'), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedCancel) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Cancel') + ])), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedDelete), + $elm$html$Html$Attributes$id('delete-button') + ]), + _List_fromArray( + [ + $elm$html$Html$text('DELETE') + ])) + ])); + } + }(), + $author$project$Main$viewDebug(model) + ])); +}; +var $elm$html$Html$Attributes$tabindex = function (n) { + return A2( + _VirtualDom_attribute, + 'tabIndex', + $elm$core$String$fromInt(n)); +}; +var $author$project$Main$Filtering = {$: 'Filtering'}; +var $author$project$Main$UserChangedSourceFilter = function (a) { + return {$: 'UserChangedSourceFilter', a: a}; +}; +var $author$project$Main$UserClickedClearSourceFilter = {$: 'UserClickedClearSourceFilter'}; +var $author$project$Main$UserClickedCopyFilterButton = {$: 'UserClickedCopyFilterButton'}; +var $author$project$Main$UserClickedSourceFile = function (a) { + return {$: 'UserClickedSourceFile', a: a}; +}; +var $author$project$Main$additionalHeaderClass = F2( + function (model, zone) { + return _Utils_eq(model.focusedZone, zone) ? ' focused' : ' unfocused'; + }); +var $elm_community$list_extra$List$Extra$count = function (predicate) { + return A2( + $elm$core$List$foldl, + F2( + function (x, acc) { + return predicate(x) ? (acc + 1) : acc; + }), + 0); +}; +var $author$project$Main$inflect = function (count) { + return (count > 1) ? ' files' : ' file'; +}; +var $author$project$Main$fileCount = F2( + function (model, target) { + var totalCount = function () { + if (target.$ === 'Source') { + return $elm$core$List$length(model.sourceFiles); + } else { + return $elm$core$List$length(model.destinationFiles); + } + }(); + var filteredCount = A2( + $elm_community$list_extra$List$Extra$count, + function ($) { + return $.satisfiesFilter; + }, + function () { + if (target.$ === 'Source') { + return model.sourceFiles; + } else { + return model.destinationFiles; + } + }()); + return _Utils_eq(filteredCount, totalCount) ? ($elm$core$String$fromInt(filteredCount) + ($author$project$Main$inflect(totalCount) + ' in directory')) : ($elm$core$String$fromInt(filteredCount) + (' (on a total of ' + ($elm$core$String$fromInt(totalCount) + (')' + ($author$project$Main$inflect(totalCount) + ' in directory'))))); + }); +var $elm$html$Html$h2 = _VirtualDom_node('h2'); +var $elm$html$Html$Attributes$placeholder = $elm$html$Html$Attributes$stringProperty('placeholder'); +var $author$project$Main$FileNameEditor = {$: 'FileNameEditor'}; +var $author$project$Main$UserModifiedFileName = function (a) { + return {$: 'UserModifiedFileName', a: a}; +}; +var $author$project$Main$UserSubmittedFilename = {$: 'UserSubmittedFilename'}; +var $elm$html$Html$form = _VirtualDom_node('form'); +var $elm$html$Html$Events$alwaysPreventDefault = function (msg) { + return _Utils_Tuple2(msg, true); +}; +var $elm$html$Html$Events$onSubmit = function (msg) { + return A2( + $elm$html$Html$Events$preventDefaultOn, + 'submit', + A2( + $elm$json$Json$Decode$map, + $elm$html$Html$Events$alwaysPreventDefault, + $elm$json$Json$Decode$succeed(msg))); +}; +var $author$project$Main$simpleKeyDecoder = function (target) { + return A2( + $elm$json$Json$Decode$map, + function (key) { + return A2($author$project$Main$UserPressedKey, target, key); + }, + $Gizra$elm_keyboard_event$Keyboard$Event$decodeKeyboardEvent); +}; +var $author$project$Main$viewEditedFilename = function (model) { + return A2( + $elm$html$Html$form, + _List_fromArray( + [ + $elm$html$Html$Events$onSubmit($author$project$Main$UserSubmittedFilename) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('file-input'), + $elm$html$Html$Attributes$id('filename-input'), + $elm$html$Html$Events$onInput($author$project$Main$UserModifiedFileName), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$FileNameEditor)), + A2( + $elm$html$Html$Events$on, + 'keydown', + $author$project$Main$simpleKeyDecoder($author$project$Main$Source)), + $elm$html$Html$Attributes$value(model.editedFileName) + ]), + _List_Nil) + ])); +}; +var $basti1302$elm_human_readable_filesize$Filesize$Base10 = {$: 'Base10'}; +var $basti1302$elm_human_readable_filesize$Filesize$defaultSettings = {decimalPlaces: 2, decimalSeparator: '.', units: $basti1302$elm_human_readable_filesize$Filesize$Base10}; +var $basti1302$elm_human_readable_filesize$Filesize$base10UnitList = _List_fromArray( + [ + {abbreviation: 'B', minimumSize: 1}, + {abbreviation: 'kB', minimumSize: 1000}, + {abbreviation: 'MB', minimumSize: 1000000}, + {abbreviation: 'GB', minimumSize: 1000000000}, + {abbreviation: 'TB', minimumSize: 1000000000000}, + {abbreviation: 'PB', minimumSize: 1000000000000000}, + {abbreviation: 'EB', minimumSize: 1000000000000000000} + ]); +var $basti1302$elm_human_readable_filesize$Filesize$base2UnitList = _List_fromArray( + [ + {abbreviation: 'B', minimumSize: 1}, + {abbreviation: 'KiB', minimumSize: 1024}, + {abbreviation: 'MiB', minimumSize: 1048576}, + {abbreviation: 'GiB', minimumSize: 1073741824}, + {abbreviation: 'TiB', minimumSize: 1099511627776}, + {abbreviation: 'PiB', minimumSize: 1125899906842624} + ]); +var $basti1302$elm_human_readable_filesize$Filesize$getUnitDefinitionList = function (units) { + if (units.$ === 'Base10') { + return $basti1302$elm_human_readable_filesize$Filesize$base10UnitList; + } else { + return $basti1302$elm_human_readable_filesize$Filesize$base2UnitList; + } +}; +var $elm$regex$Regex$never = _Regex_never; +var $basti1302$elm_human_readable_filesize$Filesize$decimalSeparatorRegex = A2( + $elm$core$Maybe$withDefault, + $elm$regex$Regex$never, + $elm$regex$Regex$fromString('\\.')); +var $elm$core$String$dropRight = F2( + function (n, string) { + return (n < 1) ? string : A3($elm$core$String$slice, 0, -n, string); + }); +var $elm$core$String$endsWith = _String_endsWith; +var $elm$core$Basics$abs = function (n) { + return (n < 0) ? (-n) : n; +}; +var $myrho$elm_round$Round$addSign = F2( + function (signed, str) { + var isNotZero = A2( + $elm$core$List$any, + function (c) { + return (!_Utils_eq( + c, + _Utils_chr('0'))) && (!_Utils_eq( + c, + _Utils_chr('.'))); + }, + $elm$core$String$toList(str)); + return _Utils_ap( + (signed && isNotZero) ? '-' : '', + str); + }); +var $elm$core$Char$fromCode = _Char_fromCode; +var $myrho$elm_round$Round$increaseNum = function (_v0) { + var head = _v0.a; + var tail = _v0.b; + if (_Utils_eq( + head, + _Utils_chr('9'))) { + var _v1 = $elm$core$String$uncons(tail); + if (_v1.$ === 'Nothing') { + return '01'; + } else { + var headtail = _v1.a; + return A2( + $elm$core$String$cons, + _Utils_chr('0'), + $myrho$elm_round$Round$increaseNum(headtail)); + } + } else { + var c = $elm$core$Char$toCode(head); + return ((c >= 48) && (c < 57)) ? A2( + $elm$core$String$cons, + $elm$core$Char$fromCode(c + 1), + tail) : '0'; + } +}; +var $elm$core$Basics$isInfinite = _Basics_isInfinite; +var $elm$core$Basics$isNaN = _Basics_isNaN; +var $elm$core$Maybe$map = F2( + function (f, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return $elm$core$Maybe$Just( + f(value)); + } else { + return $elm$core$Maybe$Nothing; + } + }); +var $elm$core$String$reverse = _String_reverse; +var $myrho$elm_round$Round$splitComma = function (str) { + var _v0 = A2($elm$core$String$split, '.', str); + if (_v0.b) { + if (_v0.b.b) { + var before = _v0.a; + var _v1 = _v0.b; + var after = _v1.a; + return _Utils_Tuple2(before, after); + } else { + var before = _v0.a; + return _Utils_Tuple2(before, '0'); + } + } else { + return _Utils_Tuple2('0', '0'); + } +}; +var $elm$core$Tuple$mapFirst = F2( + function (func, _v0) { + var x = _v0.a; + var y = _v0.b; + return _Utils_Tuple2( + func(x), + y); + }); +var $myrho$elm_round$Round$toDecimal = function (fl) { + var _v0 = A2( + $elm$core$String$split, + 'e', + $elm$core$String$fromFloat( + $elm$core$Basics$abs(fl))); + if (_v0.b) { + if (_v0.b.b) { + var num = _v0.a; + var _v1 = _v0.b; + var exp = _v1.a; + var e = A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toInt( + A2($elm$core$String$startsWith, '+', exp) ? A2($elm$core$String$dropLeft, 1, exp) : exp)); + var _v2 = $myrho$elm_round$Round$splitComma(num); + var before = _v2.a; + var after = _v2.b; + var total = _Utils_ap(before, after); + var zeroed = (e < 0) ? A2( + $elm$core$Maybe$withDefault, + '0', + A2( + $elm$core$Maybe$map, + function (_v3) { + var a = _v3.a; + var b = _v3.b; + return a + ('.' + b); + }, + A2( + $elm$core$Maybe$map, + $elm$core$Tuple$mapFirst($elm$core$String$fromChar), + $elm$core$String$uncons( + _Utils_ap( + A2( + $elm$core$String$repeat, + $elm$core$Basics$abs(e), + '0'), + total))))) : A3( + $elm$core$String$padRight, + e + 1, + _Utils_chr('0'), + total); + return _Utils_ap( + (fl < 0) ? '-' : '', + zeroed); + } else { + var num = _v0.a; + return _Utils_ap( + (fl < 0) ? '-' : '', + num); + } + } else { + return ''; + } +}; +var $myrho$elm_round$Round$roundFun = F3( + function (functor, s, fl) { + if ($elm$core$Basics$isInfinite(fl) || $elm$core$Basics$isNaN(fl)) { + return $elm$core$String$fromFloat(fl); + } else { + var signed = fl < 0; + var _v0 = $myrho$elm_round$Round$splitComma( + $myrho$elm_round$Round$toDecimal( + $elm$core$Basics$abs(fl))); + var before = _v0.a; + var after = _v0.b; + var r = $elm$core$String$length(before) + s; + var normalized = _Utils_ap( + A2($elm$core$String$repeat, (-r) + 1, '0'), + A3( + $elm$core$String$padRight, + r, + _Utils_chr('0'), + _Utils_ap(before, after))); + var totalLen = $elm$core$String$length(normalized); + var roundDigitIndex = A2($elm$core$Basics$max, 1, r); + var increase = A2( + functor, + signed, + A3($elm$core$String$slice, roundDigitIndex, totalLen, normalized)); + var remains = A3($elm$core$String$slice, 0, roundDigitIndex, normalized); + var num = increase ? $elm$core$String$reverse( + A2( + $elm$core$Maybe$withDefault, + '1', + A2( + $elm$core$Maybe$map, + $myrho$elm_round$Round$increaseNum, + $elm$core$String$uncons( + $elm$core$String$reverse(remains))))) : remains; + var numLen = $elm$core$String$length(num); + var numZeroed = (num === '0') ? num : ((s <= 0) ? _Utils_ap( + num, + A2( + $elm$core$String$repeat, + $elm$core$Basics$abs(s), + '0')) : ((_Utils_cmp( + s, + $elm$core$String$length(after)) < 0) ? (A3($elm$core$String$slice, 0, numLen - s, num) + ('.' + A3($elm$core$String$slice, numLen - s, numLen, num))) : _Utils_ap( + before + '.', + A3( + $elm$core$String$padRight, + s, + _Utils_chr('0'), + after)))); + return A2($myrho$elm_round$Round$addSign, signed, numZeroed); + } + }); +var $myrho$elm_round$Round$floor = $myrho$elm_round$Round$roundFun( + F2( + function (signed, str) { + var _v0 = $elm$core$String$uncons(str); + if (_v0.$ === 'Nothing') { + return false; + } else { + if ('0' === _v0.a.a.valueOf()) { + var _v1 = _v0.a; + var rest = _v1.b; + return signed && A2( + $elm$core$List$any, + $elm$core$Basics$neq( + _Utils_chr('0')), + $elm$core$String$toList(rest)); + } else { + return signed; + } + } + })); +var $basti1302$elm_human_readable_filesize$Filesize$removeTrailingZeroesRegex = A2( + $elm$core$Maybe$withDefault, + $elm$regex$Regex$never, + $elm$regex$Regex$fromString('^(\\d+\\.[^0]*)(0+)$')); +var $elm$regex$Regex$replaceAtMost = _Regex_replaceAtMost; +var $basti1302$elm_human_readable_filesize$Filesize$roundToDecimalPlaces = F2( + function (settings, num) { + var rounded = A2($myrho$elm_round$Round$floor, settings.decimalPlaces, num); + var withoutTrailingZeroes = A4( + $elm$regex$Regex$replaceAtMost, + 1, + $basti1302$elm_human_readable_filesize$Filesize$removeTrailingZeroesRegex, + function (_v1) { + var submatches = _v1.submatches; + return A2( + $elm$core$String$join, + '', + A2( + $elm$core$List$map, + $elm$core$Maybe$withDefault(''), + A2($elm$core$List$take, 1, submatches))); + }, + rounded); + var withoutTrailingDot = A2($elm$core$String$endsWith, '.', withoutTrailingZeroes) ? A2($elm$core$String$dropRight, 1, withoutTrailingZeroes) : withoutTrailingZeroes; + return (settings.decimalSeparator === '.') ? withoutTrailingDot : A4( + $elm$regex$Regex$replaceAtMost, + 1, + $basti1302$elm_human_readable_filesize$Filesize$decimalSeparatorRegex, + function (_v0) { + return settings.decimalSeparator; + }, + withoutTrailingDot); + }); +var $basti1302$elm_human_readable_filesize$Filesize$unknownUnit = {abbreviation: '?', minimumSize: 1}; +var $basti1302$elm_human_readable_filesize$Filesize$formatWithSplit = F2( + function (settings, num) { + if (!num) { + return _Utils_Tuple2('0', 'B'); + } else { + var unitDefinitionList = $basti1302$elm_human_readable_filesize$Filesize$getUnitDefinitionList(settings.units); + var _v0 = (num < 0) ? _Utils_Tuple2(-num, '-') : _Utils_Tuple2(num, ''); + var num2 = _v0.a; + var negativePrefix = _v0.b; + var unitDefinition = A2( + $elm$core$Maybe$withDefault, + $basti1302$elm_human_readable_filesize$Filesize$unknownUnit, + $elm$core$List$head( + $elm$core$List$reverse( + A2( + $elm$core$List$filter, + function (unitDef) { + return _Utils_cmp(num2, unitDef.minimumSize) > -1; + }, + unitDefinitionList)))); + var formattedNumber = A2($basti1302$elm_human_readable_filesize$Filesize$roundToDecimalPlaces, settings, num2 / unitDefinition.minimumSize); + return _Utils_Tuple2( + _Utils_ap(negativePrefix, formattedNumber), + unitDefinition.abbreviation); + } + }); +var $basti1302$elm_human_readable_filesize$Filesize$format = function (num) { + var _v0 = A2($basti1302$elm_human_readable_filesize$Filesize$formatWithSplit, $basti1302$elm_human_readable_filesize$Filesize$defaultSettings, num); + var size = _v0.a; + var unit = _v0.b; + return size + (' ' + unit); +}; +var $ChristophP$elm_mark$String$Mark$CaseIgnore = {$: 'CaseIgnore'}; +var $ChristophP$elm_mark$String$Mark$SearchNormal = function (a) { + return {$: 'SearchNormal', a: a}; +}; +var $ChristophP$elm_mark$String$Mark$SingleWord = {$: 'SingleWord'}; +var $elm$html$Html$mark = _VirtualDom_node('mark'); +var $ChristophP$elm_mark$String$Mark$defaultOptions = { + mapHit: function (hit) { + return A2( + $elm$html$Html$mark, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(hit) + ])); + }, + mapMiss: $elm$html$Html$text, + minTermLength: 3, + searchType: $ChristophP$elm_mark$String$Mark$SearchNormal($ChristophP$elm_mark$String$Mark$CaseIgnore), + whitespace: $ChristophP$elm_mark$String$Mark$SingleWord +}; +var $ChristophP$elm_mark$String$Mark$wrapAndAddToMarkers = F3( + function (item, wrapper, markers) { + if (item === '') { + return markers; + } else { + return A2( + $elm$core$List$cons, + wrapper(item), + markers); + } + }); +var $ChristophP$elm_mark$String$Mark$markWithHelp = F5( + function (options, revPositions, term, content, markers) { + markWithHelp: + while (true) { + var mapMiss = options.mapMiss; + var mapHit = options.mapHit; + if (!revPositions.b) { + return A3($ChristophP$elm_mark$String$Mark$wrapAndAddToMarkers, content, mapMiss, markers); + } else { + var _v1 = revPositions.a; + var start = _v1.a; + var end = _v1.b; + var rest = revPositions.b; + var miss = A2($elm$core$String$dropLeft, end, content); + var hit = A3($elm$core$String$slice, start, end, content); + var newContent = A2( + $elm$core$String$dropRight, + $elm$core$String$length(miss) + $elm$core$String$length(hit), + content); + var newMarkers = A3( + $ChristophP$elm_mark$String$Mark$wrapAndAddToMarkers, + hit, + mapHit, + A3($ChristophP$elm_mark$String$Mark$wrapAndAddToMarkers, miss, mapMiss, markers)); + var $temp$options = options, + $temp$revPositions = rest, + $temp$term = term, + $temp$content = newContent, + $temp$markers = newMarkers; + options = $temp$options; + revPositions = $temp$revPositions; + term = $temp$term; + content = $temp$content; + markers = $temp$markers; + continue markWithHelp; + } + } + }); +var $ChristophP$elm_mark$Internal$applyMinLengthCheck = F4( + function (minLength, getIndexes, term, content) { + return (_Utils_cmp( + minLength, + $elm$core$String$length(term)) < 1) ? A2(getIndexes, term, content) : _List_Nil; + }); +var $ChristophP$elm_mark$Internal$filterLastTwoHelp = F4( + function (func, val, list, acc) { + filterLastTwoHelp: + while (true) { + if (!list.b) { + return acc; + } else { + var head = list.a; + var tail = list.b; + var _v1 = A2(func, val, head) ? _Utils_Tuple2( + head, + A2($elm$core$List$cons, head, acc)) : _Utils_Tuple2(val, acc); + var newVal = _v1.a; + var newAcc = _v1.b; + var $temp$func = func, + $temp$val = newVal, + $temp$list = tail, + $temp$acc = newAcc; + func = $temp$func; + val = $temp$val; + list = $temp$list; + acc = $temp$acc; + continue filterLastTwoHelp; + } + } + }); +var $ChristophP$elm_mark$Internal$filterLastTwo = F2( + function (func, list) { + if (!list.b) { + return list; + } else { + var x = list.a; + var tail = list.b; + return $elm$core$List$reverse( + A4( + $ChristophP$elm_mark$Internal$filterLastTwoHelp, + func, + x, + tail, + _List_fromArray( + [x]))); + } + }); +var $ChristophP$elm_mark$Internal$removeOverlaps = $ChristophP$elm_mark$Internal$filterLastTwo( + F2( + function (_v0, _v1) { + var end = _v0.b; + var start = _v1.a; + return _Utils_cmp(end, start) < 1; + })); +var $ChristophP$elm_mark$Internal$multiWordGetIndexes = F3( + function (getIndexes, term, content) { + return (!A2($elm$core$String$contains, ' ', term)) ? A2(getIndexes, term, content) : $ChristophP$elm_mark$Internal$removeOverlaps( + A2( + $elm$core$List$sortBy, + $elm$core$Tuple$first, + A2( + $elm$core$List$concatMap, + function (word) { + return A2(getIndexes, word, content); + }, + $elm$core$String$words(term)))); + }); +var $ChristophP$elm_mark$Internal$addEnds = function (term) { + return $elm$core$List$map( + function (start) { + return _Utils_Tuple2( + start, + start + $elm$core$String$length(term)); + }); +}; +var $ChristophP$elm_mark$Internal$stringIndexes = F2( + function (term, content) { + return A2( + $ChristophP$elm_mark$Internal$addEnds, + term, + A2($elm$core$String$indexes, term, content)); + }); +var $ChristophP$elm_mark$Internal$stringIndexesIgnoreCase = F2( + function (term, content) { + return A2( + $ChristophP$elm_mark$Internal$addEnds, + term, + A2( + $elm$core$String$indexes, + $elm$core$String$toLower(term), + $elm$core$String$toLower(content))); + }); +var $ChristophP$elm_mark$String$Mark$pickGetIndexesFn = function (_v0) { + var minTermLength = _v0.minTermLength; + var whitespace = _v0.whitespace; + var searchType = _v0.searchType; + var getIndexes = A2( + $ChristophP$elm_mark$Internal$applyMinLengthCheck, + minTermLength, + function () { + if (searchType.$ === 'SearchNormal') { + var caseSensitivity = searchType.a; + if (caseSensitivity.$ === 'CaseIgnore') { + return $ChristophP$elm_mark$Internal$stringIndexesIgnoreCase; + } else { + return $ChristophP$elm_mark$Internal$stringIndexes; + } + } else { + var customGetIndexes = searchType.a; + return customGetIndexes; + } + }()); + if (whitespace.$ === 'SingleWord') { + return getIndexes; + } else { + return $ChristophP$elm_mark$Internal$multiWordGetIndexes(getIndexes); + } +}; +var $ChristophP$elm_mark$String$Mark$markWith = F3( + function (options, term, content) { + var indexes = A3($ChristophP$elm_mark$String$Mark$pickGetIndexesFn, options, term, content); + return A5( + $ChristophP$elm_mark$String$Mark$markWithHelp, + options, + $elm$core$List$reverse(indexes), + term, + content, + _List_Nil); + }); +var $ChristophP$elm_mark$String$Mark$MultiWord = {$: 'MultiWord'}; +var $ChristophP$elm_mark$String$Mark$multiWord = $ChristophP$elm_mark$String$Mark$MultiWord; +var $author$project$Main$highlight = $ChristophP$elm_mark$String$Mark$markWith( + _Utils_update( + $ChristophP$elm_mark$String$Mark$defaultOptions, + {minTermLength: 1, whitespace: $ChristophP$elm_mark$String$Mark$multiWord})); +var $elm$regex$Regex$find = _Regex_findAtMost(_Regex_infinity); +var $author$project$Main$matches = F2( + function (model, string) { + var maybeRegex = $author$project$Pattern$toRegexp( + $author$project$Pattern$fromString(model.sourceSearch)); + if (maybeRegex.$ === 'Just') { + var regex = maybeRegex.a; + return A2( + $elm$core$String$join, + ' ', + A2( + $elm$core$List$map, + function ($) { + return $.match; + }, + A2($elm$regex$Regex$find, regex, string))); + } else { + return ''; + } + }); +var $elm$core$String$padLeft = F3( + function (n, _char, string) { + return _Utils_ap( + A2( + $elm$core$String$repeat, + n - $elm$core$String$length(string), + $elm$core$String$fromChar(_char)), + string); + }); +var $elm$time$Time$flooredDiv = F2( + function (numerator, denominator) { + return $elm$core$Basics$floor(numerator / denominator); + }); +var $elm$time$Time$posixToMillis = function (_v0) { + var millis = _v0.a; + return millis; +}; +var $elm$time$Time$toAdjustedMinutesHelp = F3( + function (defaultOffset, posixMinutes, eras) { + toAdjustedMinutesHelp: + while (true) { + if (!eras.b) { + return posixMinutes + defaultOffset; + } else { + var era = eras.a; + var olderEras = eras.b; + if (_Utils_cmp(era.start, posixMinutes) < 0) { + return posixMinutes + era.offset; + } else { + var $temp$defaultOffset = defaultOffset, + $temp$posixMinutes = posixMinutes, + $temp$eras = olderEras; + defaultOffset = $temp$defaultOffset; + posixMinutes = $temp$posixMinutes; + eras = $temp$eras; + continue toAdjustedMinutesHelp; + } + } + } + }); +var $elm$time$Time$toAdjustedMinutes = F2( + function (_v0, time) { + var defaultOffset = _v0.a; + var eras = _v0.b; + return A3( + $elm$time$Time$toAdjustedMinutesHelp, + defaultOffset, + A2( + $elm$time$Time$flooredDiv, + $elm$time$Time$posixToMillis(time), + 60000), + eras); + }); +var $elm$time$Time$toCivil = function (minutes) { + var rawDay = A2($elm$time$Time$flooredDiv, minutes, 60 * 24) + 719468; + var era = (((rawDay >= 0) ? rawDay : (rawDay - 146096)) / 146097) | 0; + var dayOfEra = rawDay - (era * 146097); + var yearOfEra = ((((dayOfEra - ((dayOfEra / 1460) | 0)) + ((dayOfEra / 36524) | 0)) - ((dayOfEra / 146096) | 0)) / 365) | 0; + var dayOfYear = dayOfEra - (((365 * yearOfEra) + ((yearOfEra / 4) | 0)) - ((yearOfEra / 100) | 0)); + var mp = (((5 * dayOfYear) + 2) / 153) | 0; + var month = mp + ((mp < 10) ? 3 : (-9)); + var year = yearOfEra + (era * 400); + return { + day: (dayOfYear - ((((153 * mp) + 2) / 5) | 0)) + 1, + month: month, + year: year + ((month <= 2) ? 1 : 0) + }; +}; +var $elm$time$Time$toDay = F2( + function (zone, time) { + return $elm$time$Time$toCivil( + A2($elm$time$Time$toAdjustedMinutes, zone, time)).day; + }); +var $elm$time$Time$Apr = {$: 'Apr'}; +var $elm$time$Time$Aug = {$: 'Aug'}; +var $elm$time$Time$Dec = {$: 'Dec'}; +var $elm$time$Time$Feb = {$: 'Feb'}; +var $elm$time$Time$Jan = {$: 'Jan'}; +var $elm$time$Time$Jul = {$: 'Jul'}; +var $elm$time$Time$Jun = {$: 'Jun'}; +var $elm$time$Time$Mar = {$: 'Mar'}; +var $elm$time$Time$May = {$: 'May'}; +var $elm$time$Time$Nov = {$: 'Nov'}; +var $elm$time$Time$Oct = {$: 'Oct'}; +var $elm$time$Time$Sep = {$: 'Sep'}; +var $elm$time$Time$toMonth = F2( + function (zone, time) { + var _v0 = $elm$time$Time$toCivil( + A2($elm$time$Time$toAdjustedMinutes, zone, time)).month; + switch (_v0) { + case 1: + return $elm$time$Time$Jan; + case 2: + return $elm$time$Time$Feb; + case 3: + return $elm$time$Time$Mar; + case 4: + return $elm$time$Time$Apr; + case 5: + return $elm$time$Time$May; + case 6: + return $elm$time$Time$Jun; + case 7: + return $elm$time$Time$Jul; + case 8: + return $elm$time$Time$Aug; + case 9: + return $elm$time$Time$Sep; + case 10: + return $elm$time$Time$Oct; + case 11: + return $elm$time$Time$Nov; + default: + return $elm$time$Time$Dec; + } + }); +var $elm$time$Time$toYear = F2( + function (zone, time) { + return $elm$time$Time$toCivil( + A2($elm$time$Time$toAdjustedMinutes, zone, time)).year; + }); +var $author$project$Main$viewDate = F2( + function (model, time) { + var year = $elm$core$String$fromInt( + A2($elm$time$Time$toYear, model.timezone, time)); + var monthToString = function (timeMonth) { + switch (timeMonth.$) { + case 'Jan': + return '01'; + case 'Feb': + return '02'; + case 'Mar': + return '03'; + case 'Apr': + return '04'; + case 'May': + return '05'; + case 'Jun': + return '06'; + case 'Jul': + return '07'; + case 'Aug': + return '08'; + case 'Sep': + return '09'; + case 'Oct': + return '10'; + case 'Nov': + return '11'; + default: + return '12'; + } + }; + var month = monthToString( + A2($elm$time$Time$toMonth, model.timezone, time)); + var day = A3( + $elm$core$String$padLeft, + 2, + _Utils_chr('0'), + $elm$core$String$fromInt( + A2($elm$time$Time$toDay, model.timezone, time))); + return $elm$html$Html$text(day + ('/' + (month + ('/' + year)))); + }); +var $author$project$Main$viewReadOnlyFile = F4( + function (model, onClickMsg, canBeSearchedAndReplaced, file) { + var fileName = function () { + if (canBeSearchedAndReplaced) { + var _v1 = _Utils_Tuple2(model.sourceSearch, model.sourceReplace); + if (_v1.a === '') { + return _List_fromArray( + [ + $elm$html$Html$text(file.name) + ]); + } else { + if (_v1.b === '') { + return A2( + $author$project$Main$highlight, + A2($author$project$Main$matches, model, file.name), + file.name); + } else { + var replacementString = _v1.b; + return A2( + $author$project$Main$highlight, + replacementString, + A2($author$project$Main$replace, model, file.name)); + } + } + } else { + return _List_fromArray( + [ + $elm$html$Html$text(file.name) + ]); + } + }(); + var className = function () { + var _v0 = file.status; + switch (_v0.$) { + case 'Unselected': + return 'file'; + case 'Edited': + return 'file'; + case 'Selected': + return 'file selected'; + default: + return 'file marked-for-deletion'; + } + }(); + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class(className), + $elm$html$Html$Events$onClick( + onClickMsg(file)) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('filename') + ]), + fileName), + A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $basti1302$elm_human_readable_filesize$Filesize$format(file.size)) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('filemodificationdate') + ]), + _List_fromArray( + [ + A2($author$project$Main$viewDate, model, file.modTime) + ])) + ])); + }); +var $author$project$Main$viewFile = F4( + function (model, onClickMsg, canBeSearchedAndReplaced, file) { + return _Utils_eq(file.status, $author$project$File$Edited) ? $author$project$Main$viewEditedFilename(model) : A4($author$project$Main$viewReadOnlyFile, model, onClickMsg, canBeSearchedAndReplaced, file); + }); +var $author$project$Main$SourceSearchReplace = {$: 'SourceSearchReplace'}; +var $author$project$Main$UserChangedSourceReplace = function (a) { + return {$: 'UserChangedSourceReplace', a: a}; +}; +var $author$project$Main$UserChangedSourceSearch = function (a) { + return {$: 'UserChangedSourceSearch', a: a}; +}; +var $author$project$Main$UserClickedReplaceButton = {$: 'UserClickedReplaceButton'}; +var $author$project$Main$viewSearchReplaceForm = function (model) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('search-form') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input'), + $elm$html$Html$Attributes$id('search-left'), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$SourceSearchReplace)), + $elm$html$Html$Events$onInput($author$project$Main$UserChangedSourceSearch), + $elm$html$Html$Attributes$placeholder('Search'), + $elm$html$Html$Attributes$type_('text'), + $elm$html$Html$Attributes$value(model.sourceSearch) + ]), + _List_Nil), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input'), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$SourceSearchReplace)), + $elm$html$Html$Events$onInput($author$project$Main$UserChangedSourceReplace), + $elm$html$Html$Attributes$placeholder('Replace with'), + $elm$html$Html$Attributes$type_('text'), + $elm$html$Html$Attributes$value(model.sourceReplace) + ]), + _List_Nil), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedReplaceButton) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Replace') + ])) + ])); +}; +var $author$project$Main$UserChangedMaxDistance = function (a) { + return {$: 'UserChangedMaxDistance', a: a}; +}; +var $carwow$elm_slider$SingleSlider$SingleSlider = function (a) { + return {$: 'SingleSlider', a: a}; +}; +var $carwow$elm_slider$RangeSlider$defaultLabelFormatter = function (value) { + return $elm$core$String$fromFloat(value); +}; +var $carwow$elm_slider$RangeSlider$defaultValueFormatter = F2( + function (value, max) { + return _Utils_eq(value, max) ? '' : $elm$core$String$fromFloat(value); + }); +var $carwow$elm_slider$SingleSlider$init = function (attrs) { + return $carwow$elm_slider$SingleSlider$SingleSlider( + { + commonAttributes: {max: attrs.max, maxFormatter: $carwow$elm_slider$RangeSlider$defaultLabelFormatter, min: attrs.min, minFormatter: $carwow$elm_slider$RangeSlider$defaultLabelFormatter, step: attrs.step}, + valueAttributes: {change: attrs.onChange, formatter: $carwow$elm_slider$RangeSlider$defaultValueFormatter, value: attrs.value} + }); +}; +var $carwow$elm_slider$SingleSlider$inputDecoder = A2( + $elm$json$Json$Decode$map, + function (value) { + return A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(value)); + }, + $elm$html$Html$Events$targetValue); +var $debois$elm_dom$DOM$offsetHeight = A2($elm$json$Json$Decode$field, 'offsetHeight', $elm$json$Json$Decode$float); +var $debois$elm_dom$DOM$offsetWidth = A2($elm$json$Json$Decode$field, 'offsetWidth', $elm$json$Json$Decode$float); +var $elm$json$Json$Decode$map4 = _Json_map4; +var $debois$elm_dom$DOM$offsetLeft = A2($elm$json$Json$Decode$field, 'offsetLeft', $elm$json$Json$Decode$float); +var $elm$json$Json$Decode$null = _Json_decodeNull; +var $debois$elm_dom$DOM$offsetParent = F2( + function (x, decoder) { + return $elm$json$Json$Decode$oneOf( + _List_fromArray( + [ + A2( + $elm$json$Json$Decode$field, + 'offsetParent', + $elm$json$Json$Decode$null(x)), + A2($elm$json$Json$Decode$field, 'offsetParent', decoder) + ])); + }); +var $debois$elm_dom$DOM$offsetTop = A2($elm$json$Json$Decode$field, 'offsetTop', $elm$json$Json$Decode$float); +var $debois$elm_dom$DOM$scrollLeft = A2($elm$json$Json$Decode$field, 'scrollLeft', $elm$json$Json$Decode$float); +var $debois$elm_dom$DOM$scrollTop = A2($elm$json$Json$Decode$field, 'scrollTop', $elm$json$Json$Decode$float); +var $debois$elm_dom$DOM$position = F2( + function (x, y) { + return A2( + $elm$json$Json$Decode$andThen, + function (_v0) { + var x_ = _v0.a; + var y_ = _v0.b; + return A2( + $debois$elm_dom$DOM$offsetParent, + _Utils_Tuple2(x_, y_), + A2($debois$elm_dom$DOM$position, x_, y_)); + }, + A5( + $elm$json$Json$Decode$map4, + F4( + function (scrollLeftP, scrollTopP, offsetLeftP, offsetTopP) { + return _Utils_Tuple2((x + offsetLeftP) - scrollLeftP, (y + offsetTopP) - scrollTopP); + }), + $debois$elm_dom$DOM$scrollLeft, + $debois$elm_dom$DOM$scrollTop, + $debois$elm_dom$DOM$offsetLeft, + $debois$elm_dom$DOM$offsetTop)); + }); +var $debois$elm_dom$DOM$boundingClientRect = A4( + $elm$json$Json$Decode$map3, + F3( + function (_v0, width, height) { + var x = _v0.a; + var y = _v0.b; + return {height: height, left: x, top: y, width: width}; + }), + A2($debois$elm_dom$DOM$position, 0, 0), + $debois$elm_dom$DOM$offsetWidth, + $debois$elm_dom$DOM$offsetHeight); +var $myrho$elm_round$Round$funNum = F3( + function (fun, s, fl) { + return A2( + $elm$core$Maybe$withDefault, + 0 / 0, + $elm$core$String$toFloat( + A2(fun, s, fl))); + }); +var $myrho$elm_round$Round$round = $myrho$elm_round$Round$roundFun( + F2( + function (signed, str) { + var _v0 = $elm$core$String$uncons(str); + if (_v0.$ === 'Nothing') { + return false; + } else { + if ('5' === _v0.a.a.valueOf()) { + if (_v0.a.b === '') { + var _v1 = _v0.a; + return !signed; + } else { + var _v2 = _v0.a; + return true; + } + } else { + var _v3 = _v0.a; + var _int = _v3.a; + return function (i) { + return ((i > 53) && signed) || ((i >= 53) && (!signed)); + }( + $elm$core$Char$toCode(_int)); + } + } + })); +var $myrho$elm_round$Round$roundNum = $myrho$elm_round$Round$funNum($myrho$elm_round$Round$round); +var $carwow$elm_slider$RangeSlider$snapValue = F2( + function (value, step) { + var stepDecimals = $elm$core$List$head( + A2( + $elm$core$List$drop, + 1, + A2( + $elm$core$String$split, + '.', + $elm$core$String$fromFloat(step)))); + var precision = function () { + if (stepDecimals.$ === 'Just') { + var s = stepDecimals.a; + return $elm$core$String$length(s); + } else { + return 0; + } + }(); + return A2( + $myrho$elm_round$Round$roundNum, + precision, + $elm$core$Basics$round(value / step) * step); + }); +var $carwow$elm_slider$SingleSlider$onOutsideRangeClick = function (_v0) { + var slider = _v0.a; + var commonAttributes = slider.commonAttributes; + var valueDecoder = A3( + $elm$json$Json$Decode$map2, + F2( + function (rectangle, mouseX) { + var clickedValue = (((commonAttributes.max - commonAttributes.min) / rectangle.width) * mouseX) + commonAttributes.min; + return A2($carwow$elm_slider$RangeSlider$snapValue, clickedValue, commonAttributes.step); + }), + A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['target']), + $debois$elm_dom$DOM$boundingClientRect), + A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['offsetX']), + $elm$json$Json$Decode$float)); + return A2($elm$json$Json$Decode$map, slider.valueAttributes.change, valueDecoder); +}; +var $elm$core$Basics$clamp = F3( + function (low, high, number) { + return (_Utils_cmp(number, low) < 0) ? low : ((_Utils_cmp(number, high) > 0) ? high : number); + }); +var $carwow$elm_slider$RangeSlider$onClick = function (decoder) { + return A2($elm$html$Html$Events$on, 'click', decoder); +}; +var $carwow$elm_slider$SingleSlider$onInsideRangeClick = function (_v0) { + var valueAttributes = _v0.a.valueAttributes; + var commonAttributes = _v0.a.commonAttributes; + var valueDecoder = A3( + $elm$json$Json$Decode$map2, + F2( + function (rectangle, mouseX) { + var adjustedValue = A3($elm$core$Basics$clamp, commonAttributes.min, commonAttributes.max, valueAttributes.value); + var newValue = $elm$core$Basics$round((adjustedValue / rectangle.width) * mouseX); + var adjustedNewValue = A3($elm$core$Basics$clamp, commonAttributes.min, commonAttributes.max, newValue); + return A2($carwow$elm_slider$RangeSlider$snapValue, adjustedNewValue, commonAttributes.step); + }), + A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['target']), + $debois$elm_dom$DOM$boundingClientRect), + A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['offsetX']), + $elm$json$Json$Decode$float)); + return A2($elm$json$Json$Decode$map, valueAttributes.change, valueDecoder); +}; +var $carwow$elm_slider$SingleSlider$progressView = function (_v0) { + var slider = _v0.a; + var valueAttributes = slider.valueAttributes; + var commonAttributes = slider.commonAttributes; + var value = A3($elm$core$Basics$clamp, commonAttributes.min, commonAttributes.max, valueAttributes.value); + var progressRatio = 100 / (commonAttributes.max - commonAttributes.min); + var progress = (commonAttributes.max - value) * progressRatio; + var progressAttributes = _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-range__progress'), + A2($elm$html$Html$Attributes$style, 'left', '0.0%'), + A2( + $elm$html$Html$Attributes$style, + 'right', + $elm$core$String$fromFloat(progress) + '%'), + $carwow$elm_slider$RangeSlider$onClick( + $carwow$elm_slider$SingleSlider$onInsideRangeClick( + $carwow$elm_slider$SingleSlider$SingleSlider(slider))) + ]); + return A2($elm$html$Html$div, progressAttributes, _List_Nil); +}; +var $elm$html$Html$Attributes$classList = function (classes) { + return $elm$html$Html$Attributes$class( + A2( + $elm$core$String$join, + ' ', + A2( + $elm$core$List$map, + $elm$core$Tuple$first, + A2($elm$core$List$filter, $elm$core$Tuple$second, classes)))); +}; +var $carwow$elm_slider$RangeSlider$onChange = F2( + function (msg, input) { + return A2( + $elm$html$Html$Events$on, + 'change', + A2($elm$json$Json$Decode$map, msg, input)); + }); +var $carwow$elm_slider$RangeSlider$onInput = F2( + function (msg, input) { + return A2( + $elm$html$Html$Events$on, + 'input', + A2($elm$json$Json$Decode$map, msg, input)); + }); +var $elm$html$Html$Attributes$step = function (n) { + return A2($elm$html$Html$Attributes$stringProperty, 'step', n); +}; +var $carwow$elm_slider$RangeSlider$sliderInputView = F4( + function (commonAttributes, valueAttributes, input, extraClasses) { + return A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$type_('range'), + $elm$html$Html$Attributes$min( + $elm$core$String$fromFloat(commonAttributes.min)), + $elm$html$Html$Attributes$max( + $elm$core$String$fromFloat(commonAttributes.max)), + $elm$html$Html$Attributes$step( + $elm$core$String$fromFloat(commonAttributes.step)), + $elm$html$Html$Attributes$value( + $elm$core$String$fromFloat(valueAttributes.value)), + $elm$html$Html$Attributes$class('input-range'), + $elm$html$Html$Attributes$classList( + A2( + $elm$core$List$map, + function (c) { + return _Utils_Tuple2(c, true); + }, + extraClasses)), + A2($carwow$elm_slider$RangeSlider$onChange, valueAttributes.change, input), + A2($carwow$elm_slider$RangeSlider$onInput, valueAttributes.change, input) + ]), + _List_Nil); + }); +var $carwow$elm_slider$RangeSlider$sliderTrackView = function (decoder) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-range__track'), + $carwow$elm_slider$RangeSlider$onClick(decoder) + ]), + _List_Nil); +}; +var $carwow$elm_slider$SingleSlider$view = function (_v0) { + var slider = _v0.a; + return A2( + $elm$html$Html$div, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-range-container') + ]), + _List_fromArray( + [ + A4($carwow$elm_slider$RangeSlider$sliderInputView, slider.commonAttributes, slider.valueAttributes, $carwow$elm_slider$SingleSlider$inputDecoder, _List_Nil), + $carwow$elm_slider$RangeSlider$sliderTrackView( + $carwow$elm_slider$SingleSlider$onOutsideRangeClick( + $carwow$elm_slider$SingleSlider$SingleSlider(slider))), + $carwow$elm_slider$SingleSlider$progressView( + $carwow$elm_slider$SingleSlider$SingleSlider(slider)) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-range-labels-container') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-range-label') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + slider.commonAttributes.minFormatter(slider.commonAttributes.min)) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-range-label input-range-label--current-value') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + A2(slider.valueAttributes.formatter, slider.valueAttributes.value, slider.commonAttributes.max)) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-range-label') + ]), + _List_fromArray( + [ + $elm$html$Html$text( + slider.commonAttributes.maxFormatter(slider.commonAttributes.max)) + ])) + ])) + ])); +}; +var $author$project$Main$viewSimilarityLevelForm = function (model) { + return $carwow$elm_slider$SingleSlider$view( + $carwow$elm_slider$SingleSlider$init( + {max: $author$project$Main$maxSimilarity, min: 0, onChange: $author$project$Main$UserChangedMaxDistance, step: 1, value: model.minSimilarity})); +}; +var $author$project$Main$viewSourceFiles = function (model) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class( + 'panel-header' + A2($author$project$Main$additionalHeaderClass, model, $author$project$Main$LeftSide)) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$h2, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + A2($author$project$Main$fileCount, model, $author$project$Main$Source)) + ])), + $author$project$Main$viewSimilarityLevelForm(model), + $author$project$Main$viewSearchReplaceForm(model) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-box') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input'), + $elm$html$Html$Attributes$type_('text'), + $elm$html$Html$Attributes$id('filtering-left'), + $elm$html$Html$Events$onInput($author$project$Main$UserChangedSourceFilter), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$Filtering)), + $elm$html$Html$Attributes$value(model.sourceFilter), + $elm$html$Html$Attributes$placeholder('Enter one or more words to filter source files') + ]), + _List_Nil), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedClearSourceFilter) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Clear') + ])), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedCopyFilterButton) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Copy') + ])) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel-content') + ]), + A2( + $elm$core$List$map, + A3($author$project$Main$viewFile, model, $author$project$Main$UserClickedSourceFile, true), + A2( + $elm$core$List$filter, + function ($) { + return $.satisfiesFilter; + }, + model.sourceFiles))) + ])); +}; +var $author$project$Main$UserClickedReload = function (a) { + return {$: 'UserClickedReload', a: a}; +}; +var $author$project$Main$UserClickedSourceDirectory = F2( + function (a, b) { + return {$: 'UserClickedSourceDirectory', a: a, b: b}; + }); +var $author$project$Main$UserClickedSourceDirectoryButton = {$: 'UserClickedSourceDirectoryButton'}; +var $author$project$Main$viewDirectory = F3( + function (_v0, onClickMsg, file) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('file dir'), + $elm$html$Html$Events$onClick( + onClickMsg(file)) + ]), + _List_fromArray( + [ + $elm$html$Html$text(file.name) + ])); + }); +var $author$project$Main$UserClickedDestinationDirectory = F2( + function (a, b) { + return {$: 'UserClickedDestinationDirectory', a: a, b: b}; + }); +var $author$project$Main$maxVisibleCharactersInPaths = 50; +var $author$project$File$defaultDir = { + isDir: true, + modTime: $elm$time$Time$millisToPosix(0), + mode: 777, + name: '', + parentPath: '', + satisfiesFilter: false, + size: 0, + status: $author$project$File$Unselected +}; +var $author$project$File$withName = F2( + function (name, file) { + return _Utils_update( + file, + {name: name}); + }); +var $author$project$File$withParentPath = F2( + function (path, file) { + return _Utils_update( + file, + {parentPath: path}); + }); +var $author$project$Main$pathElementsRecursive = F3( + function (model, acc, path) { + var parentPath = A2($author$project$Main$parentDir, model, path); + var parentIsRootDir = (_Utils_eq(model.pathSeparator, $author$project$Main$unixPathSep) && (!$elm$core$String$length(parentPath))) || (_Utils_eq(model.pathSeparator, $author$project$Main$windowsPathSep) && ($elm$core$String$length(parentPath) === 2)); + var endIndex = $elm$core$String$length(path); + var lastPartIndex = 1 + A2( + $elm$core$Maybe$withDefault, + endIndex, + $elm$core$List$maximum( + A2($elm$core$String$indexes, model.pathSeparator, path))); + var leaf = A3($elm$core$String$slice, lastPartIndex, endIndex, path); + var file = A2( + $author$project$File$withParentPath, + parentPath, + A2($author$project$File$withName, leaf, $author$project$File$defaultDir)); + if (parentIsRootDir) { + if (parentPath === '') { + return A2( + $elm$core$List$cons, + _Utils_update( + file, + {parentPath: $author$project$Main$unixPathSep}), + acc); + } else { + return A2($elm$core$List$cons, file, acc); + } + } else { + return A2( + $elm$core$List$cons, + file, + A3($author$project$Main$pathElementsRecursive, model, acc, parentPath)); + } + }); +var $author$project$Main$pathElements = F3( + function (model, acc, path) { + return (path === '.') ? _List_Nil : $elm$core$List$reverse( + A3($author$project$Main$pathElementsRecursive, model, acc, path)); + }); +var $elm$core$List$sum = function (numbers) { + return A3($elm$core$List$foldl, $elm$core$Basics$add, 0, numbers); +}; +var $author$project$Main$truncateConcatenatedNames = F2( + function (maxLength, elements) { + var currentLength = function (acc) { + return $elm$core$List$sum( + A2( + $elm$core$List$map, + A2( + $elm$core$Basics$composeR, + function ($) { + return $.name; + }, + $elm$core$String$length), + acc)); + }; + return A3( + $elm$core$List$foldl, + F2( + function (element, acc) { + return (_Utils_cmp( + currentLength(acc) + $elm$core$String$length(element.name), + maxLength) < 1) ? A2($elm$core$List$cons, element, acc) : acc; + }), + _List_Nil, + $elm$core$List$reverse(elements)); + }); +var $author$project$Main$viewPath = F2( + function (model, target) { + var path = function () { + if (target.$ === 'Source') { + return model.sourceDirectoryPath; + } else { + return model.destinationDirectoryPath; + } + }(); + var msgToEmit = function () { + if (target.$ === 'Source') { + return $author$project$Main$UserClickedSourceDirectory(true); + } else { + return $author$project$Main$UserClickedDestinationDirectory(true); + } + }(); + var elements = A3($author$project$Main$pathElements, model, _List_Nil, path); + var displayableElements = A2($author$project$Main$truncateConcatenatedNames, $author$project$Main$maxVisibleCharactersInPaths, elements); + var displayableElementsCount = $elm$core$List$length(displayableElements); + var ellipsis = (_Utils_cmp( + displayableElementsCount, + $elm$core$List$length(elements)) < 0) ? $elm$html$Html$text('...' + model.pathSeparator) : $elm$html$Html$text(model.pathSeparator); + var clickablePath = A2( + $elm$core$List$indexedMap, + F2( + function (index, element) { + return (_Utils_cmp(index, displayableElementsCount - 1) < 0) ? A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$span, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('link'), + $elm$html$Html$Events$onClick( + msgToEmit(element)) + ]), + _List_fromArray( + [ + $elm$html$Html$text(element.name) + ])), + A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(model.pathSeparator) + ])) + ])) : A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(element.name) + ])); + }), + displayableElements); + return A2( + $elm$html$Html$span, + _List_Nil, + A2($elm$core$List$cons, ellipsis, clickablePath)); + }); +var $author$project$Main$viewSourceSubdirectories = function (model) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class( + 'panel-header' + A2($author$project$Main$additionalHeaderClass, model, $author$project$Main$LeftSide)) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$h2, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Source: '), + A2($author$project$Main$viewPath, model, $author$project$Main$Source) + ])), + A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick( + $author$project$Main$UserClickedReload($author$project$Main$Source)) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Refresh') + ])), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedSourceDirectoryButton) + ]), + _List_fromArray( + [ + $elm$html$Html$text('...') + ])) + ])) + ])), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel-content') + ]), + A2( + $elm$core$List$map, + A2( + $author$project$Main$viewDirectory, + model, + $author$project$Main$UserClickedSourceDirectory(false)), + model.sourceSubDirectories)) + ])); +}; +var $author$project$Main$viewSource = function (model) { + return _List_fromArray( + [ + $author$project$Main$viewSourceSubdirectories(model), + $author$project$Main$viewSourceFiles(model) + ]); +}; +var $author$project$Main$viewLeftSide = function (model) { + var conditionalAttributes = function () { + var _v0 = _Utils_Tuple2(model.editedFile, model.focusedZone); + if (_v0.a.$ === 'Nothing') { + if (_v0.b.$ === 'LeftSide') { + var _v1 = _v0.a; + var _v2 = _v0.b; + return _List_fromArray( + [ + A2( + $elm$html$Html$Events$preventDefaultOn, + 'keydown', + $author$project$Main$keyDecoderPreventingDefault($author$project$Main$Source)) + ]); + } else { + var _v3 = _v0.a; + return _List_fromArray( + [ + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$LeftSide)) + ]); + } + } else { + return _List_Nil; + } + }(); + return A2( + $elm$html$Html$div, + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$Attributes$id('container-left'), + $elm$html$Html$Attributes$tabindex(1) + ]), + conditionalAttributes), + $author$project$Main$viewSource(model)); +}; +var $author$project$Main$UserClickedDestinationFile = function (a) { + return {$: 'UserClickedDestinationFile', a: a}; +}; +var $author$project$Main$UserChangedDestinationFilesFilter = function (a) { + return {$: 'UserChangedDestinationFilesFilter', a: a}; +}; +var $author$project$Main$UserClickedClearDestinationFilesFilter = {$: 'UserClickedClearDestinationFilesFilter'}; +var $elm$json$Json$Encode$bool = _Json_wrap; +var $elm$html$Html$Attributes$boolProperty = F2( + function (key, bool) { + return A2( + _VirtualDom_property, + key, + $elm$json$Json$Encode$bool(bool)); + }); +var $elm$html$Html$Attributes$disabled = $elm$html$Html$Attributes$boolProperty('disabled'); +var $author$project$Main$viewDestinationFilesFilter = function (model) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-box') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input'), + $elm$html$Html$Attributes$type_('text'), + $elm$html$Html$Attributes$id('filtering-files-right'), + $elm$html$Html$Events$onInput($author$project$Main$UserChangedDestinationFilesFilter), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$Filtering)), + $elm$html$Html$Attributes$value(model.destinationFilesFilter), + $elm$html$Html$Attributes$placeholder('Enter one or more words to filter files in destination directory'), + $elm$html$Html$Attributes$disabled(model.applySourceFilterToDestinationFiles) + ]), + _List_Nil), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedClearDestinationFilesFilter), + $elm$html$Html$Attributes$disabled(model.applySourceFilterToDestinationFiles) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Clear') + ])) + ])); +}; +var $author$project$Main$viewDestinationFiles = function (model) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class( + 'panel-header' + A2($author$project$Main$additionalHeaderClass, model, $author$project$Main$RightSide)) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$h2, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + A2($author$project$Main$fileCount, model, $author$project$Main$Destination)) + ])) + ])), + $author$project$Main$viewDestinationFilesFilter(model), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel-content') + ]), + A2( + $elm$core$List$map, + A3($author$project$Main$viewFile, model, $author$project$Main$UserClickedDestinationFile, false), + A2( + $elm$core$List$filter, + function ($) { + return $.satisfiesFilter; + }, + model.destinationFiles))) + ])); +}; +var $author$project$Main$UserClickedDestinationDirectoryButton = {$: 'UserClickedDestinationDirectoryButton'}; +var $author$project$Main$UserChangedDestinationDirectoryFilter = function (a) { + return {$: 'UserChangedDestinationDirectoryFilter', a: a}; +}; +var $author$project$Main$UserClickedClearDestinationDirectoryFilter = {$: 'UserClickedClearDestinationDirectoryFilter'}; +var $author$project$Main$viewDestinationDirectoryFilter = function (model) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input-box') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('input'), + $elm$html$Html$Attributes$type_('text'), + $elm$html$Html$Attributes$id('filtering-dir-right'), + $elm$html$Html$Events$onInput($author$project$Main$UserChangedDestinationDirectoryFilter), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$Filtering)), + $elm$html$Html$Attributes$value(model.destinationDirectoryFilter), + $elm$html$Html$Attributes$placeholder('Enter one or more words to filter destination directories'), + $elm$html$Html$Attributes$disabled(model.applySourceFilterToDestinationDirectories) + ]), + _List_Nil), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedClearDestinationDirectoryFilter), + $elm$html$Html$Attributes$disabled(model.applySourceFilterToDestinationDirectories) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Clear') + ])) + ])); +}; +var $author$project$Main$DirNameEditor = {$: 'DirNameEditor'}; +var $author$project$Main$UserModifiedDirName = function (a) { + return {$: 'UserModifiedDirName', a: a}; +}; +var $author$project$Main$UserSubmittedDirName = {$: 'UserSubmittedDirName'}; +var $author$project$Main$viewEditedDirectoryName = function (model) { + return A2( + $elm$html$Html$form, + _List_fromArray( + [ + $elm$html$Html$Events$onSubmit($author$project$Main$UserSubmittedDirName) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('file-input'), + $elm$html$Html$Attributes$id('dirname-input'), + $elm$html$Html$Events$onInput($author$project$Main$UserModifiedDirName), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$DirNameEditor)), + A2( + $elm$html$Html$Events$on, + 'keydown', + $author$project$Main$simpleKeyDecoder($author$project$Main$Destination)), + $elm$html$Html$Attributes$value(model.editedDirName) + ]), + _List_Nil) + ])); +}; +var $author$project$Main$viewDestinationSubdirectories = function (model) { + var newDirEditor = model.isCreatingDirectory ? _List_fromArray( + [ + $author$project$Main$viewEditedDirectoryName(model) + ]) : _List_Nil; + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel') + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class( + 'panel-header' + A2($author$project$Main$additionalHeaderClass, model, $author$project$Main$RightSide)) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$h2, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text('Destination: '), + A2($author$project$Main$viewPath, model, $author$project$Main$Destination) + ])), + A2( + $elm$html$Html$span, + _List_Nil, + _List_fromArray( + [ + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick( + $author$project$Main$UserClickedReload($author$project$Main$Destination)) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Refresh') + ])), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('btn'), + $elm$html$Html$Events$onClick($author$project$Main$UserClickedDestinationDirectoryButton) + ]), + _List_fromArray( + [ + $elm$html$Html$text('...') + ])) + ])) + ])), + $author$project$Main$viewDestinationDirectoryFilter(model), + A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('panel-content') + ]), + _Utils_ap( + newDirEditor, + A2( + $elm$core$List$map, + A2( + $author$project$Main$viewDirectory, + model, + $author$project$Main$UserClickedDestinationDirectory(false)), + A2( + $elm$core$List$filter, + function ($) { + return $.satisfiesFilter; + }, + model.destinationSubdirectories)))) + ])); +}; +var $author$project$Main$viewLoadingAnimation = A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class('spin') + ]), + _List_Nil); +var $author$project$Main$viewDestination = function (model) { + return model.isDestinationLoadingInProgress ? _List_fromArray( + [$author$project$Main$viewLoadingAnimation]) : _List_fromArray( + [ + $author$project$Main$viewDestinationSubdirectories(model), + $author$project$Main$viewDestinationFiles(model) + ]); +}; +var $author$project$Main$viewRightSide = function (model) { + var conditionalAttributes = function () { + var _v0 = model.focusedZone; + if (_v0.$ === 'RightSide') { + return _List_fromArray( + [ + A2( + $elm$html$Html$Events$preventDefaultOn, + 'keydown', + $author$project$Main$keyDecoderPreventingDefault($author$project$Main$Destination)) + ]); + } else { + return _List_Nil; + } + }(); + return A2( + $elm$html$Html$div, + _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$Attributes$id('container-right'), + $elm$html$Html$Attributes$tabindex(2), + $elm$html$Html$Events$onFocus( + $author$project$Main$UserChangedFocusedZone($author$project$Main$RightSide)) + ]), + conditionalAttributes), + $author$project$Main$viewDestination(model)); +}; +var $author$project$Main$view = function (model) { + return A2( + $elm$html$Html$div, + _List_fromArray( + [ + $elm$html$Html$Attributes$class( + model.isDebugVisible ? 'app debug' : 'app'), + $elm$html$Html$Attributes$id('app'), + A2($elm$html$Html$Events$on, 'keydown', $author$project$Main$keyDecoder), + A2($elm$html$Html$Events$on, 'keyup', $author$project$Main$keyDecoder) + ]), + _List_fromArray( + [ + $author$project$Main$viewLeftSide(model), + $author$project$Main$viewRightSide(model), + $author$project$Main$viewFooter(model) + ])); +}; +var $author$project$Main$main = $elm$browser$Browser$element( + {init: $author$project$Main$init, subscriptions: $author$project$Main$subscriptions, update: $author$project$Main$update, view: $author$project$Main$view}); +_Platform_export({'Main':{'init':$author$project$Main$main( + $elm$json$Json$Decode$succeed(_Utils_Tuple0))({"versions":{"elm":"0.19.1"},"types":{"message":"Main.Msg","aliases":{"File.File":{"args":[],"type":"{ isDir : Basics.Bool, mode : Basics.Int, modTime : Time.Posix, name : String.String, parentPath : String.String, satisfiesFilter : Basics.Bool, size : Basics.Int, status : File.FileStatus }"},"Keyboard.Event.KeyboardEvent":{"args":[],"type":"{ altKey : Basics.Bool, ctrlKey : Basics.Bool, key : Maybe.Maybe String.String, keyCode : Keyboard.Key.Key, metaKey : Basics.Bool, repeat : Basics.Bool, shiftKey : Basics.Bool }"},"Time.Era":{"args":[],"type":"{ start : Basics.Int, offset : Basics.Int }"}},"unions":{"Main.Msg":{"args":[],"tags":{"AdjustTimeZone":["Time.Zone"],"BackendReturnedCreatedDirectory":["File.File"],"BackendReturnedCurrentDirPath":["String.String"],"BackendReturnedDestinationDirectories":["List.List File.File"],"BackendReturnedDestinationDirectoryPath":["String.String"],"BackendReturnedDestinationFiles":["List.List File.File"],"BackendReturnedError":["String.String"],"BackendReturnedMovedFiles":["List.List File.File"],"BackendReturnedRemovedFile":[],"BackendReturnedRenamedFiles":["List.List File.File","List.List String.String"],"BackendReturnedSourceDirectoryContent":["List.List File.File"],"BackendReturnedSourceDirectoryPath":["String.String"],"NoOp":[],"UserChangedDestinationDirectoryFilter":["String.String"],"UserChangedDestinationFilesFilter":["String.String"],"UserChangedMaxDistance":["Basics.Float"],"UserChangedSourceFilter":["String.String"],"UserChangedSourceReplace":["String.String"],"UserChangedSourceSearch":["String.String"],"UserClickedCancel":[],"UserClickedCopyFilterButton":[],"UserClickedClearSourceFilter":[],"UserClickedClearDestinationDirectoryFilter":[],"UserClickedClearDestinationFilesFilter":[],"UserClickedCloseError":[],"UserClickedDelete":[],"UserClickedDestinationDirectory":["Basics.Bool","File.File"],"UserClickedDestinationDirectoryButton":[],"UserClickedDestinationFile":["File.File"],"UserClickedReload":["Main.Target"],"UserClickedReplaceButton":[],"UserClickedSourceDirectory":["Basics.Bool","File.File"],"UserClickedSourceDirectoryButton":[],"UserClickedSourceFile":["File.File"],"UserChangedFocusedZone":["Main.FocusedZone"],"UserModifiedFileName":["String.String"],"UserModifiedDirName":["String.String"],"UserPressedKey":["Main.Target","Keyboard.Event.KeyboardEvent"],"UserPressedOrReleasedKey":["Keyboard.Event.KeyboardEvent"],"UserSubmittedDirName":[],"UserSubmittedFilename":[]}},"Basics.Bool":{"args":[],"tags":{"True":[],"False":[]}},"File.FileStatus":{"args":[],"tags":{"Unselected":[],"Edited":[],"Selected":[],"SelectedForDeletion":[]}},"Basics.Float":{"args":[],"tags":{"Float":[]}},"Main.FocusedZone":{"args":[],"tags":{"Confirmation":[],"ErrorMessage":[],"Filtering":[],"LeftSide":[],"FileNameEditor":[],"DirNameEditor":[],"RightSide":[],"SourceSearchReplace":[],"SimilarityLevel":[]}},"Basics.Int":{"args":[],"tags":{"Int":[]}},"Keyboard.Key.Key":{"args":[],"tags":{"A":[],"B":[],"C":[],"D":[],"E":[],"F":[],"G":[],"H":[],"I":[],"J":[],"K":[],"L":[],"M":[],"N":[],"O":[],"P":[],"Q":[],"R":[],"S":[],"T":[],"U":[],"V":[],"W":[],"X":[],"Y":[],"Z":[],"Left":[],"Right":[],"Up":[],"Down":[],"Shift":["Maybe.Maybe Keyboard.Key.Side"],"Ctrl":["Maybe.Maybe Keyboard.Key.Side"],"Alt":[],"Tab":[],"CapsLock":[],"Spacebar":[],"Escape":[],"Enter":[],"Backspace":[],"Delete":[],"PageUp":[],"PageDown":[],"End":[],"Home":[],"Zero":[],"One":[],"Two":[],"Three":[],"Four":[],"Five":[],"Six":[],"Seven":[],"Eight":[],"Nine":[],"Insert":[],"PrintScreen":[],"PauseBreak":[],"Windows":[],"Command":[],"ChromeSearch":[],"NumLock":[],"ScrollLock":[],"F1":[],"F2":[],"F3":[],"F4":[],"F5":[],"F6":[],"F7":[],"F8":[],"F9":[],"F10":[],"F11":[],"F12":[],"NumpadZero":[],"NumpadOne":[],"NumpadTwo":[],"NumpadThree":[],"NumpadFour":[],"NumpadFive":[],"NumpadSix":[],"NumpadSeven":[],"NumpadEight":[],"NumpadNine":[],"Multiply":[],"Add":[],"Subtract":[],"Decimal":[],"Divide":[],"Ambiguous":["List.List Keyboard.Key.Key"],"Unknown":["Basics.Int"]}},"List.List":{"args":["a"],"tags":{}},"Maybe.Maybe":{"args":["a"],"tags":{"Just":["a"],"Nothing":[]}},"Time.Posix":{"args":[],"tags":{"Posix":["Basics.Int"]}},"String.String":{"args":[],"tags":{"String":[]}},"Main.Target":{"args":[],"tags":{"Source":[],"Destination":[]}},"Time.Zone":{"args":[],"tags":{"Zone":["Basics.Int","List.List Time.Era"]}},"Keyboard.Key.Side":{"args":[],"tags":{"LeftHand":[],"RightHand":[]}}}}})}});}(this)); \ No newline at end of file diff --git a/src/example/index.html b/src/example/index.html new file mode 100644 index 0000000..aefce2a --- /dev/null +++ b/src/example/index.html @@ -0,0 +1,39 @@ + + + + + + + Tauri App + + + + +

+

Welcome to Tauri

+ +
+

Click on the Tauri logo to learn more about the framework

+ +
+ + +
+

+
+ + diff --git a/src/example/main.js b/src/example/main.js new file mode 100644 index 0000000..55d5f93 --- /dev/null +++ b/src/example/main.js @@ -0,0 +1,18 @@ +const { invoke } = window.__TAURI__.core; + +let greetInputEl; +let greetMsgEl; + +async function greet() { + // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ + greetMsgEl.textContent = await invoke("greet", { name: greetInputEl.value }); +} + +window.addEventListener("DOMContentLoaded", () => { + greetInputEl = document.querySelector("#greet-input"); + greetMsgEl = document.querySelector("#greet-msg"); + document.querySelector("#greet-form").addEventListener("submit", (e) => { + e.preventDefault(); + greet(); + }); +}); diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..0b564f8 --- /dev/null +++ b/src/index.html @@ -0,0 +1,17 @@ + + + + + + File Organizer + + + + + +
+ + + + + diff --git a/src/main.css b/src/main.css new file mode 100644 index 0000000..eed9a78 --- /dev/null +++ b/src/main.css @@ -0,0 +1,342 @@ +:root { + --main-color: rgb(98, 189, 176); + --faded-main-color: rgba(98, 189, 176, 0.59); +} + +html { + background-color: lightgrey; +} + +body { + margin: 0; + color: black; + font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", + "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + font-size: smaller; + cursor: default; /* enforces the default cursor of the platform */ +} + +@font-face { + font-family: "Nunito"; + font-style: normal; + font-weight: 400; + src: local(""), + url("assets/fonts/nunito-v16-latin-regular.woff2") format("woff2"); +} + +h2 { + font-size: small; + margin: 0; + display: inline-block; +} + +.input-box { + height: 25px; + min-height: 25px; + line-height:20px; + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 6px 10px 1px 5px; +} + +.btn { + border-radius: 3px; + border: none; + cursor: pointer; + min-width: 60px; + height: 30px; + line-height: 30px; + margin: 0 0 0 20px; + padding: 0 8px; + outline: none; +} + + +.panel-header .btn { + min-width: 30px; + height: 20px; + line-height: 20px; +} + +.input-box .btn { + width: 60px; + height: 25px; + line-height: 25px; + margin: 0 0 0 20px; + padding: 0 8px; +} + +.btn:hover { + color: white; + background-color: darkgrey; +} + +#delete-button { + background-color: red; + color: white; + font-weight: bold; +} +#delete-button:hover { + background-color: #801515; +} + +form { + display: flex; +} + +.file-input { + height: 15px; + flex: 1; + border: none; +} + +.input-box .input { +} + +.file.dir { + padding-left: 5px; +} + +.input-box .input { + height: 25px; + flex: 1; + border: none; + border-radius: 3px; + line-height: 15px; + padding: 0 10px; + background-color: rgba(240, 240, 240, 1); + -webkit-font-smoothing: antialiased; + cursor: text; +} + +.input-box .input:hover { + border: none; + background-color: rgba(255, 255, 255, 1); +} + +.input-box .input:focus { + border: none; + background-color: rgba(255, 255, 255, 1); +} + +.file { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: flex-end; + word-break: break-all; +} + +.file { + background: ghostwhite; + cursor: pointer; +} + +.file:nth-child(odd) { background: #DDD; } + +.file.selected { + font-weight: bold; + background-color: rgb(121, 219, 190); +} + +.file.marked-for-deletion { + font-weight: bold; + color: red; +} + +.filename { + align-self: flex-start; + flex: 1; + margin-left: 5px; + margin-right: 10px; + word-break: break-all; +} + +.filemodificationdate { + width: 80px; + margin-left: 10px; + margin-left: 10px; +} + +.app { + height: 100vh; + display: grid; + grid-template-rows: 20px 1fr 50px; + grid-template-columns: 1fr 1fr; +} + +.debug { + grid-template-rows: 20px 1fr 250px; +} + +header { + grid-column-start: 1; + grid-column-end: 3; + grid-row-start: 1; + grid-row-end: 2; + background: lightgrey; + color: black; + padding: 10px; + display: flex; + flex-direction: row; + align-items: center; +} + +#container-left { + grid-column-start: 1; + grid-column-end: 2; + grid-row-start: 2; + grid-row-end: 4; + background: lightgrey; + padding: 5px; + min-height: 0; /* Prevents the grid to extend outside of the visible area */ + display: grid; + grid-template-rows: 2fr 4fr; + grid-row-gap: 5px; + outline: none; +} + +#container-right { + grid-column-start: 2; + grid-column-end: 3; + grid-row-start: 2; + grid-row-end: 4; + background: lightgrey; + padding: 5px; + min-height: 0; /* Prevents the grid to extend outside of the visible area */ + display: grid; + grid-template-rows: 2fr 4fr; + grid-row-gap: 5px; + outline: none; +} + +footer { + grid-column-start: 1; + grid-column-end: 3; + grid-row-start: 3; + grid-row-end: 4; + background: lightgrey; + color: black; + padding: 10px; + display: flex; + flex-direction: row; + align-items: center; + margin: 0 5px 5px 5px; +} + +.panel { + border: 1px solid darkgrey; + min-height: 0; + display: flex; + flex-direction: column; +} + +.panel-content { + padding: 5px; + overflow-y: scroll; + min-height: 0; +} + +.panel-header { + height: 20px; + min-height: 20px; + padding: 5px; + background-color: var(--faded-main-color); + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} + +.panel-header.unfocused > h2 { + font-weight: normal; +} + +.panel-header.focused { + background-color: var(--main-color); +} + + +/* force scrollbar to be always visible on Mac OS */ +::-webkit-scrollbar { + -webkit-appearance: none; + width: 7px; +} + +::-webkit-scrollbar-thumb { + border-radius: 4px; + background-color: rgba(0, 0, 0, .5); + box-shadow: 0 0 1px rgba(255, 255, 255, .5); +} + +.danger { + border: 1px solid red; + background-color: #FFAAAA; +} + +.btn.link { + margin: 0 2px 0 10px; +} + +.search-form > input { + width: 140px; +} + +.search-form > button { + margin: 0; +} + +.search-form > input { + margin-right: 5px; +} + +.link { + cursor: pointer; + +} + +.link:hover { + text-decoration: underline; + +} + +#similarity-level { + width: 50px; +} + +.debug { + overflow: scroll; +} + +.spin { + border: 16px solid var(--main-color); + border-radius: 50%; + border-top: 16px solid var(--main-color); + border-right: 16px solid var(--faded-main-color); + border-bottom: 16px solid var(--faded-main-color); + border-left: 16px solid var(--faded-main-color); + width: 50px; + height: 50px; + -webkit-animation: spin 1.5s linear infinite; + animation: spin 1.5s linear infinite; + margin: auto; + margin-top: 50%; +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/slider.css b/src/slider.css new file mode 100644 index 0000000..be3a974 --- /dev/null +++ b/src/slider.css @@ -0,0 +1,196 @@ +.input-range-container { + display: inline-flex; + align-items: center; + position: relative; + height: 14px; +} + +/* In the case of the double slider, each individual slider has it's width set to 100% of the parent element. Therefore, in order to set a fixed width, it is recommended to set it on the parent element and not override the width of the range slider. This is to ensure the flexibility of the component. */ +.input-range-container, +.input-range { + width: 100%; +} + +.input-range, +.input-range:hover, +.input-range:focus { + box-shadow: none; +} + +.input-range { + -webkit-appearance: none; + background-color: transparent; + padding: 0; + overflow: visible; + pointer-events: none; + height: 14px; + border: 0; +} + +.input-range::-moz-focus-outer { + border: 0; +} + +.input-range::-webkit-slider-thumb { + -webkit-appearance: none; + height: 10px; + width: 10px; + border: none; + background-color: white; + border-radius: 100%; + box-shadow: 0 0 0 2px rgba(33, 34, 36, 0.07); + cursor: pointer; + pointer-events: all; + z-index: 2; + position: relative; +} + +.input-range::-moz-range-track { + background: transparent; +} + +.input-range::-moz-range-thumb { + height: 10px; + width: 10px; + border: none; + background-color: white; + border-radius: 100%; + box-shadow: 0 0 0 2px rgba(33, 34, 36, 0.07); + cursor: pointer; + pointer-events: all; + z-index: 2; + position: relative; + transform: scale(1); +} + +.input-range::-ms-track { + background-color: transparent; + border-color: transparent; + color: transparent; +} + +.input-range::-ms-fill-lower { + background-color: transparent; +} + +.input-range::-ms-thumb { + height: 10px; + width: 10px; + border: none; + background-color: white; + border-radius: 100%; + box-shadow: 0 0 0 2px rgba(33, 34, 36, 0.07); + cursor: pointer; + pointer-events: all; + z-index: 2; + position: relative; +} + +.input-range:disabled, .input-range:disabled:hover { + cursor: not-allowed; + box-shadow: none; + border: 0; + background-color: transparent; +} + +.input-range:disabled::-webkit-slider-thumb, .input-range:disabled:hover::-webkit-slider-thumb { + cursor: not-allowed; +} + +.input-range:disabled::-moz-range-thumb, .input-range:disabled:hover::-moz-range-thumb { + cursor: not-allowed; +} + +.input-range:disabled::-ms-thumb, .input-range:disabled:hover::-ms-thumb { + cursor: not-allowed; +} + +.input-range:disabled ~ .input-range__track, .input-range:disabled:hover ~ .input-range__track { + cursor: not-allowed; + background-color: #fafafa; +} + +.input-range:disabled ~ .input-range__progress, .input-range:disabled:hover ~ .input-range__progress { + cursor: not-allowed; + background-color: #dcdee1; +} + +.slider-thumb { + height: 10px; + width: 10px; + border: none; + background-color: white; + border-radius: 100%; + box-shadow: 0 0 0 2px rgba(33, 34, 36, 0.07); + cursor: pointer; + pointer-events: all; + position: relative; + z-index: 2; +} + +.slider-thumb--first { + margin-left: -16px; +} + +.slider-thumb--second { + margin-left: -32px; +} + +.input-range--first { + position: absolute; +} + +.input-range--second { + position: relative; +} + +.input-range__track, +.input-range__progress { + border-radius: 8px; + position: absolute; + height: 4px; + margin-top: -2px; + top: 50%; + z-index: 0; +} + +.input-range__track:hover, +.input-range__progress:hover { + cursor: pointer; +} + +.input-range__track { + background-color: #dcdee1; + left: 0; + right: 0; +} + +.input-range__track:hover { + cursor: pointer; +} + +.input-range__progress { + background-color: #00a4ff; +} + +.input-range-labels-container { + display: flex; + justify-content: space-between; +} + +.input-range-label { + font-size: 0.5rem; +} + +.input-range-label--current-value { + text-align: center; + flex: 2; +} + +.input-range-label:first-child { + text-align: left; +} + +.input-range-label:last-child { + text-align: right; +} \ No newline at end of file diff --git a/src/wrapper.js b/src/wrapper.js new file mode 100644 index 0000000..e2bd657 --- /dev/null +++ b/src/wrapper.js @@ -0,0 +1,62 @@ +const app = Elm.Main.init({ node: document.getElementById("elm") }); +const path = window.__TAURI__.path; +const fs = window.__TAURI__.fs; +const { invoke } = window.__TAURI__.core; + +// Get current directory path +app.ports.getCurrentDirectoryPath.subscribe(function () { + path + .homeDir() + .then((home) => { + app.ports.receiveCurrentDirectoryPath.send(home); + }) + .catch((error) => { + console.error(error); + app.ports.receiveError.send(error); + }); +}); + +async function getFileMetadata(directory, file) { + if (file.name.startsWith(".")) { + return null; + } + + const filePath = directory + "/" + file.name; + return await fs + .stat(filePath) + .then((metadata) => { + const value = { + IsDir: file.isDirectory, + Mode: metadata.mode, + ModTime: metadata.mtime.toISOString(), + Name: file.name, + DirPath: directory, + Size: metadata.size, + }; + return value; + }) + .catch((msg) => { + console.error(msg); + app.ports.receiveError.send(msg); + return null; + }); +} + +// Get source directory content +app.ports.getSourceDirectoryContent.subscribe(function (directoryName) { + fs.readDir(directoryName, { recursive: false }) + .then((files) => { + Promise.all( + files.map((file) => { + return getFileMetadata(directoryName, file); + }), + ).then((metadata) => { + const filteredMetadata = metadata.filter((m) => m != null); + app.ports.receiveSourceDirectoryContent.send(filteredMetadata); + }); + }) + .catch((msg) => { + console.error(msg); + app.ports.receiveError.send(msg); + }); +});